From 8598e67848a1269b12a742d487bc8a68fbc2820a Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 10 Nov 2025 16:38:37 +0100 Subject: [PATCH 01/10] Rework on dynawo model entities by using uuid Signed-off-by: Thang PHAM --- src/main/resources/models/DefaultBus.json | 21 + src/main/resources/models/GeneratorPQ.json | 73 + src/main/resources/models/GeneratorPV.json | 106 + .../GeneratorSynchronousFourWindings.json | 334 +++ ...usFourWindingsProportionalRegulations.json | 2217 +++++++++++++++++ .../GeneratorSynchronousThreeWindings.json | 316 +++ ...sThreeWindingsProportionalRegulations.json | 760 ++++++ src/main/resources/models/LoadAlphaBeta.json | 93 + src/main/resources/models/LoadPQ.json | 62 + .../models/OverloadManagementSystem.json | 130 + .../models/StaticVarCompensator.json | 253 ++ .../models/TapChangerBlockingAutomaton.json | 103 + src/main/resources/models/bearer.sh | 2 + src/main/resources/models/post_public.sh | 21 + .../resources/models/post_variables_public.sh | 12 + .../models/variables/GeneratorPQ.json | 21 + .../models/variables/GeneratorPV.json | 21 + .../variables/SynchronousGenerator.json | 60 + .../VoltageRegulatorProportional.json | 117 + src/test/resources/mappingIEEE14Test01.json | 6 +- 20 files changed, 4725 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/models/DefaultBus.json create mode 100644 src/main/resources/models/GeneratorPQ.json create mode 100644 src/main/resources/models/GeneratorPV.json create mode 100644 src/main/resources/models/GeneratorSynchronousFourWindings.json create mode 100644 src/main/resources/models/GeneratorSynchronousFourWindingsProportionalRegulations.json create mode 100644 src/main/resources/models/GeneratorSynchronousThreeWindings.json create mode 100644 src/main/resources/models/GeneratorSynchronousThreeWindingsProportionalRegulations.json create mode 100644 src/main/resources/models/LoadAlphaBeta.json create mode 100644 src/main/resources/models/LoadPQ.json create mode 100644 src/main/resources/models/OverloadManagementSystem.json create mode 100644 src/main/resources/models/StaticVarCompensator.json create mode 100644 src/main/resources/models/TapChangerBlockingAutomaton.json create mode 100644 src/main/resources/models/bearer.sh create mode 100755 src/main/resources/models/post_public.sh create mode 100755 src/main/resources/models/post_variables_public.sh create mode 100644 src/main/resources/models/variables/GeneratorPQ.json create mode 100644 src/main/resources/models/variables/GeneratorPV.json create mode 100644 src/main/resources/models/variables/SynchronousGenerator.json create mode 100644 src/main/resources/models/variables/VoltageRegulatorProportional.json diff --git a/src/main/resources/models/DefaultBus.json b/src/main/resources/models/DefaultBus.json new file mode 100644 index 0000000..67179c8 --- /dev/null +++ b/src/main/resources/models/DefaultBus.json @@ -0,0 +1,21 @@ +{ + "modelName": "DefaultBus", + "equipmentType": "BUS", + "variableDefinitions": [ + { + "name": "U_value", + "type": "DOUBLE", + "unit": "kV" + }, + { + "name": "Upu_value", + "type": "DOUBLE" + }, + { + "name": "phi_value", + "type": "DOUBLE", + "unit": "°" + } + ], + "defaultModel": "true" +} diff --git a/src/main/resources/models/GeneratorPQ.json b/src/main/resources/models/GeneratorPQ.json new file mode 100644 index 0000000..3f65034 --- /dev/null +++ b/src/main/resources/models/GeneratorPQ.json @@ -0,0 +1,73 @@ +{ + "modelName": "GeneratorPQ", + "equipmentType": "GENERATOR", + "parameterDefinitions": [ + { + "name": "generator_AlphaPuPNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "generator_PMax", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "pMax" + }, + { + "name": "generator_PMin", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "pMin" + }, + { + "name": "generator_PNom", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "pMax" + }, + { + "name": "generator_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "generator_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "generator_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + } + ], + "setsGroups": [ + { + "name": "GPQ", + "type": "FIXED", + "modelName": "GeneratorPQ", + "sets": [ + { + "name": "GPQ", + "parameters": [ + { + "name": "generator_AlphaPuPNom", + "value": "25" + } + ] + } + ] + } + ], + "variableDefinitions": [], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/GeneratorPV.json b/src/main/resources/models/GeneratorPV.json new file mode 100644 index 0000000..c065e43 --- /dev/null +++ b/src/main/resources/models/GeneratorPV.json @@ -0,0 +1,106 @@ +{ + "modelName": "GeneratorPV", + "equipmentType": "GENERATOR", + "parameterDefinitions": [ + { + "name": "generator_AlphaPuPNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_LambdaPuSNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "generator_PMax", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "pMax" + }, + { + "name": "generator_PMin", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "pMin" + }, + { + "name": "generator_PNom", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "pMax" + }, + { + "name": "generator_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "generator_QMax", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_QMin", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SNom", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "sNom" + }, + { + "name": "generator_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "generator_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + } + ], + "setsGroups": [ + { + "name": "GPV", + "type": "FIXED", + "modelName": "GeneratorPV", + "sets": [ + { + "name": "GPV", + "parameters": [ + { + "name": "generator_AlphaPuPNom", + "value": "20" + }, + { + "name": "generator_LambdaPuSNom", + "value": "0.01" + }, + { + "name": "generator_QMax", + "value": "35.1" + }, + { + "name": "generator_QMin", + "value": "-41" + } + ] + } + ] + } + ], + "variableDefinitions": [], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/GeneratorSynchronousFourWindings.json b/src/main/resources/models/GeneratorSynchronousFourWindings.json new file mode 100644 index 0000000..9d6ce95 --- /dev/null +++ b/src/main/resources/models/GeneratorSynchronousFourWindings.json @@ -0,0 +1,334 @@ +{ + "modelName": "GeneratorSynchronousFourWindings", + "equipmentType": "GENERATOR", + "parameterDefinitions": [ + { + "name": "generator_DPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_ExcitationPu", + "type": "INT", + "origin": "USER" + }, + { + "name": "generator_H", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_MdPuEfd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "generator_PNomAlt", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_PNomTurb", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "generator_RTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_RaPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SnTfo", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tpd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppq0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tpq0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "generator_UBaseHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UBaseLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + }, + { + "name": "generator_UseApproximation", + "type": "BOOL", + "origin": "USER" + }, + { + "name": "generator_XTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XlPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XpdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XpqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_md", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_mq", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nq", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "GSFW", + "type": "FIXED", + "modelName": "GeneratorSynchronousFourWindings", + "sets": [ + { + "name": "GSFW", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.4" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1090" + }, + { + "name": "generator_PNomTurb", + "value": "1090" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.002796" + }, + { + "name": "generator_SNom", + "value": "1211" + }, + { + "name": "generator_SnTfo", + "value": "1211" + }, + { + "name": "generator_Tpd0", + "value": "8.094" + }, + { + "name": "generator_Tppd0", + "value": "0.08" + }, + { + "name": "generator_Tppq0", + "value": "0.084" + }, + { + "name": "generator_Tpq0", + "value": "1.572" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "24" + }, + { + "name": "generator_UNom", + "value": "24" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "24" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.22" + }, + { + "name": "generator_XlPu", + "value": "0.202" + }, + { + "name": "generator_XpdPu", + "value": "0.384" + }, + { + "name": "generator_XppdPu", + "value": "0.264" + }, + { + "name": "generator_XppqPu", + "value": "0.262" + }, + { + "name": "generator_XpqPu", + "value": "0.393" + }, + { + "name": "generator_XqPu", + "value": "2.22" + }, + { + "name": "generator_md", + "value": "0.215" + }, + { + "name": "generator_mq", + "value": "0.215" + }, + { + "name": "generator_nd", + "value": "6.995" + }, + { + "name": "generator_nq", + "value": "6.995" + } + ] + } + ] + } + ], + "variableDefinitions": [], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/GeneratorSynchronousFourWindingsProportionalRegulations.json b/src/main/resources/models/GeneratorSynchronousFourWindingsProportionalRegulations.json new file mode 100644 index 0000000..91e1ff2 --- /dev/null +++ b/src/main/resources/models/GeneratorSynchronousFourWindingsProportionalRegulations.json @@ -0,0 +1,2217 @@ +{ + "modelName": "GeneratorSynchronousFourWindingsProportionalRegulations", + "equipmentType": "GENERATOR", + "parameterDefinitions": [ + { + "name": "generator_DPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_ExcitationPu", + "type": "INT", + "origin": "USER" + }, + { + "name": "generator_H", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_MdPuEfd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "generator_PNomAlt", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_PNomTurb", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "generator_RTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_RaPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SnTfo", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tpd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppq0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tpq0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "generator_UBaseHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UBaseLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + }, + { + "name": "generator_UseApproximation", + "type": "BOOL", + "origin": "USER" + }, + { + "name": "generator_XTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XlPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XpdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XpqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_md", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_mq", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nq", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_KGover", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_PMax", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_PMin", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_PNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_EfdMinPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_Gain", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_LagEfdMax", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_LagEfdMin", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "GSFWPR", + "type": "FIXED", + "modelName": "GeneratorSynchronousFourWindingsProportionalRegulations", + "sets": [ + { + "name": "GSFWPR", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.4" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1090" + }, + { + "name": "generator_PNomTurb", + "value": "1090" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.002796" + }, + { + "name": "generator_SNom", + "value": "1211" + }, + { + "name": "generator_SnTfo", + "value": "1211" + }, + { + "name": "generator_Tpd0", + "value": "8.094" + }, + { + "name": "generator_Tppd0", + "value": "0.08" + }, + { + "name": "generator_Tppq0", + "value": "0.084" + }, + { + "name": "generator_Tpq0", + "value": "1.572" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "24" + }, + { + "name": "generator_UNom", + "value": "24" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "24" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.22" + }, + { + "name": "generator_XlPu", + "value": "0.202" + }, + { + "name": "generator_XpdPu", + "value": "0.384" + }, + { + "name": "generator_XppdPu", + "value": "0.264" + }, + { + "name": "generator_XppqPu", + "value": "0.262" + }, + { + "name": "generator_XpqPu", + "value": "0.393" + }, + { + "name": "generator_XqPu", + "value": "2.22" + }, + { + "name": "generator_md", + "value": "0.215" + }, + { + "name": "generator_mq", + "value": "0.215" + }, + { + "name": "generator_nd", + "value": "6.995" + }, + { + "name": "generator_nq", + "value": "6.995" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1090" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1090" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.2" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + } + ] + }, + { + "name": "IEEE14", + "type": "PREFIX", + "modelName": "GeneratorSynchronousFourWindingsProportionalRegulations", + "sets": [ + { + "name": "IEEE14_GEN____1_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.4" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1090" + }, + { + "name": "generator_PNomTurb", + "value": "1090" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.002796" + }, + { + "name": "generator_SNom", + "value": "1211" + }, + { + "name": "generator_SnTfo", + "value": "1211" + }, + { + "name": "generator_Tpd0", + "value": "8.094" + }, + { + "name": "generator_Tppd0", + "value": "0.08" + }, + { + "name": "generator_Tppq0", + "value": "0.084" + }, + { + "name": "generator_Tpq0", + "value": "1.572" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "24" + }, + { + "name": "generator_UNom", + "value": "24" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "24" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.22" + }, + { + "name": "generator_XlPu", + "value": "0.202" + }, + { + "name": "generator_XpdPu", + "value": "0.384" + }, + { + "name": "generator_XppdPu", + "value": "0.264" + }, + { + "name": "generator_XppqPu", + "value": "0.262" + }, + { + "name": "generator_XpqPu", + "value": "0.393" + }, + { + "name": "generator_XqPu", + "value": "2.22" + }, + { + "name": "generator_md", + "value": "0.215" + }, + { + "name": "generator_mq", + "value": "0.215" + }, + { + "name": "generator_nd", + "value": "6.995" + }, + { + "name": "generator_nq", + "value": "6.995" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1090" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1090" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.2" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE14_GEN____2_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "6.3" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1008" + }, + { + "name": "generator_PNomTurb", + "value": "1008" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.00357" + }, + { + "name": "generator_SNom", + "value": "1120" + }, + { + "name": "generator_SnTfo", + "value": "1120" + }, + { + "name": "generator_Tpd0", + "value": "9.651" + }, + { + "name": "generator_Tppd0", + "value": "0.058" + }, + { + "name": "generator_Tppq0", + "value": "0.06" + }, + { + "name": "generator_Tpq0", + "value": "1.009" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "24" + }, + { + "name": "generator_UNom", + "value": "24" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "24" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.57" + }, + { + "name": "generator_XlPu", + "value": "0.219" + }, + { + "name": "generator_XpdPu", + "value": "0.407" + }, + { + "name": "generator_XppdPu", + "value": "0.3" + }, + { + "name": "generator_XppqPu", + "value": "0.301" + }, + { + "name": "generator_XpqPu", + "value": "0.454" + }, + { + "name": "generator_XqPu", + "value": "2.57" + }, + { + "name": "generator_md", + "value": "0.084" + }, + { + "name": "generator_mq", + "value": "0.084" + }, + { + "name": "generator_nd", + "value": "5.57" + }, + { + "name": "generator_nq", + "value": "5.57" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1008" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1008" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.2" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE14_GEN____3_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.625" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1485" + }, + { + "name": "generator_PNomTurb", + "value": "1485" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.00316" + }, + { + "name": "generator_SNom", + "value": "1650" + }, + { + "name": "generator_SnTfo", + "value": "1650" + }, + { + "name": "generator_Tpd0", + "value": "10.041" + }, + { + "name": "generator_Tppd0", + "value": "0.065" + }, + { + "name": "generator_Tppq0", + "value": "0.094" + }, + { + "name": "generator_Tpq0", + "value": "1.22" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "20" + }, + { + "name": "generator_UNom", + "value": "20" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "20" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.81" + }, + { + "name": "generator_XlPu", + "value": "0.256" + }, + { + "name": "generator_XpdPu", + "value": "0.509" + }, + { + "name": "generator_XppdPu", + "value": "0.354" + }, + { + "name": "generator_XppqPu", + "value": "0.377" + }, + { + "name": "generator_XpqPu", + "value": "0.601" + }, + { + "name": "generator_XqPu", + "value": "2.62" + }, + { + "name": "generator_md", + "value": "0.05" + }, + { + "name": "generator_mq", + "value": "0.05" + }, + { + "name": "generator_nd", + "value": "9.285" + }, + { + "name": "generator_nq", + "value": "9.285" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1485" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1485" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.2" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + } + ] + }, + { + "name": "IEEE57", + "type": "PREFIX", + "modelName": "GeneratorSynchronousFourWindingsProportionalRegulations", + "sets": [ + { + "name": "IEEE57_GEN____6_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.4000000000000004" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1008" + }, + { + "name": "generator_PNomTurb", + "value": "1008" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.00357" + }, + { + "name": "generator_SNom", + "value": "1120" + }, + { + "name": "generator_SnTfo", + "value": "1120" + }, + { + "name": "generator_Tpd0", + "value": "9.651" + }, + { + "name": "generator_Tppd0", + "value": "0.058" + }, + { + "name": "generator_Tppq0", + "value": "0.06" + }, + { + "name": "generator_Tpq0", + "value": "1.0009" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "24" + }, + { + "name": "generator_UNom", + "value": "24" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "24" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.57" + }, + { + "name": "generator_XlPu", + "value": "0.219" + }, + { + "name": "generator_XpdPu", + "value": "0.407" + }, + { + "name": "generator_XppdPu", + "value": "0.3" + }, + { + "name": "generator_XppqPu", + "value": "0.301" + }, + { + "name": "generator_XpqPu", + "value": "0.454" + }, + { + "name": "generator_XqPu", + "value": "2.57" + }, + { + "name": "generator_md", + "value": "0.084" + }, + { + "name": "generator_mq", + "value": "0.084" + }, + { + "name": "generator_nd", + "value": "5.57" + }, + { + "name": "generator_nq", + "value": "5.57" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1008" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1008" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.5" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE57_GEN____9_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.625" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1485" + }, + { + "name": "generator_PNomTurb", + "value": "1485" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.00316" + }, + { + "name": "generator_SNom", + "value": "1650" + }, + { + "name": "generator_SnTfo", + "value": "1650" + }, + { + "name": "generator_Tpd0", + "value": "10.041" + }, + { + "name": "generator_Tppd0", + "value": "0.065" + }, + { + "name": "generator_Tppq0", + "value": "0.094" + }, + { + "name": "generator_Tpq0", + "value": "1.21" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "20" + }, + { + "name": "generator_UNom", + "value": "20" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "20" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.81" + }, + { + "name": "generator_XlPu", + "value": "0.256" + }, + { + "name": "generator_XpdPu", + "value": "0.509" + }, + { + "name": "generator_XppdPu", + "value": "0.354" + }, + { + "name": "generator_XppqPu", + "value": "0.377" + }, + { + "name": "generator_XpqPu", + "value": "0.601" + }, + { + "name": "generator_XqPu", + "value": "2.62" + }, + { + "name": "generator_md", + "value": "0.05" + }, + { + "name": "generator_mq", + "value": "0.05" + }, + { + "name": "generator_nd", + "value": "9.285" + }, + { + "name": "generator_nq", + "value": "9.285" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1008" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1008" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.5" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE57_GEN____1_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.112" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1539" + }, + { + "name": "generator_PNomTurb", + "value": "1539" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.003275" + }, + { + "name": "generator_SNom", + "value": "1710" + }, + { + "name": "generator_SnTfo", + "value": "1710" + }, + { + "name": "generator_Tpd0", + "value": "10.041" + }, + { + "name": "generator_Tppd0", + "value": "0.065" + }, + { + "name": "generator_Tppq0", + "value": "0.094" + }, + { + "name": "generator_Tpq0", + "value": "1.22" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "20" + }, + { + "name": "generator_UNom", + "value": "20" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "20" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.91" + }, + { + "name": "generator_XlPu", + "value": "0.265" + }, + { + "name": "generator_XpdPu", + "value": "0.527" + }, + { + "name": "generator_XppdPu", + "value": "0.367" + }, + { + "name": "generator_XppqPu", + "value": "0.391" + }, + { + "name": "generator_XpqPu", + "value": "0.623" + }, + { + "name": "generator_XqPu", + "value": "2.72" + }, + { + "name": "generator_md", + "value": "0.05" + }, + { + "name": "generator_mq", + "value": "0.05" + }, + { + "name": "generator_nd", + "value": "9.285" + }, + { + "name": "generator_nq", + "value": "9.285" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1539" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1539" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.5" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE57_GEN____12_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.112" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1539" + }, + { + "name": "generator_PNomTurb", + "value": "1539" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.003275" + }, + { + "name": "generator_SNom", + "value": "1710" + }, + { + "name": "generator_SnTfo", + "value": "1710" + }, + { + "name": "generator_Tpd0", + "value": "10.041" + }, + { + "name": "generator_Tppd0", + "value": "0.065" + }, + { + "name": "generator_Tppq0", + "value": "0.094" + }, + { + "name": "generator_Tpq0", + "value": "1.22" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "20" + }, + { + "name": "generator_UNom", + "value": "20" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "20" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.91" + }, + { + "name": "generator_XlPu", + "value": "0.265" + }, + { + "name": "generator_XpdPu", + "value": "0.527" + }, + { + "name": "generator_XppdPu", + "value": "0.367" + }, + { + "name": "generator_XppqPu", + "value": "0.391" + }, + { + "name": "generator_XpqPu", + "value": "0.623" + }, + { + "name": "generator_XqPu", + "value": "2.72" + }, + { + "name": "generator_md", + "value": "0.05" + }, + { + "name": "generator_mq", + "value": "0.05" + }, + { + "name": "generator_nd", + "value": "9.285" + }, + { + "name": "generator_nq", + "value": "9.285" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1539" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1539" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.5" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE57_GEN____3_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.4" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1090" + }, + { + "name": "generator_PNomTurb", + "value": "1090" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.002796" + }, + { + "name": "generator_SNom", + "value": "1211" + }, + { + "name": "generator_SnTfo", + "value": "1211" + }, + { + "name": "generator_Tpd0", + "value": "8.094" + }, + { + "name": "generator_Tppd0", + "value": "0.08" + }, + { + "name": "generator_Tppq0", + "value": "0.084" + }, + { + "name": "generator_Tpq0", + "value": "1.572" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "24" + }, + { + "name": "generator_UNom", + "value": "24" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "24" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.22" + }, + { + "name": "generator_XlPu", + "value": "0.202" + }, + { + "name": "generator_XpdPu", + "value": "0.384" + }, + { + "name": "generator_XppdPu", + "value": "0.264" + }, + { + "name": "generator_XppqPu", + "value": "0.26" + }, + { + "name": "generator_XpqPu", + "value": "0.262" + }, + { + "name": "generator_XqPu", + "value": "2.22" + }, + { + "name": "generator_md", + "value": "0.215" + }, + { + "name": "generator_mq", + "value": "0.215" + }, + { + "name": "generator_nd", + "value": "6.995" + }, + { + "name": "generator_nq", + "value": "6.995" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1090" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1090" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.5" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE57_GEN____8_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.4" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1090" + }, + { + "name": "generator_PNomTurb", + "value": "1090" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.002796" + }, + { + "name": "generator_SNom", + "value": "1211" + }, + { + "name": "generator_SnTfo", + "value": "1211" + }, + { + "name": "generator_Tpd0", + "value": "8.094" + }, + { + "name": "generator_Tppd0", + "value": "0.08" + }, + { + "name": "generator_Tppq0", + "value": "0.084" + }, + { + "name": "generator_Tpq0", + "value": "1.572" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "24" + }, + { + "name": "generator_UNom", + "value": "24" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "24" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.22" + }, + { + "name": "generator_XlPu", + "value": "0.202" + }, + { + "name": "generator_XpdPu", + "value": "0.384" + }, + { + "name": "generator_XppdPu", + "value": "0.264" + }, + { + "name": "generator_XppqPu", + "value": "0.26" + }, + { + "name": "generator_XpqPu", + "value": "0.262" + }, + { + "name": "generator_XqPu", + "value": "2.22" + }, + { + "name": "generator_md", + "value": "0.215" + }, + { + "name": "generator_mq", + "value": "0.215" + }, + { + "name": "generator_nd", + "value": "6.995" + }, + { + "name": "generator_nq", + "value": "6.995" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1090" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1090" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.5" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE57_GEN____2_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "5.625" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "1485" + }, + { + "name": "generator_PNomTurb", + "value": "1485" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.00316" + }, + { + "name": "generator_SNom", + "value": "1650" + }, + { + "name": "generator_SnTfo", + "value": "1650" + }, + { + "name": "generator_Tpd0", + "value": "10.041" + }, + { + "name": "generator_Tppd0", + "value": "0.065" + }, + { + "name": "generator_Tppq0", + "value": "0.094" + }, + { + "name": "generator_Tpq0", + "value": "1.21" + }, + { + "name": "generator_UBaseHV", + "value": "69" + }, + { + "name": "generator_UBaseLV", + "value": "20" + }, + { + "name": "generator_UNom", + "value": "20" + }, + { + "name": "generator_UNomHV", + "value": "69" + }, + { + "name": "generator_UNomLV", + "value": "20" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "2.81" + }, + { + "name": "generator_XlPu", + "value": "0.256" + }, + { + "name": "generator_XpdPu", + "value": "0.509" + }, + { + "name": "generator_XppdPu", + "value": "0.354" + }, + { + "name": "generator_XppqPu", + "value": "0.377" + }, + { + "name": "generator_XpqPu", + "value": "0.601" + }, + { + "name": "generator_XqPu", + "value": "2.62" + }, + { + "name": "generator_md", + "value": "0.05" + }, + { + "name": "generator_mq", + "value": "0.05" + }, + { + "name": "generator_nd", + "value": "9.285" + }, + { + "name": "generator_nq", + "value": "9.285" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "1485" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "1485" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.5" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + } + ] + } + ], + "variableDefinitions": [], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/GeneratorSynchronousThreeWindings.json b/src/main/resources/models/GeneratorSynchronousThreeWindings.json new file mode 100644 index 0000000..8c5d88e --- /dev/null +++ b/src/main/resources/models/GeneratorSynchronousThreeWindings.json @@ -0,0 +1,316 @@ +{ + "modelName": "GeneratorSynchronousThreeWindings", + "equipmentType": "GENERATOR", + "parameterDefinitions": [ + { + "name": "generator_DPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_ExcitationPu", + "type": "INT", + "origin": "USER" + }, + { + "name": "generator_H", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_MdPuEfd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "generator_PNomAlt", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_PNomTurb", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "generator_RTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_RaPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SnTfo", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tpd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppq0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "generator_UBaseHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UBaseLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + }, + { + "name": "generator_UseApproximation", + "type": "BOOL", + "origin": "USER" + }, + { + "name": "generator_XTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XlPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XpdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_md", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_mq", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nq", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "GSTW", + "type": "FIXED", + "modelName": "GeneratorSynchronousThreeWindings", + "sets": [ + { + "name": "GSTW", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "4.975" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "74.4" + }, + { + "name": "generator_PNomTurb", + "value": "74.4" + }, + { + "name": "generator_RTfPu", + "value": "0" + }, + { + "name": "generator_RaPu", + "value": "0.004" + }, + { + "name": "generator_SNom", + "value": "80" + }, + { + "name": "generator_SnTfo", + "value": "80" + }, + { + "name": "generator_Tpd0", + "value": "3" + }, + { + "name": "generator_Tppd0", + "value": "0.04" + }, + { + "name": "generator_Tppq0", + "value": "0.04" + }, + { + "name": "generator_UBaseHV", + "value": "15" + }, + { + "name": "generator_UBaseLV", + "value": "15" + }, + { + "name": "generator_UNom", + "value": "15" + }, + { + "name": "generator_UNomHV", + "value": "15" + }, + { + "name": "generator_UNomLV", + "value": "15" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0" + }, + { + "name": "generator_XdPu", + "value": "0.75" + }, + { + "name": "generator_XlPu", + "value": "0.102" + }, + { + "name": "generator_XpdPu", + "value": "0.225" + }, + { + "name": "generator_XppdPu", + "value": "0.154" + }, + { + "name": "generator_XppqPu", + "value": "0.2" + }, + { + "name": "generator_XqPu", + "value": "0.45" + }, + { + "name": "generator_md", + "value": "0.16" + }, + { + "name": "generator_mq", + "value": "0.16" + }, + { + "name": "generator_nd", + "value": "5.7" + }, + { + "name": "generator_nq", + "value": "5.7" + } + ] + } + ] + } + ], + "variableDefinitions": [], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/GeneratorSynchronousThreeWindingsProportionalRegulations.json b/src/main/resources/models/GeneratorSynchronousThreeWindingsProportionalRegulations.json new file mode 100644 index 0000000..030adb9 --- /dev/null +++ b/src/main/resources/models/GeneratorSynchronousThreeWindingsProportionalRegulations.json @@ -0,0 +1,760 @@ +{ + "modelName": "GeneratorSynchronousThreeWindingsProportionalRegulations", + "equipmentType": "GENERATOR", + "parameterDefinitions": [ + { + "name": "generator_DPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_ExcitationPu", + "type": "INT", + "origin": "USER" + }, + { + "name": "generator_H", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_MdPuEfd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "generator_PNomAlt", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_PNomTurb", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "generator_RTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_RaPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_SnTfo", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tpd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppd0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_Tppq0", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "generator_UBaseHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UBaseLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomHV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UNomLV", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + }, + { + "name": "generator_UseApproximation", + "type": "BOOL", + "origin": "USER" + }, + { + "name": "generator_XTfPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XlPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XpdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppdPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XppqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_XqPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_md", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_mq", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nd", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "generator_nq", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_KGover", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_PMax", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_PMin", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "governor_PNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_EfdMinPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_Gain", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_LagEfdMax", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_LagEfdMin", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "GSTWPR", + "type": "FIXED", + "modelName": "GeneratorSynchronousThreeWindingsProportionalRegulations", + "sets": [ + { + "name": "GSTWPR", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "4.975" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "74.4" + }, + { + "name": "generator_PNomTurb", + "value": "74.4" + }, + { + "name": "generator_RTfPu", + "value": "0" + }, + { + "name": "generator_RaPu", + "value": "0.004" + }, + { + "name": "generator_SNom", + "value": "80" + }, + { + "name": "generator_SnTfo", + "value": "80" + }, + { + "name": "generator_Tpd0", + "value": "3" + }, + { + "name": "generator_Tppd0", + "value": "0.04" + }, + { + "name": "generator_Tppq0", + "value": "0.04" + }, + { + "name": "generator_UBaseHV", + "value": "15" + }, + { + "name": "generator_UBaseLV", + "value": "15" + }, + { + "name": "generator_UNom", + "value": "15" + }, + { + "name": "generator_UNomHV", + "value": "15" + }, + { + "name": "generator_UNomLV", + "value": "15" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0" + }, + { + "name": "generator_XdPu", + "value": "0.75" + }, + { + "name": "generator_XlPu", + "value": "0.102" + }, + { + "name": "generator_XpdPu", + "value": "0.225" + }, + { + "name": "generator_XppdPu", + "value": "0.154" + }, + { + "name": "generator_XppqPu", + "value": "0.2" + }, + { + "name": "generator_XqPu", + "value": "0.45" + }, + { + "name": "generator_md", + "value": "0.16" + }, + { + "name": "generator_mq", + "value": "0.16" + }, + { + "name": "generator_nd", + "value": "5.7" + }, + { + "name": "generator_nq", + "value": "5.7" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "74.4" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "74.4" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.2" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + } + ] + }, + { + "name": "IEEE14", + "type": "PREFIX", + "modelName": "GeneratorSynchronousThreeWindingsProportionalRegulations", + "sets": [ + { + "name": "IEEE14_GEN____6_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "4.975" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "74.4" + }, + { + "name": "generator_PNomTurb", + "value": "74.4" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.004" + }, + { + "name": "generator_SNom", + "value": "80" + }, + { + "name": "generator_SnTfo", + "value": "80" + }, + { + "name": "generator_Tpd0", + "value": "3" + }, + { + "name": "generator_Tppd0", + "value": "0.04" + }, + { + "name": "generator_Tppq0", + "value": "0.04" + }, + { + "name": "generator_UBaseHV", + "value": "15" + }, + { + "name": "generator_UBaseLV", + "value": "15" + }, + { + "name": "generator_UNom", + "value": "15" + }, + { + "name": "generator_UNomHV", + "value": "15" + }, + { + "name": "generator_UNomLV", + "value": "15" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.0" + }, + { + "name": "generator_XdPu", + "value": "0.75" + }, + { + "name": "generator_XlPu", + "value": "0.102" + }, + { + "name": "generator_XpdPu", + "value": "0.225" + }, + { + "name": "generator_XppdPu", + "value": "0.154" + }, + { + "name": "generator_XppqPu", + "value": "0.2" + }, + { + "name": "generator_XqPu", + "value": "0.45" + }, + { + "name": "generator_md", + "value": "0.16" + }, + { + "name": "generator_mq", + "value": "0.16" + }, + { + "name": "generator_nd", + "value": "5.7" + }, + { + "name": "generator_nq", + "value": "5.7" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "74.4" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "74.4" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.2" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + }, + { + "name": "IEEE14_GEN____8_SM", + "parameters": [ + { + "name": "generator_DPu", + "value": "0" + }, + { + "name": "generator_ExcitationPu", + "value": "1" + }, + { + "name": "generator_H", + "value": "2.748" + }, + { + "name": "generator_MdPuEfd", + "value": "0" + }, + { + "name": "generator_PNomAlt", + "value": "228" + }, + { + "name": "generator_PNomTurb", + "value": "228" + }, + { + "name": "generator_RTfPu", + "value": "0.0" + }, + { + "name": "generator_RaPu", + "value": "0.004" + }, + { + "name": "generator_SNom", + "value": "250" + }, + { + "name": "generator_SnTfo", + "value": "250" + }, + { + "name": "generator_Tpd0", + "value": "8.4" + }, + { + "name": "generator_Tppd0", + "value": "0.096" + }, + { + "name": "generator_Tppq0", + "value": "0.56" + }, + { + "name": "generator_UBaseHV", + "value": "13.8" + }, + { + "name": "generator_UBaseLV", + "value": "18" + }, + { + "name": "generator_UNom", + "value": "18" + }, + { + "name": "generator_UNomHV", + "value": "13.8" + }, + { + "name": "generator_UNomLV", + "value": "18" + }, + { + "name": "generator_UseApproximation", + "value": "true" + }, + { + "name": "generator_XTfPu", + "value": "0.1" + }, + { + "name": "generator_XdPu", + "value": "1.53" + }, + { + "name": "generator_XlPu", + "value": "0.11" + }, + { + "name": "generator_XpdPu", + "value": "0.31" + }, + { + "name": "generator_XppdPu", + "value": "0.275" + }, + { + "name": "generator_XppqPu", + "value": "0.58" + }, + { + "name": "generator_XqPu", + "value": "0.99" + }, + { + "name": "generator_md", + "value": "0" + }, + { + "name": "generator_mq", + "value": "0" + }, + { + "name": "generator_nd", + "value": "0" + }, + { + "name": "generator_nq", + "value": "0" + }, + { + "name": "governor_KGover", + "value": "5" + }, + { + "name": "governor_PMax", + "value": "228" + }, + { + "name": "governor_PMin", + "value": "0" + }, + { + "name": "governor_PNom", + "value": "228" + }, + { + "name": "voltageRegulator_EfdMaxPu", + "value": "5" + }, + { + "name": "voltageRegulator_EfdMinPu", + "value": "-5" + }, + { + "name": "voltageRegulator_Gain", + "value": "20" + }, + { + "name": "voltageRegulator_LagEfdMax", + "value": "0" + }, + { + "name": "voltageRegulator_LagEfdMin", + "value": "0" + }, + { + "name": "voltageRegulator_UsRefMaxPu", + "value": "1.2" + }, + { + "name": "voltageRegulator_UsRefMinPu", + "value": "0.8" + } + ] + } + ] + } + ], + "variableDefinitions": [], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/LoadAlphaBeta.json b/src/main/resources/models/LoadAlphaBeta.json new file mode 100644 index 0000000..6c2c128 --- /dev/null +++ b/src/main/resources/models/LoadAlphaBeta.json @@ -0,0 +1,93 @@ +{ + "modelName": "LoadAlphaBeta", + "equipmentType": "LOAD", + "parameterDefinitions": [ + { + "name": "load_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "load_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "load_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "load_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + }, + { + "name": "load_alpha", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "load_beta", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "LAB", + "type": "FIXED", + "modelName": "LoadAlphaBeta", + "sets": [ + { + "name": "LAB", + "parameters": [ + { + "name": "load_alpha", + "value": "1." + }, + { + "name": "load_beta", + "value": "2." + } + ] + } + ] + } + ], + "variableDefinitions": [ + { + "name": "load_running_value", + "type": "BOOL" + }, + { + "name": "load_PPu", + "type": "DOUBLE", + "unit": "MW", + "factor": "100" + }, + { + "name": "load_PRefPu", + "type": "DOUBLE", + "unit": "MW", + "factor": "100" + }, + { + "name": "load_QPu", + "type": "DOUBLE", + "unit": "Mvar", + "factor": "100" + }, + { + "name": "load_QRefPu", + "type": "DOUBLE", + "unit": "Mvar", + "factor": "100" + } + ], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/LoadPQ.json b/src/main/resources/models/LoadPQ.json new file mode 100644 index 0000000..26ce979 --- /dev/null +++ b/src/main/resources/models/LoadPQ.json @@ -0,0 +1,62 @@ +{ + "modelName": "LoadPQ", + "equipmentType": "LOAD", + "parameterDefinitions": [ + { + "name": "load_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "load_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "load_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "load_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + } + ], + "setsGroups": [], + "variableDefinitions": [ + { + "name": "load_running_value", + "type": "BOOL" + }, + { + "name": "load_PPu", + "type": "DOUBLE", + "unit": "MW", + "factor": "100" + }, + { + "name": "load_PRefPu", + "type": "DOUBLE", + "unit": "MW", + "factor": "100" + }, + { + "name": "load_QPu", + "type": "DOUBLE", + "unit": "Mvar", + "factor": "100" + }, + { + "name": "load_QRefPu", + "type": "DOUBLE", + "unit": "Mvar", + "factor": "100" + } + ], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/OverloadManagementSystem.json b/src/main/resources/models/OverloadManagementSystem.json new file mode 100644 index 0000000..0357ef1 --- /dev/null +++ b/src/main/resources/models/OverloadManagementSystem.json @@ -0,0 +1,130 @@ +{ + "modelName": "OverloadManagementSystem", + "equipmentType": "OVERLOAD_MANAGEMENT", + "parameterDefinitions": [ + { + "name": "currentLimitAutomaton_IMax", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "currentLimitAutomaton_OrderToEmit", + "type": "INT", + "origin": "USER" + }, + { + "name": "currentLimitAutomaton_Running", + "type": "BOOL", + "origin": "USER" + }, + { + "name": "currentLimitAutomaton_tLagBeforeActing", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "CLA", + "type": "FIXED", + "modelName": "OverloadManagementSystem", + "sets": [ + { + "name": "CLA", + "parameters": [ + { + "name": "currentLimitAutomaton_IMax", + "value": "1000" + }, + { + "name": "currentLimitAutomaton_OrderToEmit", + "value": "3" + }, + { + "name": "currentLimitAutomaton_Running", + "value": "true" + }, + { + "name": "currentLimitAutomaton_tLagBeforeActing", + "value": "10" + } + ] + } + ] + }, + { + "name": "CLA_2_4", + "type": "FIXED", + "modelName": "OverloadManagementSystem", + "sets": [ + { + "name": "CLA_2_4", + "parameters": [ + { + "name": "currentLimitAutomaton_IMax", + "value": "1000" + }, + { + "name": "currentLimitAutomaton_OrderToEmit", + "value": "3" + }, + { + "name": "currentLimitAutomaton_Running", + "value": "true" + }, + { + "name": "currentLimitAutomaton_tLagBeforeActing", + "value": "10" + } + ] + } + ] + }, + { + "name": "CLA_2_5", + "type": "FIXED", + "modelName": "OverloadManagementSystem", + "sets": [ + { + "name": "CLA_2_5", + "parameters": [ + { + "name": "currentLimitAutomaton_IMax", + "value": "600" + }, + { + "name": "currentLimitAutomaton_OrderToEmit", + "value": "1" + }, + { + "name": "currentLimitAutomaton_Running", + "value": "true" + }, + { + "name": "currentLimitAutomaton_tLagBeforeActing", + "value": "5" + } + ] + } + ] + } + ], + "variableDefinitions": [ + { + "name": "currentLimitAutomaton_IMonitored_value", + "type": "DOUBLE", + "unit": "kA" + }, + { + "name": "currentLimitAutomaton_tThresholdReached", + "type": "DOUBLE", + "unit": "s" + }, + { + "name": "currentLimitAutomaton_tOrder", + "type": "DOUBLE", + "unit": "s" + } + ], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/StaticVarCompensator.json b/src/main/resources/models/StaticVarCompensator.json new file mode 100644 index 0000000..4e24043 --- /dev/null +++ b/src/main/resources/models/StaticVarCompensator.json @@ -0,0 +1,253 @@ +{ + "modelName": "StaticVarCompensator", + "equipmentType": "STATIC_VAR_COMPENSATOR", + "parameterDefinitions": [ + { + "name": "SVarC_BMaxPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_BMinPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_BShuntPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_IMaxPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_IMinPu", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_KCurrentLimiter", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_Kp", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_Lambda", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_Mode0", + "type": "INT", + "origin": "NETWORK", + "originName": "regulatingMode" + }, + { + "name": "SVarC_P0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "p_pu" + }, + { + "name": "SVarC_Q0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "q_pu" + }, + { + "name": "SVarC_SNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_Ti", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_U0Pu", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "v_pu" + }, + { + "name": "SVarC_UBlock", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_UNom", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_UPhase0", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + }, + { + "name": "SVarC_URefDown", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_URefUp", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_UThresholdDown", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_UThresholdUp", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_UUnblockDown", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_UUnblockUp", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_tThresholdDown", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "SVarC_tThresholdUp", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "SVarC", + "type": "FIXED", + "modelName": "StaticVarCompensator", + "sets": [ + { + "name": "SVarC", + "parameters": [ + { + "name": "SVarC_BMaxPu", + "value": "1.0678" + }, + { + "name": "SVarC_BMinPu", + "value": "-1.0466" + }, + { + "name": "SVarC_BShuntPu", + "value": "0" + }, + { + "name": "SVarC_IMaxPu", + "value": "1" + }, + { + "name": "SVarC_IMinPu", + "value": "-1" + }, + { + "name": "SVarC_KCurrentLimiter", + "value": "8" + }, + { + "name": "SVarC_Kp", + "value": "1.75" + }, + { + "name": "SVarC_Lambda", + "value": "0.01" + }, + { + "name": "SVarC_SNom", + "value": "250" + }, + { + "name": "SVarC_Ti", + "value": "0.003428" + }, + { + "name": "SVarC_UBlock", + "value": "5" + }, + { + "name": "SVarC_UNom", + "value": "225" + }, + { + "name": "SVarC_URefDown", + "value": "220" + }, + { + "name": "SVarC_URefUp", + "value": "230" + }, + { + "name": "SVarC_UThresholdDown", + "value": "218" + }, + { + "name": "SVarC_UThresholdUp", + "value": "240" + }, + { + "name": "SVarC_UUnblockDown", + "value": "180" + }, + { + "name": "SVarC_UUnblockUp", + "value": "270" + }, + { + "name": "SVarC_tThresholdDown", + "value": "0" + }, + { + "name": "SVarC_tThresholdUp", + "value": "60" + } + ] + } + ] + } + ], + "variableDefinitions": [ + { + "name": "SVarC_injector_UPu", + "type": "DOUBLE" + }, + { + "name": "SVarC_injector_PInjPu", + "type": "DOUBLE" + }, + { + "name": "SVarC_injector_QInjPu", + "type": "DOUBLE" + }, + { + "name": "SVarC_injector_BPu", + "type": "DOUBLE" + }, + { + "name": "SVarC_modeHandling_mode_value", + "type": "INT" + } + ], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/TapChangerBlockingAutomaton.json b/src/main/resources/models/TapChangerBlockingAutomaton.json new file mode 100644 index 0000000..d737f2e --- /dev/null +++ b/src/main/resources/models/TapChangerBlockingAutomaton.json @@ -0,0 +1,103 @@ +{ + "modelName": "TapChangerBlockingAutomaton", + "equipmentType": "VOLTAGE", + "parameterDefinitions": [ + { + "name": "tapChangerBlocking_UMin", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "tapChangerBlocking_tLagBeforeBlocked", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "tapChangerBlocking_tLagTransBlockedD", + "type": "DOUBLE", + "origin": "USER" + }, + { + "name": "tapChangerBlocking_tLagTransBlockedT", + "type": "DOUBLE", + "origin": "USER" + } + ], + "setsGroups": [ + { + "name": "IEEE14_TCB_1", + "type": "FIXED", + "modelName": "TapChangerBlockingAutomaton", + "sets": [ + { + "name": "IEEE14_TCB_1", + "parameters": [ + { + "name": "tapChangerBlocking_UMin", + "value": "5" + }, + { + "name": "tapChangerBlocking_tLagBeforeBlocked", + "value": "0" + }, + { + "name": "tapChangerBlocking_tLagTransBlockedD", + "value": "0" + }, + { + "name": "tapChangerBlocking_tLagTransBlockedT", + "value": "0" + } + ] + } + ] + }, + { + "name": "IEEE14_TCB_2", + "type": "FIXED", + "modelName": "TapChangerBlockingAutomaton", + "sets": [ + { + "name": "IEEE14_TCB_2", + "parameters": [ + { + "name": "tapChangerBlocking_UMin", + "value": "50" + }, + { + "name": "tapChangerBlocking_tLagBeforeBlocked", + "value": "0" + }, + { + "name": "tapChangerBlocking_tLagTransBlockedD", + "value": "0" + }, + { + "name": "tapChangerBlocking_tLagTransBlockedT", + "value": "0" + } + ] + } + ] + } ], + "variableDefinitions": [ + { + "name": "tapChangerBlocking_UMonitored_value", + "type": "DOUBLE", + "unit": "kV" + }, + { + "name": "tapChangerBlocking_state", + "type": "INT" + }, + { + "name": "tapChangerBlocking_blockedD", + "type": "BOOL" + }, + { + "name": "tapChangerBlocking_blockedT", + "type": "BOOL" + } + ], + "variablesSets": [] +} \ No newline at end of file diff --git a/src/main/resources/models/bearer.sh b/src/main/resources/models/bearer.sh new file mode 100644 index 0000000..cb535e5 --- /dev/null +++ b/src/main/resources/models/bearer.sh @@ -0,0 +1,2 @@ +#!/bin/bash +bearer= \ No newline at end of file diff --git a/src/main/resources/models/post_public.sh b/src/main/resources/models/post_public.sh new file mode 100755 index 0000000..9facabd --- /dev/null +++ b/src/main/resources/models/post_public.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +source bearer.sh + +url="http://localhost:5036/models" + +for json in `ls -l *.json | awk '{print $(NF)}'`; do + curl -X 'POST' \ + "${url}/" \ + -H "authorization: Bearer ${bearer}" \ + -H 'Content-Type: application/json' \ + -d @${json} +done + +for json in `ls -l variables/*.json | awk '{print $(NF)}'`; do + curl -X 'POST' \ + "${url}/variables-sets" \ + -H "authorization: Bearer ${bearer}" \ + -H 'Content-Type: application/json' \ + -d @${json} +done diff --git a/src/main/resources/models/post_variables_public.sh b/src/main/resources/models/post_variables_public.sh new file mode 100755 index 0000000..bcb20ec --- /dev/null +++ b/src/main/resources/models/post_variables_public.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +source bearer.sh + +url="http://localhost:5036/models" + +curl -X 'PATCH' "${url}/GeneratorSynchronousThreeWindings/variables-sets/add" -H "authorization: Bearer ${bearer}" -H 'Content-Type: application/json' -d '["SynchronousGenerator"]' +curl -X 'PATCH' "${url}/GeneratorSynchronousFourWindings/variables-sets/add" -H "authorization: Bearer ${bearer}" -H 'Content-Type: application/json' -d '["SynchronousGenerator"]' +curl -X 'PATCH' "${url}/GeneratorSynchronousThreeWindingsProportionalRegulations/variables-sets/add" -H "authorization: Bearer ${bearer}" -H 'Content-Type: application/json' -d '["SynchronousGenerator", "VoltageRegulatorProportional"]' +curl -X 'PATCH' "${url}/GeneratorSynchronousFourWindingsProportionalRegulations/variables-sets/add" -H "authorization: Bearer ${bearer}" -H 'Content-Type: application/json' -d '["SynchronousGenerator", "VoltageRegulatorProportional"]' +curl -X 'PATCH' "${url}/GeneratorPQ/variables-sets/add" -H "authorization: Bearer ${bearer}" -H 'Content-Type: application/json' -d '["GeneratorPQ"]' +curl -X 'PATCH' "${url}/GeneratorPV/variables-sets/add" -H "authorization: Bearer ${bearer}" -H 'Content-Type: application/json' -d '["GeneratorPV"]' \ No newline at end of file diff --git a/src/main/resources/models/variables/GeneratorPQ.json b/src/main/resources/models/variables/GeneratorPQ.json new file mode 100644 index 0000000..b579428 --- /dev/null +++ b/src/main/resources/models/variables/GeneratorPQ.json @@ -0,0 +1,21 @@ +{ + "name": "GeneratorPQ", + "variableDefinitions": [ + { + "name": "generator_running_value", + "type": "BOOL" + }, + { + "name": "generator_QGenPu", + "type": "DOUBLE", + "unit": "Mvar", + "factor": "100" + }, + { + "name": "generator_PGenPu", + "type": "DOUBLE", + "unit": "MW", + "factor": "100" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/models/variables/GeneratorPV.json b/src/main/resources/models/variables/GeneratorPV.json new file mode 100644 index 0000000..9ded3b7 --- /dev/null +++ b/src/main/resources/models/variables/GeneratorPV.json @@ -0,0 +1,21 @@ +{ + "name": "GeneratorPV", + "variableDefinitions": [ + { + "name": "generator_running_value", + "type": "BOOL" + }, + { + "name": "generator_QGenPu", + "type": "DOUBLE", + "unit": "Mvar", + "factor": "100" + }, + { + "name": "generator_PGenPu", + "type": "DOUBLE", + "unit": "MW", + "factor": "100" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/models/variables/SynchronousGenerator.json b/src/main/resources/models/variables/SynchronousGenerator.json new file mode 100644 index 0000000..99caea2 --- /dev/null +++ b/src/main/resources/models/variables/SynchronousGenerator.json @@ -0,0 +1,60 @@ +{ + "name": "SynchronousGenerator", + "variableDefinitions": [ + { + "name": "generator_omegaPu_value", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "generator_PGen", + "type": "DOUBLE", + "unit": "MW" + }, + { + "name": "generator_QGen", + "type": "DOUBLE", + "unit": "Mvar" + }, + { + "name": "generator_UStatorPu_value", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "generator_QStatorPu_value", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "generator_IRotorPu_value", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "generator_thetaInternal_value", + "type": "DOUBLE", + "unit": "rad" + }, + { + "name": "generator_PmPu_value", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "generator_efdPu_value", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "generator_PePu", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "generator_theta", + "type": "DOUBLE", + "unit": "rad" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/models/variables/VoltageRegulatorProportional.json b/src/main/resources/models/variables/VoltageRegulatorProportional.json new file mode 100644 index 0000000..a60c7aa --- /dev/null +++ b/src/main/resources/models/variables/VoltageRegulatorProportional.json @@ -0,0 +1,117 @@ +{ + "name": "VoltageRegulatorProportional", + "variableDefinitions": [ + { + "name": "voltageRegulator_EfdPu", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "voltageRegulator_UsPu", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "voltageRegulator_UsRefPu", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "voltageRegulator_UsRefTotal_u1", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_UsRefTotal_u2", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_UsRefTotal_y", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_deltaUsRefPu", + "type": "DOUBLE", + "unit": "pu" + }, + { + "name": "voltageRegulator_feedback_u1", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_feedback_u2", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_feedback_y", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_gain_u", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_gain_y", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_limUsRef_simplifiedExpr", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_limUsRef_u", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_limUsRef_y", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_limitationDown_value", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limitationEfdMax", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limitationEfdMin", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limitationUp_value", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limitationUsRefMax", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limitationUsRefMin", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limiterWithLag_initSaturatedMax", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limiterWithLag_initSaturatedMin", + "type": "BOOL" + }, + { + "name": "voltageRegulator_limiterWithLag_tUMaxReached", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_limiterWithLag_tUMinReached", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_limiterWithLag_u", + "type": "DOUBLE" + }, + { + "name": "voltageRegulator_limiterWithLag_y", + "type": "DOUBLE" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/mappingIEEE14Test01.json b/src/test/resources/mappingIEEE14Test01.json index 56de87a..fed3202 100644 --- a/src/test/resources/mappingIEEE14Test01.json +++ b/src/test/resources/mappingIEEE14Test01.json @@ -60,7 +60,7 @@ { "equipmentType": "STATIC_VAR_COMPENSATOR", "mappedModel": "StaticVarCompensator", - "setGroup": "SVarCT", + "setGroup": "SVarC", "groupType": "FIXED", "filter": { "equipmentType": "STATIC_VAR_COMPENSATOR", @@ -137,7 +137,7 @@ { "family": "VOLTAGE", "model": "TapChangerBlockingAutomaton", - "setGroup": "TCB_2_4", + "setGroup": "IEEE14_TCB_1", "properties": [ { "name": "dynamicModelId", @@ -159,7 +159,7 @@ { "family": "VOLTAGE", "model": "TapChangerBlockingAutomaton", - "setGroup": "TCB_2_5", + "setGroup": "IEEE14_TCB_2", "properties": [ { "name": "dynamicModelId", From 0a395099a43169d395aa4214bdcef4b84acb7f1c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 17 Nov 2025 14:57:27 +0100 Subject: [PATCH 02/10] new annotations Signed-off-by: Thang PHAM --- .../mapping/server/dto/models/Model.java | 4 + .../server/dto/models/ModelParameter.java | 8 +- .../dto/models/ModelParameterDefinition.java | 5 ++ .../dto/models/ModelVariableDefinition.java | 5 ++ .../dto/models/ParametersSetsGroup.java | 5 +- .../server/dto/models/VariablesSet.java | 3 + .../mapping/server/model/ModelEntity.java | 12 ++- .../ModelModelParameterDefinitionEntity.java | 12 +-- .../ModelModelParameterDefinitionId.java | 7 +- .../model/ModelParameterDefinitionEntity.java | 16 +++- .../server/model/ModelParameterEntity.java | 41 +++------- .../server/model/ModelParameterSetEntity.java | 28 ++----- .../server/model/ModelSetsGroupEntity.java | 18 ++--- .../server/model/ModelSetsGroupId.java | 30 +------ .../model/ModelVariableDefinitionEntity.java | 15 ++-- .../server/model/ModelVariableSetEntity.java | 20 +++-- .../ModelParameterDefinitionRepository.java | 9 ++- .../repository/ModelParameterRepository.java | 5 +- .../ModelParameterSetRepository.java | 5 +- .../server/repository/ModelRepository.java | 11 ++- .../repository/ModelSetsGroupRepository.java | 5 +- .../repository/ModelVariableRepository.java | 9 ++- .../ModelVariablesSetRepository.java | 12 ++- .../implementation/MappingServiceImpl.java | 2 +- .../implementation/ModelServiceImpl.java | 80 +++++++++---------- .../implementation/ParameterServiceImpl.java | 2 +- .../mapping/server/utils/Methods.java | 2 +- .../mapping/server/utils/Operands.java | 28 ------- .../mapping/server/utils/PropertyUtils.java | 2 +- .../mapping/server/ModelControllerTest.java | 65 +++++++-------- .../server/ParameterControllerTest.java | 27 +++---- .../server/utils/PropertyUtilsTest.java | 7 +- 32 files changed, 249 insertions(+), 251 deletions(-) delete mode 100644 src/main/java/org/gridsuite/mapping/server/utils/Operands.java diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java b/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java index 4c1bc3b..6271379 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java @@ -14,6 +14,7 @@ import org.gridsuite.mapping.server.utils.ParameterOrigin; import java.util.List; +import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -25,6 +26,8 @@ @NoArgsConstructor public class Model { + private UUID id; + private String modelName; private EquipmentType equipmentType; @@ -40,6 +43,7 @@ public class Model { private List variablesSets; public Model(ModelEntity modelEntity) { + id = modelEntity.getId(); modelName = modelEntity.getModelName(); equipmentType = modelEntity.getEquipmentType(); defaultModel = modelEntity.isDefaultModel(); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java index 398487e..a8ffa4e 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java @@ -11,6 +11,8 @@ import lombok.NoArgsConstructor; import org.gridsuite.mapping.server.model.ModelParameterEntity; +import java.util.UUID; + /** * @author Mathieu Scalbert */ @@ -18,11 +20,13 @@ @AllArgsConstructor @NoArgsConstructor public class ModelParameter { + private UUID id; private String name; private String value; public ModelParameter(ModelParameterEntity modelParameterEntity) { - name = modelParameterEntity.getName(); - value = modelParameterEntity.getValue(); + this.id = modelParameterEntity.getId(); + this.name = modelParameterEntity.getName(); + this.value = modelParameterEntity.getValue(); } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java index 257f5b1..8b1ff69 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java @@ -13,6 +13,8 @@ import org.gridsuite.mapping.server.utils.ParameterOrigin; import org.gridsuite.mapping.server.utils.ParameterType; +import java.util.UUID; + /** * @author Mathieu Scalbert */ @@ -21,6 +23,8 @@ @AllArgsConstructor public class ModelParameterDefinition { + private UUID id; + private String name; private ParameterType type; @@ -32,6 +36,7 @@ public class ModelParameterDefinition { private String fixedValue; public ModelParameterDefinition(ModelParameterDefinitionEntity modelParameterDefinitionEntity, ParameterOrigin origin, String originName) { + this.id = modelParameterDefinitionEntity.getId(); this.name = modelParameterDefinitionEntity.getName(); this.type = modelParameterDefinitionEntity.getType(); this.origin = origin; diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelVariableDefinition.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelVariableDefinition.java index e453a6e..d7fcaa6 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelVariableDefinition.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelVariableDefinition.java @@ -13,6 +13,8 @@ import org.gridsuite.mapping.server.model.ModelVariableDefinitionEntity; import org.gridsuite.mapping.server.utils.VariableType; +import java.util.UUID; + /** * @author Thang PHAM */ @@ -21,6 +23,8 @@ @NoArgsConstructor public class ModelVariableDefinition { + private UUID id; + private String name; private VariableType type; @@ -30,6 +34,7 @@ public class ModelVariableDefinition { private Double factor; public ModelVariableDefinition(ModelVariableDefinitionEntity modelVariableDefinitionEntity) { + this.id = modelVariableDefinitionEntity.getId(); this.name = modelVariableDefinitionEntity.getName(); this.type = modelVariableDefinitionEntity.getType(); this.unit = modelVariableDefinitionEntity.getUnit(); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java index 2ccfe0f..6fb3717 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java @@ -13,6 +13,7 @@ import org.gridsuite.mapping.server.utils.SetGroupType; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -23,6 +24,8 @@ @NoArgsConstructor public class ParametersSetsGroup { + private UUID id; + private String name; private SetGroupType type; @@ -35,6 +38,6 @@ public ParametersSetsGroup(ModelSetsGroupEntity setsGroupEntity) { name = setsGroupEntity.getName(); type = setsGroupEntity.getType(); sets = setsGroupEntity.getSets().stream().map(ParametersSet::new).collect(Collectors.toList()); - modelName = setsGroupEntity.getModelName(); + modelName = setsGroupEntity.getModel().getModelName(); } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/VariablesSet.java b/src/main/java/org/gridsuite/mapping/server/dto/models/VariablesSet.java index b61fc6d..c66829d 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/VariablesSet.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/VariablesSet.java @@ -13,6 +13,7 @@ import org.gridsuite.mapping.server.model.ModelVariableSetEntity; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -22,10 +23,12 @@ @AllArgsConstructor @NoArgsConstructor public class VariablesSet { + private UUID id; private String name; private List variableDefinitions; public VariablesSet(ModelVariableSetEntity variableSetEntity) { + this.id = variableSetEntity.getId(); this.name = variableSetEntity.getName(); this.variableDefinitions = variableSetEntity.getVariableDefinitions().stream().map(ModelVariableDefinition::new).collect(Collectors.toList()); } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java index 5076032..60f74cc 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -6,6 +6,7 @@ */ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.*; import org.gridsuite.mapping.server.dto.models.Model; import org.gridsuite.mapping.server.utils.EquipmentType; @@ -13,7 +14,6 @@ import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; -import jakarta.persistence.*; import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; @@ -33,9 +33,12 @@ @Table(name = "models") public class ModelEntity implements Serializable { - // Could be replaced with UUID, but we lose the ease of use of names @Id + @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include + @Column(name = "id", columnDefinition = "UUID") + private UUID id; + @Column(name = "model_name") private String modelName; @@ -55,8 +58,8 @@ public class ModelEntity implements Serializable { @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @JoinTable( name = "models_model_variable_definitions", - joinColumns = {@JoinColumn(name = "model_name")}, - inverseJoinColumns = {@JoinColumn(name = "variable_definition_name")} + joinColumns = {@JoinColumn(name = "model_id", referencedColumnName = "id")}, + inverseJoinColumns = {@JoinColumn(name = "variable_definition_id", referencedColumnName = "id")} ) private Set variableDefinitions = LinkedHashSet.newLinkedHashSet(0); @@ -64,6 +67,7 @@ public class ModelEntity implements Serializable { private Set variableSets = LinkedHashSet.newLinkedHashSet(0); public ModelEntity(Model modelToConvert) { + id = modelToConvert.getId() == null ? UUID.randomUUID() : modelToConvert.getId(); modelName = modelToConvert.getModelName(); equipmentType = modelToConvert.getEquipmentType(); defaultModel = modelToConvert.isDefaultModel(); diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java index 9c24206..f02b25a 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java @@ -1,9 +1,9 @@ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.*; import org.gridsuite.mapping.server.utils.ParameterOrigin; -import jakarta.persistence.*; import java.io.Serializable; @EqualsAndHashCode(onlyExplicitlyIncluded = true) @@ -19,14 +19,14 @@ public class ModelModelParameterDefinitionEntity implements Serializable { @EqualsAndHashCode.Include @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "model_name") - @MapsId("modelName") + @JoinColumn(name = "model_id") + @MapsId("modelId") private ModelEntity model; @EqualsAndHashCode.Include @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinColumn(name = "parameter_definition_name") - @MapsId("parameterDefinitionName") + @JoinColumn(name = "parameter_definition_id") + @MapsId("parameterDefinitionId") private ModelParameterDefinitionEntity parameterDefinition; @Column(name = "origin") @@ -40,7 +40,7 @@ public ModelModelParameterDefinitionEntity(ModelEntity model, ModelParameterDefi this.parameterDefinition = parameterDefinition; this.origin = origin; this.originName = originName; - this.id = new ModelModelParameterDefinitionId(model.getModelName(), parameterDefinition.getName()); + this.id = new ModelModelParameterDefinitionId(model.getId(), parameterDefinition.getId()); } } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java index 4303008..3f19aee 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java @@ -1,9 +1,10 @@ package org.gridsuite.mapping.server.model; +import jakarta.persistence.Embeddable; import lombok.*; -import jakarta.persistence.Embeddable; import java.io.Serializable; +import java.util.UUID; @EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @@ -13,9 +14,9 @@ @Embeddable public class ModelModelParameterDefinitionId implements Serializable { @EqualsAndHashCode.Include - private String modelName; + private UUID modelId; @EqualsAndHashCode.Include - private String parameterDefinitionName; + private UUID parameterDefinitionId; } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java index 9b5eee2..02c7646 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -6,15 +6,18 @@ */ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.*; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.utils.ParameterType; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; -import jakarta.persistence.*; import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; import static jakarta.persistence.TemporalType.TIMESTAMP; @@ -31,8 +34,12 @@ public class ModelParameterDefinitionEntity implements Serializable { @Id + @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include - @Column(name = "name") + @Column(name = "id", columnDefinition = "UUID") + private UUID id; + + @Column(name = "name", unique = true, nullable = false) private String name; @Column(name = "type") @@ -46,7 +53,8 @@ public class ModelParameterDefinitionEntity implements Serializable { private List models = new ArrayList<>(); public ModelParameterDefinitionEntity(ModelParameterDefinition parameterDefinition) { - this(parameterDefinition.getName(), parameterDefinition.getType(), parameterDefinition.getFixedValue(), new ArrayList<>(), null, null); + this(parameterDefinition.getId() == null ? UUID.randomUUID() : parameterDefinition.getId(), + parameterDefinition.getName(), parameterDefinition.getType(), parameterDefinition.getFixedValue(), new ArrayList<>(), null, null); } @CreatedDate diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java index 9d76ecf..b6e6d31 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java @@ -6,15 +6,15 @@ */ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ModelParameter; -import org.gridsuite.mapping.server.utils.SetGroupType; -import jakarta.persistence.*; import java.io.Serializable; +import java.util.UUID; /** * @author Mathieu Scalbert @@ -26,48 +26,33 @@ @Setter @Entity @Table(name = "model_parameters", indexes = {@Index(name = "model_parameter_set_index", columnList = "set_name")}) -@IdClass(ModelParameterId.class) public class ModelParameterEntity implements Serializable { @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private UUID id; + @Column(name = "name") private String name; - @Id - @Column(name = "model_name") - private String modelName; - - @Id - @Column(name = "group_name") - private String groupName; - - @Id - @Column(name = "group_type") - private SetGroupType groupType; - - @Id - @Column(name = "set_name") - private String setName; + @Column(name = "set_id") + private UUID setId; @Column(name = "value_") private String value; @ManyToOne(fetch = FetchType.LAZY) @JoinColumns(foreignKey = @ForeignKey(name = "parameter_set_fk"), value = { - @JoinColumn(name = "set_name", referencedColumnName = "name", insertable = false, updatable = false), - @JoinColumn(name = "group_name", referencedColumnName = "group_name", insertable = false, updatable = false), - @JoinColumn(name = "model_name", referencedColumnName = "model_name", insertable = false, updatable = false), - @JoinColumn(name = "group_type", referencedColumnName = "group_type", insertable = false, updatable = false) + @JoinColumn(name = "set_id", referencedColumnName = "id", insertable = false, updatable = false) }) private ModelParameterSetEntity set; public ModelParameterEntity(ModelParameterSetEntity set, ModelParameter parameter) { + this.id = parameter.getId() == null ? UUID.randomUUID() : parameter.getId(); this.set = set; - name = parameter.getName(); - groupName = set.getGroup().getName(); - groupType = set.getGroup().getType(); - modelName = set.getGroup().getModelName(); - setName = set.getName(); - value = parameter.getValue(); + this.name = parameter.getName(); + this.setId = set.getId(); + this.value = parameter.getValue(); } } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java index 9c089b2..e95d46b 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -6,17 +6,17 @@ */ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ParametersSet; -import org.gridsuite.mapping.server.utils.SetGroupType; -import jakarta.persistence.*; import java.io.Serializable; import java.util.Date; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -29,25 +29,16 @@ @Setter @Entity @Table(name = "model_parameter_sets", indexes = {@Index(name = "model_parameter_sets_group_name_index", columnList = "group_name")}) -@IdClass(ModelParameterSetId.class) public class ModelParameterSetEntity implements Serializable { @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private UUID id; + @Column(name = "name") private String name; - @Id - @Column(name = "group_name") - private String groupName; - - @Id - @Column(name = "model_name") - private String modelName; - - @Id - @Column(name = "group_type") - private SetGroupType groupType; - @OneToMany(fetch = FetchType.LAZY, mappedBy = "set", cascade = CascadeType.ALL, orphanRemoval = true) private List parameters; @@ -56,18 +47,13 @@ public class ModelParameterSetEntity implements Serializable { @ManyToOne(fetch = FetchType.LAZY) @JoinColumns(foreignKey = @ForeignKey(name = "model_parameter_sets_fk"), value = { - @JoinColumn(name = "model_name", referencedColumnName = "model_name", insertable = false, updatable = false), - @JoinColumn(name = "group_name", referencedColumnName = "name", insertable = false, updatable = false), - @JoinColumn(name = "group_type", referencedColumnName = "type", insertable = false, updatable = false) + @JoinColumn(name = "group_id", referencedColumnName = "id", insertable = false, updatable = false) }) private ModelSetsGroupEntity group; public ModelParameterSetEntity(ModelSetsGroupEntity group, ParametersSet set) { this.group = group; this.name = set.getName(); - this.groupName = group.getName(); - this.groupType = group.getType(); - this.modelName = group.getModelName(); this.parameters = set.getParameters().stream().map(parameter -> new ModelParameterEntity(this, parameter)).collect(Collectors.toList()); this.lastModifiedDate = set.getLastModifiedDate(); } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java index 464de5b..255520c 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java @@ -6,6 +6,7 @@ */ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,10 +14,10 @@ import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; import org.gridsuite.mapping.server.utils.SetGroupType; -import jakarta.persistence.*; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -29,33 +30,30 @@ @Setter @Entity @Table(name = "model_sets_group", indexes = {@Index(name = "model_sets_group_model_name_index", columnList = "model_name")}) -@IdClass(ModelSetsGroupId.class) public class ModelSetsGroupEntity implements Serializable { @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private UUID id; + @Column(name = "name") private String name; - @Id - @Column(name = "model_name") - private String modelName; - @OneToMany(fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) private List sets = new ArrayList<>(0); - @Id @Column(name = "type") private SetGroupType type; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_sets_groups_fk")) - @MapsId("modelName") + @JoinColumn(name = "model_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_sets_groups_fk")) private ModelEntity model; public ModelSetsGroupEntity(ModelEntity model, ParametersSetsGroup group) { + this.id = group.getId() == null ? UUID.randomUUID() : group.getId(); this.model = model; this.name = group.getName(); - this.modelName = model.getModelName(); this.type = group.getType(); this.sets = group.getSets().stream().map(set -> new ModelParameterSetEntity(this, set)).collect(Collectors.toList()); } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java index 0eab1ff..cd9a751 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java @@ -6,19 +6,16 @@ */ package org.gridsuite.mapping.server.model; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import jakarta.persistence.Embeddable; +import lombok.*; import org.gridsuite.mapping.server.utils.SetGroupType; -import jakarta.persistence.Embeddable; import java.io.Serializable; -import java.util.Objects; /** * @author Mathieu Scalbert */ +@EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor @Embeddable @@ -28,27 +25,8 @@ public class ModelSetsGroupId implements Serializable { private String name; - private String modelName; + private String modelId; private SetGroupType type; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ModelSetsGroupId modelSetsGroupIdClass = (ModelSetsGroupId) o; - return name.equals(modelSetsGroupIdClass.name) && - modelName.equals(modelSetsGroupIdClass.modelName) && - type.equals(modelSetsGroupIdClass.type); - } - - @Override - public int hashCode() { - return Objects.hash(name, modelName, type); - } - } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java index 854b137..9da026b 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java @@ -7,13 +7,13 @@ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.*; import org.gridsuite.mapping.server.dto.models.ModelVariableDefinition; import org.gridsuite.mapping.server.utils.VariableType; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; -import jakarta.persistence.*; import java.io.Serializable; import java.util.*; @@ -30,9 +30,14 @@ @Entity @Table(name = "model_variable_definitions") public class ModelVariableDefinitionEntity implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include - @Column(name = "variable_definition_name") + @Column(name = "id") + private UUID id; + + @Column(name = "name") private String name; @Column(name = "type") @@ -57,9 +62,9 @@ public class ModelVariableDefinitionEntity implements Serializable { private Set variablesSets; public ModelVariableDefinitionEntity(ModelEntity model, ModelVariableSetEntity variablesSet, ModelVariableDefinition variableDefinition) { - this(variableDefinition.getName(), variableDefinition.getType(), variableDefinition.getUnit(), variableDefinition.getFactor(), - model != null ? new LinkedHashSet<>(Arrays.asList(model)) : new LinkedHashSet<>(), - new LinkedHashSet<>(Arrays.asList(variablesSet)), null, null); + this(variableDefinition.getId() == null ? UUID.randomUUID() : variableDefinition.getId(), variableDefinition.getName(), variableDefinition.getType(), variableDefinition.getUnit(), variableDefinition.getFactor(), + model != null ? new LinkedHashSet<>(List.of(model)) : new LinkedHashSet<>(), + new LinkedHashSet<>(List.of(variablesSet)), null, null); } @CreatedDate diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java index 6a76de3..6cf51c4 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java @@ -7,12 +7,12 @@ package org.gridsuite.mapping.server.model; +import jakarta.persistence.*; import lombok.*; import org.gridsuite.mapping.server.dto.models.VariablesSet; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; -import jakarta.persistence.*; import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; @@ -30,23 +30,28 @@ @Entity @Table(name = "model_variable_sets") public class ModelVariableSetEntity implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include - @Column(name = "variable_set_name") + @Column(name = "id") + private UUID id; + + @Column(name = "name") private String name; @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @JoinTable(name = "model_variable_sets_model_variable_definitions", - joinColumns = {@JoinColumn(name = "variable_set_name")}, - inverseJoinColumns = {@JoinColumn(name = "variable_definition_name")} + joinColumns = {@JoinColumn(name = "variable_set_id", referencedColumnName = "id")}, + inverseJoinColumns = {@JoinColumn(name = "variable_definition_id", referencedColumnName = "id")} ) private Set variableDefinitions = new LinkedHashSet<>(0); @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @JoinTable( name = "models_model_variable_sets", - joinColumns = {@JoinColumn(name = "variable_set_name")}, - inverseJoinColumns = {@JoinColumn(name = "model_name")} + joinColumns = {@JoinColumn(name = "variable_set_id", referencedColumnName = "id")}, + inverseJoinColumns = {@JoinColumn(name = "model_id", referencedColumnName = "id")} ) private Set models; @@ -61,7 +66,8 @@ public class ModelVariableSetEntity implements Serializable { private Date updatedDate; public ModelVariableSetEntity(ModelEntity model, VariablesSet variablesSet) { - this.models = model != null ? new LinkedHashSet<>(Arrays.asList(model)) : new LinkedHashSet<>(); + this.id = variablesSet.getId() == null ? UUID.randomUUID() : variablesSet.getId(); + this.models = model != null ? new LinkedHashSet<>(List.of(model)) : new LinkedHashSet<>(); this.name = variablesSet.getName(); this.variableDefinitions = variablesSet.getVariableDefinitions().stream().map(variableDefinition -> new ModelVariableDefinitionEntity(model, this, variableDefinition)).collect(Collectors.toSet()); } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java index 72b8c0a..0205851 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java @@ -4,6 +4,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Collection; +import java.util.List; +import java.util.UUID; + @Repository -public interface ModelParameterDefinitionRepository extends JpaRepository { +public interface ModelParameterDefinitionRepository extends JpaRepository { + List findAllByName(Collection names); + + void deleteAllByName(Collection names); } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterRepository.java index 6647ad9..2beccbd 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterRepository.java @@ -8,13 +8,14 @@ package org.gridsuite.mapping.server.repository; import org.gridsuite.mapping.server.model.ModelParameterEntity; -import org.gridsuite.mapping.server.model.ModelParameterId; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.UUID; + /** * @author Thang PHAM */ @Repository -public interface ModelParameterRepository extends JpaRepository { +public interface ModelParameterRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterSetRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterSetRepository.java index d0277bb..ee90b82 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterSetRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterSetRepository.java @@ -8,13 +8,14 @@ package org.gridsuite.mapping.server.repository; import org.gridsuite.mapping.server.model.ModelParameterSetEntity; -import org.gridsuite.mapping.server.model.ModelParameterSetId; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.UUID; + /** * @author Thang PHAM */ @Repository -public interface ModelParameterSetRepository extends JpaRepository { +public interface ModelParameterSetRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java index e20a7d4..b6499bb 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java @@ -10,12 +10,21 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Collection; import java.util.List; +import java.util.Optional; +import java.util.UUID; /** * @author Mathieu Scalbert */ @Repository -public interface ModelRepository extends JpaRepository { +public interface ModelRepository extends JpaRepository { List findAllByDefaultModelTrue(); + + Optional findByModelName(String modelName); + + List findAllByModelName(Collection modelNames); + + void deleteAllByModelName(Collection modelNames); } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelSetsGroupRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelSetsGroupRepository.java index 806f4ac..cc04010 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelSetsGroupRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelSetsGroupRepository.java @@ -8,13 +8,14 @@ package org.gridsuite.mapping.server.repository; import org.gridsuite.mapping.server.model.ModelSetsGroupEntity; -import org.gridsuite.mapping.server.model.ModelSetsGroupId; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.UUID; + /** * @author Thang PHAM */ @Repository -public interface ModelSetsGroupRepository extends JpaRepository { +public interface ModelSetsGroupRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java index 4c70c39..8eacab6 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java @@ -11,9 +11,16 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Collection; +import java.util.List; +import java.util.UUID; + /** * @author Thang PHAM */ @Repository -public interface ModelVariableRepository extends JpaRepository { +public interface ModelVariableRepository extends JpaRepository { + List findAllByName(Collection names); + + void deleteAllByName(Collection names); } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java index 9b7bdc1..7de659b 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java @@ -10,8 +10,18 @@ import org.gridsuite.mapping.server.model.ModelVariableSetEntity; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + /** * @author Thang PHAM */ -public interface ModelVariablesSetRepository extends JpaRepository { +public interface ModelVariablesSetRepository extends JpaRepository { + List findAllByName(Collection names); + + Optional findByName(String name); + + void deleteAllByName(Collection names); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java index 11d2397..d81250b 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java @@ -279,7 +279,7 @@ public List getMappedModelsList(String mappingName) { .collect(Collectors.toSet()); // get model by name from db, concat to default models and convert to dtos - return Stream.concat(modelRepository.findAllById(mappedModelNames).stream(), + return Stream.concat(modelRepository.findAllByModelName(mappedModelNames).stream(), modelRepository.findAllByDefaultModelTrue().stream()) .map(Model::new).toList(); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java index 48dbe1e..01f3f8f 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java @@ -198,7 +198,7 @@ public List getParametersSets() { @Override @Transactional(readOnly = true) public List getSetsFromGroup(String modelName, String groupName, SetGroupType groupType) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); @@ -213,7 +213,7 @@ public List getSetsFromGroup(String modelName, String groupName, @Override @Transactional public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersSetsGroup setsGroup, Boolean strict) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -248,7 +248,7 @@ public Model saveModel(Model model) { @Transactional public List deleteModels(List modelNames) { if (!CollectionUtils.isEmpty(modelNames)) { - List modelEntities = modelRepository.findAllById(modelNames); + List modelEntities = modelRepository.findAllByModelName(modelNames); List allParameterDefinitions = new ArrayList<>(); Set allVariableDefinitions = new HashSet<>(); Set allVariableSets = new HashSet<>(); @@ -277,19 +277,19 @@ public List deleteModels(List modelNames) { // --- Perform delete cascade manually --- // // delete model first - modelRepository.deleteAllById(modelNames); + modelRepository.deleteAllByModelName(modelNames); // delete all parameter definitions which are not referenced by any model List toDeleteParameterDefinitions = allParameterDefinitions.stream().filter(elem -> elem.getModels().isEmpty()).toList(); if (!CollectionUtils.isEmpty(toDeleteParameterDefinitions)) { - modelParameterDefinitionRepository.deleteAllById(toDeleteParameterDefinitions.stream() + modelParameterDefinitionRepository.deleteAllByName(toDeleteParameterDefinitions.stream() .map(ModelParameterDefinitionEntity::getName).toList()); } // delete all variable sets which are not referenced by any model List toDeleteVariableSets = allVariableSets.stream().filter(elem -> elem.getModels().isEmpty()).toList(); if (!CollectionUtils.isEmpty(toDeleteVariableSets)) { - modelVariablesSetRepository.deleteAllById(toDeleteVariableSets.stream() + modelVariablesSetRepository.deleteAllByName(toDeleteVariableSets.stream() .map(ModelVariableSetEntity::getName).toList()); } @@ -297,7 +297,7 @@ public List deleteModels(List modelNames) { List toDeleteVariableDefinitions = allVariableDefinitions.stream() .filter(elem -> elem.getModels().isEmpty() && elem.getVariablesSets().isEmpty()).toList(); if (!CollectionUtils.isEmpty(toDeleteVariableDefinitions)) { - modelVariableRepository.deleteAllById(toDeleteVariableDefinitions.stream() + modelVariableRepository.deleteAllByName(toDeleteVariableDefinitions.stream() .map(ModelVariableDefinitionEntity::getName).toList()); } } @@ -308,7 +308,7 @@ public List deleteModels(List modelNames) { @Override @Transactional public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGroupType groupType, String setName) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -340,14 +340,14 @@ public List getParameterDefinitionNames() { @Override @Transactional(readOnly = true) public List getParameterDefinitions(List parameterDefinitionNames) { - return modelParameterDefinitionRepository.findAllById(parameterDefinitionNames).stream() + return modelParameterDefinitionRepository.findAllByName(parameterDefinitionNames).stream() .map(parameterDefinitionEntity -> new ModelParameterDefinition(parameterDefinitionEntity, null, null)).toList(); } @Override @Transactional(readOnly = true) public List getParameterDefinitionsFromModel(String modelName) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); @@ -358,7 +358,7 @@ public List getParameterDefinitionsFromModel(String mo @Override @Transactional public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitions) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -377,14 +377,14 @@ public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitionNames, ParameterOrigin origin, String originName) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of parameter definitions if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { // find existing parameter definitions - List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); + List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllByName(parameterDefinitionNames); // check whether found all, fail fast if (foundParameterDefinitionEntities.size() != parameterDefinitionNames.size()) { @@ -408,14 +408,14 @@ public Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do remove in the list of parameter definitions if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { // find existing variable definitions - List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); + List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllByName(parameterDefinitionNames); // remove in existing list modelToUpdate.removeAllParameterDefinition(foundParameterDefinitionEntities); @@ -431,7 +431,7 @@ public Model removeExistingParameterDefinitionsFromModel(String modelName, List< @Override @Transactional public Model removeAllParameterDefinitionsOnModel(String modelName) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -463,7 +463,7 @@ public List saveNewParameterDefinitions(List deleteParameterDefinitions(List parameterDefinitionNames) { if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { - modelParameterDefinitionRepository.deleteAllById(parameterDefinitionNames); + modelParameterDefinitionRepository.deleteAllByName(parameterDefinitionNames); } return parameterDefinitionNames; } @@ -474,7 +474,7 @@ public List deleteParameterDefinitions(List parameterDefinitionN @Override @Transactional(readOnly = true) public List getVariableDefinitionsFromModel(String modelName) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); @@ -491,13 +491,13 @@ public List getVariableDefinitionNames() { @Transactional(readOnly = true) @Override public List getVariableDefinitions(List variableNames) { - return modelVariableRepository.findAllById(variableNames).stream().map(ModelVariableDefinition::new).toList(); + return modelVariableRepository.findAllByName(variableNames).stream().map(ModelVariableDefinition::new).toList(); } @Override @Transactional public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitions) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -519,14 +519,14 @@ public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variable definitions if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions - List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); + List foundVariableDefinitionEntities = modelVariableRepository.findAllByName(variableDefinitionNames); // check whether found all, fail fast if (foundVariableDefinitionEntities.size() != variableDefinitionNames.size()) { @@ -549,14 +549,14 @@ public Model addExistingVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do remove in the list of variable definitions if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions - List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); + List foundVariableDefinitionEntities = modelVariableRepository.findAllByName(variableDefinitionNames); // remove in existing list modelToUpdate.removeAllVariableDefinition(foundVariableDefinitionEntities); @@ -584,7 +584,7 @@ public List saveNewVariableDefinitions(List foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -606,13 +606,13 @@ public List getVariablesSetNames() { @Override @Transactional(readOnly = true) public List getVariablesSets(List variablesSetNames) { - return modelVariablesSetRepository.findAllById(variablesSetNames).stream().map(VariablesSet::new).toList(); + return modelVariablesSetRepository.findAllByName(variablesSetNames).stream().map(VariablesSet::new).toList(); } @Override @Transactional(readOnly = true) public List getVariablesSetsFromModel(String modelName) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); @@ -631,7 +631,7 @@ public VariablesSet saveNewVariablesSet(VariablesSet variableSet) { @Override @Transactional(readOnly = true) public List getVariableDefinitionsFromVariablesSet(String variableSetName) { - Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findByName(variableSetName); ModelVariableSetEntity variableSetEntity = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); @@ -642,7 +642,7 @@ public List getVariableDefinitionsFromVariablesSet(Stri @Override @Transactional public VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetName, List variableDefinitions) { - Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findByName(variableSetName); ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); @@ -662,13 +662,13 @@ public VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetNam @Override @Transactional public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String variableSetName, List variableDefinitionNames) { - Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findByName(variableSetName); ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions - List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); + List foundVariableDefinitionEntities = modelVariableRepository.findAllByName(variableDefinitionNames); // remove in existing list variableSetToUpdate.removeAllVariableDefinition(foundVariableDefinitionEntities); @@ -683,7 +683,7 @@ public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String vari @Override @Transactional public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSetName) { - Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findByName(variableSetName); ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); @@ -698,7 +698,7 @@ public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSet @Override @Transactional public Model addNewVariablesSetsToModel(String modelName, List variableSets) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -719,14 +719,14 @@ public Model addNewVariablesSetsToModel(String modelName, List var @Override @Transactional public Model addExistingVariablesSetsToModel(String modelName, List variablesSetNames) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set if (!CollectionUtils.isEmpty(variablesSetNames)) { // do merge with existing list - List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); + List foundVariablesSetEntities = modelVariablesSetRepository.findAllByName(variablesSetNames); // check whether found all if (foundVariablesSetEntities.size() != variablesSetNames.size()) { @@ -746,14 +746,14 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari @Override @Transactional public Model removeExistingVariablesSetsFromModel(String modelName, List variablesSetNames) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set if (!CollectionUtils.isEmpty(variablesSetNames)) { // remove from existing list - List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); + List foundVariablesSetEntities = modelVariablesSetRepository.findAllByName(variablesSetNames); modelToUpdate.removeAllVariablesSet(foundVariablesSetEntities); // save modified existing model entity @@ -766,7 +766,7 @@ public Model removeExistingVariablesSetsFromModel(String modelName, List @Override @Transactional public Model removeAllExistingVariablesSetsFromModel(String modelName) { - Optional foundModelOpt = modelRepository.findById(modelName); + Optional foundModelOpt = modelRepository.findByModelName(modelName); ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); @@ -782,7 +782,7 @@ public Model removeAllExistingVariablesSetsFromModel(String modelName) { @Transactional public List deleteVariableDefinitions(List variableDefinitionNames) { if (!CollectionUtils.isEmpty(variableDefinitionNames)) { - modelVariableRepository.deleteAllById(variableDefinitionNames); + modelVariableRepository.deleteAllByName(variableDefinitionNames); } return variableDefinitionNames; @@ -792,7 +792,7 @@ public List deleteVariableDefinitions(List variableDefinitionNam @Transactional public List deleteVariablesSets(List variablesSetNames) { if (!CollectionUtils.isEmpty(variablesSetNames)) { - modelVariablesSetRepository.deleteAllById(variablesSetNames); + modelVariablesSetRepository.deleteAllByName(variablesSetNames); } return variablesSetNames; diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ParameterServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ParameterServiceImpl.java index 76f6631..662524c 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ParameterServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ParameterServiceImpl.java @@ -84,7 +84,7 @@ public ParameterFile exportParameters(String mappingName) { } private List getEnrichedSetsFromInstanceModel(String modelName, String groupName) { - Optional model = modelRepository.findById(modelName); + Optional model = modelRepository.findByModelName(modelName); if (model.isPresent()) { ParametersSetsGroup correspondingGroup = new ParametersSetsGroup(model.get().getSetsGroups().stream() .filter(group -> group.getName().equals(groupName)) diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Methods.java b/src/main/java/org/gridsuite/mapping/server/utils/Methods.java index 531f444..48b53e1 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Methods.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Methods.java @@ -55,7 +55,7 @@ public static String convertNumberListToString(List array) { } public static ParametersSetsGroup getSetsGroupFromModel(String modelName, String setGroupName, ModelRepository modelRepository) { - Optional foundModel = modelRepository.findById(modelName); + Optional foundModel = modelRepository.findByModelName(modelName); if (foundModel.isPresent()) { return new ParametersSetsGroup(foundModel.get().getSetsGroups().stream().filter(setGroup -> setGroup.getName().equals(setGroupName)) .findAny().orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No sets group associated to the model " + diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Operands.java b/src/main/java/org/gridsuite/mapping/server/utils/Operands.java deleted file mode 100644 index 9c31b03..0000000 --- a/src/main/java/org/gridsuite/mapping/server/utils/Operands.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.mapping.server.utils; - -/** - * @author Mathieu Scalbert - */ -public enum Operands { - // Common - EQUALS, - NOT_EQUALS, - // Number - LOWER, - LOWER_OR_EQUALS, - HIGHER_OR_EQUALS, - HIGHER, - // String - INCLUDES, - STARTS_WITH, - ENDS_WITH, - // Enum - IN, - NOT_IN -} diff --git a/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java b/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java index 8dc68a9..a942fc8 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java @@ -16,7 +16,7 @@ import java.util.Arrays; /** - * This class is must be identical to one on study-server + * This class must be identical to one on study-server * @author Jacques Borsenberger (), new ArrayList<>(), Set.of(), Set.of(), null, null); List definitions = new ArrayList<>(); @@ -182,7 +182,7 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isNotFound()); - Date setCreationDate = modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); + Date setCreationDate = modelRepository.findByModelName(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); // Update data mvc.perform(post("/models/" + modelName + "/parameters/sets/strict") @@ -190,7 +190,7 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()); - Date setUpdateDate = modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); + Date setUpdateDate = modelRepository.findByModelName(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); assertThat(setCreationDate.compareTo(setUpdateDate) < 0); } @@ -282,17 +282,14 @@ public void invalidTest() throws Exception { public void getTest() throws Exception { // Prepare models - ModelEntity loadModel = modelRepository.findById("LoadAlphaBeta").get(); + ModelEntity loadModel = modelRepository.findByModelName("LoadAlphaBeta").get(); List loadGroups = loadModel.getSetsGroups(); - ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", loadModel.getModelName(), null, SetGroupType.FIXED, loadModel); + ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity(UUID.randomUUID(), "LAB", null, SetGroupType.FIXED, loadModel); ArrayList groupSets = new ArrayList<>(); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", loadGroup.getName(), loadModel.getModelName(), loadGroup.getType(), - null, - new Date(), - loadGroup); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity(UUID.randomUUID(), "LAB", null, new Date(), loadGroup); ArrayList setParameters = new ArrayList<>(); - setParameters.add(new ModelParameterEntity("load_alpha", loadGroup.getModelName(), loadGroup.getName(), loadGroup.getType(), setToSave.getName(), "1.5", setToSave)); - setParameters.add(new ModelParameterEntity("load_beta", loadGroup.getModelName(), loadGroup.getName(), loadGroup.getType(), setToSave.getName(), "2.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_alpha", setToSave.getId(), "1.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_beta", setToSave.getId(), "2.5", setToSave)); setToSave.setParameters(setParameters); groupSets.add(setToSave); loadGroup.setSets(groupSets); @@ -300,9 +297,9 @@ public void getTest() throws Exception { loadModel.setSetsGroups(loadGroups); modelRepository.save(loadModel); - ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, false, List.of(), null, Set.of(), Set.of(), null, null); + ModelEntity generatorThreeModel = new ModelEntity(UUID.randomUUID(), "GeneratorThreeWindings", EquipmentType.GENERATOR, false, List.of(), null, Set.of(), Set.of(), null, null); ArrayList generatorThreeGroups = new ArrayList<>(); - generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", generatorThreeModel.getModelName(), new ArrayList<>(), SetGroupType.PREFIX, generatorThreeModel)); + generatorThreeGroups.add(new ModelSetsGroupEntity(UUID.randomUUID(), "GSTWPR", new ArrayList<>(), SetGroupType.PREFIX, generatorThreeModel)); generatorThreeModel.setSetsGroups(generatorThreeGroups); modelRepository.save(generatorThreeModel); @@ -837,7 +834,7 @@ public void testSaveGeneratorModel() throws Exception { .andExpect(status().isOk()); // Get Data - ModelEntity savedModel = modelRepository.findById(modelName).orElseThrow(); + ModelEntity savedModel = modelRepository.findByModelName(modelName).orElseThrow(); // sanity check assertEquals(modelName, savedModel.getModelName()); @@ -1096,21 +1093,21 @@ public void testDeleteLoadModelsWhichShareParameterDefinitionsAndVariableDefinit // --- Check result --- // // model LOAD ALPHA BETA must be not exist in db - Optional foundNoneExistingModelOpt = modelRepository.findById(loadAlphaBetaModelName); + Optional foundNoneExistingModelOpt = modelRepository.findByModelName(loadAlphaBetaModelName); assertEquals(false, foundNoneExistingModelOpt.isPresent()); // must delete only 2 parameter definitions which are only used by load alpha beta // the rest 4 shared parameter definitions must be always present in db - List foundNoneExistingParameterDefinitions = modelParameterDefinitionRepository.findAllById(List.of("load_alpha", "load_beta")); + List foundNoneExistingParameterDefinitions = modelParameterDefinitionRepository.findAllByName(List.of("load_alpha", "load_beta")); assertEquals(0, foundNoneExistingParameterDefinitions.size()); - List foundExistingParameterDefinitions = modelParameterDefinitionRepository.findAllById(List.of("load_P0Pu", "load_Q0Pu", "load_U0Pu", "load_UPhase0")); + List foundExistingParameterDefinitions = modelParameterDefinitionRepository.findAllByName(List.of("load_P0Pu", "load_Q0Pu", "load_U0Pu", "load_UPhase0")); assertEquals(4, foundExistingParameterDefinitions.size()); // must delete only 2 variable definitions which are only used by load alpha beta // the rest 3 shared variable definitions must be always present in db - List foundNoneExistingVariableDefinitions = modelVariableRepository.findAllById(List.of("load_PRefPu", "load_running_value")); + List foundNoneExistingVariableDefinitions = modelVariableRepository.findAllByName(List.of("load_PRefPu", "load_running_value")); assertEquals(0, foundNoneExistingVariableDefinitions.size()); - List foundExistingVariableDefinitions = modelVariableRepository.findAllById(List.of("load_PPu", "load_QPu", "load_QRefPu")); + List foundExistingVariableDefinitions = modelVariableRepository.findAllByName(List.of("load_PPu", "load_QPu", "load_QRefPu")); assertEquals(3, foundExistingVariableDefinitions.size()); // --- Delete LOAD PQ --- // @@ -1121,7 +1118,7 @@ public void testDeleteLoadModelsWhichShareParameterDefinitionsAndVariableDefinit // --- Check result --- // // model LOAD PQ must be not exist in db - foundNoneExistingModelOpt = modelRepository.findById(loadPQModelName); + foundNoneExistingModelOpt = modelRepository.findByModelName(loadPQModelName); assertEquals(false, foundNoneExistingModelOpt.isPresent()); // db must not contain any parameter definition @@ -1146,7 +1143,7 @@ public void testDeleteGeneratorModelsWithVariableSets() throws Exception { // --- Check result --- // // This model has two variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllById(List.of("Generator", "VoltageRegulator")); + List variableSets = modelVariablesSetRepository.findAllByName(List.of("Generator", "VoltageRegulator")); assertEquals(2, variableSets.size()); // Variable set Generator contains 4 variable definitions and VoltageRegulator contains 1 variable definition => total = 5 assertEquals(5, modelVariableRepository.findAll().size()); @@ -1159,7 +1156,7 @@ public void testDeleteGeneratorModelsWithVariableSets() throws Exception { // --- Check result --- // // model generator model must be not exist in db - Optional foundNoneExistingModelOpt = modelRepository.findById(generatorModelName); + Optional foundNoneExistingModelOpt = modelRepository.findByModelName(generatorModelName); assertEquals(false, foundNoneExistingModelOpt.isPresent()); // db must not contain any variable set @@ -1191,7 +1188,7 @@ public void testDeleteGeneratorModelsWhichShareVariableSets() throws Exception { // --- Check result --- // // These models have two shared variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllById(List.of("Generator", "VoltageRegulator")); + List variableSets = modelVariablesSetRepository.findAllByName(List.of("Generator", "VoltageRegulator")); assertEquals(2, variableSets.size()); // Variable set Generator contains 4 variable definitions and VoltageRegulator contains 1 variable definition => total = 5 assertEquals(5, modelVariableRepository.findAll().size()); @@ -1204,11 +1201,11 @@ public void testDeleteGeneratorModelsWhichShareVariableSets() throws Exception { // --- Check result --- // // model Three Windings Generator must be not exist in db - Optional foundNoneExistingModelOpt = modelRepository.findById(generatorModelThreeWindingsName); + Optional foundNoneExistingModelOpt = modelRepository.findByModelName(generatorModelThreeWindingsName); assertEquals(false, foundNoneExistingModelOpt.isPresent()); // These models have two shared variable sets => after delete one model, shared shared variable sets must be always in db - variableSets = modelVariablesSetRepository.findAllById(List.of("Generator", "VoltageRegulator")); + variableSets = modelVariablesSetRepository.findAllByName(List.of("Generator", "VoltageRegulator")); assertEquals(2, variableSets.size()); // Variable set Generator contains 4 variable definitions and VoltageRegulator contains 1 variable definition => total = 5 assertEquals(5, modelVariableRepository.findAll().size()); @@ -1221,7 +1218,7 @@ public void testDeleteGeneratorModelsWhichShareVariableSets() throws Exception { // --- Check result --- // // model Three Windings Generator must be not exist in db - foundNoneExistingModelOpt = modelRepository.findById(generatorModelFourWindingsName); + foundNoneExistingModelOpt = modelRepository.findByModelName(generatorModelFourWindingsName); assertEquals(false, foundNoneExistingModelOpt.isPresent()); // the last model which uses shared variable sets has been deleted @@ -1255,7 +1252,7 @@ public void testDeleteGeneratorModelsWhichShareVariableDefinitionsBetweenDiffere // --- Check result --- // // These models have two shared 3 variables definitions between 2 different variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllById(List.of("GeneratorPQ", "GeneratorPV")); + List variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPQ", "GeneratorPV")); assertEquals(2, variableSets.size()); // Variable set GeneratorPQ and GeneratorPV share 3 variable definitions assertEquals(3, modelVariableRepository.findAll().size()); @@ -1268,11 +1265,11 @@ public void testDeleteGeneratorModelsWhichShareVariableDefinitionsBetweenDiffere // --- Check result --- // // model Generator PQ must be not exist in db - Optional foundNoneExistingModelOpt = modelRepository.findById(generatorPQModelName); + Optional foundNoneExistingModelOpt = modelRepository.findByModelName(generatorPQModelName); assertEquals(false, foundNoneExistingModelOpt.isPresent()); // Variable set Generator PQ must be not exist in db - variableSets = modelVariablesSetRepository.findAllById(List.of("GeneratorPQ")); + variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPQ")); assertEquals(0, variableSets.size()); // 3 variable definitions used by variable set GeneratorPV must be always present in db assertEquals(3, modelVariableRepository.findAll().size()); @@ -1284,7 +1281,7 @@ public void testDeleteGeneratorModelsWhichShareVariableDefinitionsBetweenDiffere .andExpect(status().isOk()).andReturn(); // Variable set Generator PV must be not exist in db - variableSets = modelVariablesSetRepository.findAllById(List.of("GeneratorPV")); + variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPV")); assertEquals(0, variableSets.size()); // 3 variable definitions used by variable set GeneratorPV must be not exist in db assertEquals(0, modelVariableRepository.findAll().size()); @@ -1313,7 +1310,7 @@ public void testDeleteAllGeneratorModelsWhichShareVariableDefinitionsBetweenDiff // --- Check result --- // // These models have two shared 3 variables definitions between 2 different variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllById(List.of("GeneratorPQ", "GeneratorPV")); + List variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPQ", "GeneratorPV")); assertEquals(2, variableSets.size()); // Variable set GeneratorPQ and GeneratorPV share 3 variable definitions assertEquals(3, modelVariableRepository.findAll().size()); @@ -1326,11 +1323,11 @@ public void testDeleteAllGeneratorModelsWhichShareVariableDefinitionsBetweenDiff // --- Check result --- // // model Generator PQ/PV must be not exist in db - List modelEntities = modelRepository.findAllById(List.of(generatorPQModelName, generatorPVModelName)); + List modelEntities = modelRepository.findAllByModelName(List.of(generatorPQModelName, generatorPVModelName)); assertEquals(0, modelEntities.size()); // Variable set Generator PQ/PV must be not exist in db - variableSets = modelVariablesSetRepository.findAllById(List.of("GeneratorPV", "GeneratorPQ")); + variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPV", "GeneratorPQ")); assertEquals(0, variableSets.size()); // 3 variable definitions used by variable sets GeneratorPQ/PV must be not exist in db assertEquals(0, modelVariableRepository.findAll().size()); diff --git a/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java index a8a56a7..43c8ed6 100644 --- a/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java @@ -69,7 +69,7 @@ private void cleanDB() { } private ModelParameterDefinitionEntity createDefinitionEntity(String name, ParameterType type) { - return new ModelParameterDefinitionEntity(new ModelParameterDefinition(name, type, null, null, null)); + return new ModelParameterDefinitionEntity(new ModelParameterDefinition(UUID.randomUUID(), name, type, null, null, null)); } @Before @@ -78,17 +78,14 @@ public void setUp() { cleanDB(); // Prepare models - ModelEntity loadModel = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, false, new ArrayList<>(), null, Set.of(), Set.of(), null, null); + ModelEntity loadModel = new ModelEntity(UUID.randomUUID(), "LoadAlphaBeta", EquipmentType.LOAD, false, new ArrayList<>(), null, Set.of(), Set.of(), null, null); ArrayList loadGroups = new ArrayList<>(); - ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", loadModel.getModelName(), null, SetGroupType.FIXED, loadModel); + ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity(UUID.randomUUID(), "LAB", null, SetGroupType.FIXED, loadModel); ArrayList groupSets = new ArrayList<>(); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", loadGroup.getName(), loadModel.getModelName(), loadGroup.getType(), - null, - new Date(), - loadGroup); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity(UUID.randomUUID(), "LAB", null, new Date(), loadGroup); ArrayList setParameters = new ArrayList<>(); - setParameters.add(new ModelParameterEntity("load_alpha", loadGroup.getModelName(), loadGroup.getName(), loadGroup.getType(), setToSave.getName(), "1.5", setToSave)); - setParameters.add(new ModelParameterEntity("load_beta", loadGroup.getModelName(), loadGroup.getName(), loadGroup.getType(), setToSave.getName(), "2.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_alpha", setToSave.getId(), "1.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_beta", setToSave.getId(), "2.5", setToSave)); setToSave.setParameters(setParameters); groupSets.add(setToSave); loadGroup.setSets(groupSets); @@ -112,21 +109,21 @@ public void setUp() { modelRepository.save(loadModel); - ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, false, null, null, null, null, null, null); + ModelEntity generatorThreeModel = new ModelEntity(UUID.randomUUID(), "GeneratorThreeWindings", EquipmentType.GENERATOR, false, null, null, null, null, null, null); ArrayList generatorThreeGroups = new ArrayList<>(); - generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", generatorThreeModel.getModelName(), null, SetGroupType.PREFIX, generatorThreeModel)); + generatorThreeGroups.add(new ModelSetsGroupEntity(UUID.randomUUID(), "GSTWPR", null, SetGroupType.PREFIX, generatorThreeModel)); generatorThreeModel.setSetsGroups(generatorThreeGroups); modelRepository.save(generatorThreeModel); - ModelEntity generatorFourModel = new ModelEntity("GeneratorFourWindings", EquipmentType.GENERATOR, false, null, null, null, null, null, null); + ModelEntity generatorFourModel = new ModelEntity(UUID.randomUUID(), "GeneratorFourWindings", EquipmentType.GENERATOR, false, null, null, null, null, null, null); ArrayList generatorFourGroups = new ArrayList<>(); - generatorFourGroups.add(new ModelSetsGroupEntity("GSFWPR", generatorFourModel.getModelName(), null, SetGroupType.PREFIX, generatorFourModel)); + generatorFourGroups.add(new ModelSetsGroupEntity(UUID.randomUUID(), "GSFWPR", null, SetGroupType.PREFIX, generatorFourModel)); generatorFourModel.setSetsGroups(generatorFourGroups); modelRepository.save(generatorFourModel); - ModelEntity sVarModel = new ModelEntity("StaticVarCompensator", EquipmentType.STATIC_VAR_COMPENSATOR, false, null, null, null, null, null, null); + ModelEntity sVarModel = new ModelEntity(UUID.randomUUID(), "StaticVarCompensator", EquipmentType.STATIC_VAR_COMPENSATOR, false, null, null, null, null, null, null); ArrayList sVarModelGroups = new ArrayList<>(); - sVarModelGroups.add(new ModelSetsGroupEntity("SVarC", sVarModel.getModelName(), null, SetGroupType.PREFIX, sVarModel)); + sVarModelGroups.add(new ModelSetsGroupEntity(UUID.randomUUID(), "SVarC", null, SetGroupType.PREFIX, sVarModel)); sVarModel.setSetsGroups(sVarModelGroups); modelRepository.save(sVarModel); } diff --git a/src/test/java/org/gridsuite/mapping/server/utils/PropertyUtilsTest.java b/src/test/java/org/gridsuite/mapping/server/utils/PropertyUtilsTest.java index ec5a199..b41ede0 100644 --- a/src/test/java/org/gridsuite/mapping/server/utils/PropertyUtilsTest.java +++ b/src/test/java/org/gridsuite/mapping/server/utils/PropertyUtilsTest.java @@ -13,6 +13,7 @@ import org.junit.runners.JUnit4; import java.util.Date; +import java.util.UUID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -24,9 +25,9 @@ public class PropertyUtilsTest { @Test public void testCopyNonNullProperties() { - // test with an ModelVariableDefinitionEntity - ModelVariableDefinitionEntity variableDefinitionEntity = new ModelVariableDefinitionEntity("load_running_value", VariableType.DOUBLE, "KW", 100.0, null, null, new Date(), new Date()); - ModelVariableDefinitionEntity variableDefinitionEntity2 = new ModelVariableDefinitionEntity("load_running_value2", VariableType.BOOL, null, 90.0, null, null, null, new Date()); + // test with a ModelVariableDefinitionEntity + ModelVariableDefinitionEntity variableDefinitionEntity = new ModelVariableDefinitionEntity(UUID.randomUUID(), "load_running_value", VariableType.DOUBLE, "KW", 100.0, null, null, new Date(), new Date()); + ModelVariableDefinitionEntity variableDefinitionEntity2 = new ModelVariableDefinitionEntity(UUID.randomUUID(), "load_running_value2", VariableType.BOOL, null, 90.0, null, null, null, new Date()); // call method to be tested PropertyUtils.copyNonNullProperties(variableDefinitionEntity2, variableDefinitionEntity); From 86827a452825740222549305ae516f72bd78317c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 17 Nov 2025 16:59:51 +0100 Subject: [PATCH 03/10] Remove unused model entity classes and related tests Signed-off-by: Thang PHAM --- .../changesets/changelog_20251117T141820Z.xml | 37 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 4 ++ 2 files changed, 41 insertions(+) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml diff --git a/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml b/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml new file mode 100644 index 0000000..26ac9dc --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index ca9185a..d32e825 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -43,3 +43,7 @@ databaseChangeLog: - include: file: changesets/changelog_20240506T172219Z.xml relativeToChangelogFile: true + + - include: + file: changesets/changelog_20251117T141820Z.xml + relativeToChangelogFile: true From 69f995de841613db441ba0c76023e23ac2dc36c1 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 17 Nov 2025 17:00:11 +0100 Subject: [PATCH 04/10] Remove unused model entity classes and related tests Signed-off-by: Thang PHAM --- .../server/model/ModelParameterId.java | 60 ------------------- .../server/model/ModelParameterSetId.java | 57 ------------------ .../server/model/ModelSetsGroupId.java | 32 ---------- .../mapping/server/utils/PropertyUtils.java | 2 +- .../mapping/server/ModelEntitiesTest.java | 60 ------------------- 5 files changed, 1 insertion(+), 210 deletions(-) delete mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java delete mode 100644 src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java deleted file mode 100644 index 5853743..0000000 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.mapping.server.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.gridsuite.mapping.server.utils.SetGroupType; - -import jakarta.persistence.Embeddable; -import java.io.Serializable; -import java.util.Objects; - -/** - * @author Mathieu Scalbert - */ -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -@Getter -@Setter -public class ModelParameterId implements Serializable { - - private String name; - - private String modelName; - - private String setName; - - private String groupName; - - private SetGroupType groupType; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ModelParameterId modelParameterIdClass = (ModelParameterId) o; - return name.equals(modelParameterIdClass.name) && - modelName.equals(modelParameterIdClass.modelName) && - setName.equals(modelParameterIdClass.setName) && - groupName.equals(modelParameterIdClass.groupName) && - groupType.equals(modelParameterIdClass.groupType); - } - - @Override - public int hashCode() { - return Objects.hash(name, modelName, setName, groupName, groupType); - } - -} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java deleted file mode 100644 index 8fd0a2b..0000000 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.mapping.server.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.gridsuite.mapping.server.utils.SetGroupType; - -import jakarta.persistence.Embeddable; -import java.io.Serializable; -import java.util.Objects; - -/** - * @author Mathieu Scalbert - */ -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -@Getter -@Setter -public class ModelParameterSetId implements Serializable { - - private String name; - - private String groupName; - - private String modelName; - - private SetGroupType groupType; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ModelParameterSetId modelParameterSetIdClass = (ModelParameterSetId) o; - return name.equals(modelParameterSetIdClass.name) && - groupName.equals(modelParameterSetIdClass.groupName) && - modelName.equals(modelParameterSetIdClass.modelName) && - groupType.equals(modelParameterSetIdClass.groupType); - } - - @Override - public int hashCode() { - return Objects.hash(name, groupName, modelName, groupType); - } - -} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java deleted file mode 100644 index cd9a751..0000000 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.mapping.server.model; - -import jakarta.persistence.Embeddable; -import lombok.*; -import org.gridsuite.mapping.server.utils.SetGroupType; - -import java.io.Serializable; - -/** - * @author Mathieu Scalbert - */ -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -@Getter -@Setter -public class ModelSetsGroupId implements Serializable { - - private String name; - - private String modelId; - - private SetGroupType type; - -} diff --git a/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java b/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java index a942fc8..f7f8958 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/PropertyUtils.java @@ -34,7 +34,7 @@ public static String[] getNullPropertyNames(Object source, String... authorizedN /* we take each property names, and collect the ones pointing to null value */ return Arrays.stream(propertyDescriptors).map(FeatureDescriptor::getName).filter(name -> beanSource.getPropertyValue(name) == null) - .filter(name -> Arrays.stream(authorizedNullProperties).noneMatch(n -> name.equals(n))) + .filter(name -> Arrays.stream(authorizedNullProperties).noneMatch(name::equals)) .toArray(String[]::new); } } diff --git a/src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java b/src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java deleted file mode 100644 index 593a8e7..0000000 --- a/src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.mapping.server; - -import org.gridsuite.mapping.server.model.ModelParameterId; -import org.gridsuite.mapping.server.model.ModelParameterSetId; -import org.gridsuite.mapping.server.model.ModelSetsGroupId; -import org.gridsuite.mapping.server.utils.SetGroupType; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; - -/** - * @author Mathieu Scalbert - */ -@RunWith(SpringRunner.class) -@SpringBootTest -public class ModelEntitiesTest { - - @Test - public void parameterIdTestEqualHashCode() { - ModelParameterId id = new ModelParameterId("name", "modelName", "setName", "groupName", SetGroupType.FIXED); - ModelParameterId id2 = new ModelParameterId("name", "modelName", "setName", "groupName", SetGroupType.FIXED); - - assertEquals(id, id); - assertEquals(id, id2); - assertNotEquals(null, id); - assertNotEquals("id", id); - } - - @Test - public void parameterSetIdTestEqualHashCode() { - ModelParameterSetId id = new ModelParameterSetId("name", "groupName", "modelName", SetGroupType.FIXED); - ModelParameterSetId id2 = new ModelParameterSetId("name", "groupName", "modelName", SetGroupType.FIXED); - - assertEquals(id, id); - assertEquals(id, id2); - assertNotEquals(null, id); - assertNotEquals("id", id); - } - - @Test - public void setsGroupIdTestEqualHashCode() { - ModelSetsGroupId id = new ModelSetsGroupId("name", "modelName", SetGroupType.FIXED); - ModelSetsGroupId id2 = new ModelSetsGroupId("name", "modelName", SetGroupType.FIXED); - - assertEquals(id, id); - assertEquals(id, id2); - assertNotEquals(null, id); - assertNotEquals("id", id); - } -} From 1ebec91ddde9a51c337854ba212fa875956aeb43 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 17 Nov 2025 17:48:37 +0100 Subject: [PATCH 05/10] Remove the redundant columnDefinition attribute for UUID fields Signed-off-by: Thang PHAM --- .../java/org/gridsuite/mapping/server/model/ModelEntity.java | 2 +- .../mapping/server/model/ModelParameterDefinitionEntity.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java index 60f74cc..12f85e6 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -36,7 +36,7 @@ public class ModelEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include - @Column(name = "id", columnDefinition = "UUID") + @Column(name = "id") private UUID id; @Column(name = "model_name") diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java index 02c7646..984c27f 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -36,7 +36,7 @@ public class ModelParameterDefinitionEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include - @Column(name = "id", columnDefinition = "UUID") + @Column(name = "id") private UUID id; @Column(name = "name", unique = true, nullable = false) From e68f64357a918918a2e6ce5ebf7838c1a6b5489b Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 24 Nov 2025 15:43:39 +0100 Subject: [PATCH 06/10] rectify model and test Signed-off-by: Thang PHAM --- .../server/controller/ModelController.java | 16 +- .../server/dto/models/ParametersSet.java | 8 +- .../dto/models/ParametersSetsGroup.java | 1 + .../server/dto/models/SimpleGroup.java | 12 +- .../server/dto/models/SimpleModel.java | 11 +- .../mapping/server/model/ModelEntity.java | 14 +- .../ModelModelParameterDefinitionEntity.java | 8 +- .../model/ModelParameterDefinitionEntity.java | 7 +- .../server/model/ModelParameterEntity.java | 21 +- .../server/model/ModelParameterSetEntity.java | 18 +- .../server/model/ModelSetsGroupEntity.java | 18 +- .../model/ModelVariableDefinitionEntity.java | 9 +- .../server/model/ModelVariableSetEntity.java | 17 +- .../ModelParameterDefinitionRepository.java | 4 +- .../server/repository/ModelRepository.java | 4 +- .../repository/ModelVariableRepository.java | 4 +- .../ModelVariablesSetRepository.java | 4 +- .../implementation/MappingServiceImpl.java | 2 +- .../implementation/ModelServiceImpl.java | 277 ++++++++++- .../changesets/changelog_20251117T141820Z.xml | 3 + .../changesets/changelog_20251120T230357Z.xml | 191 ++++++++ .../db/changelog/db.changelog-master.yaml | 4 + .../mapping/server/ModelControllerTest.java | 459 ++++++++++-------- .../server/ParameterControllerTest.java | 30 +- .../server/utils/assertions/Assertions.java | 17 + .../server/utils/assertions/DTOAssert.java | 26 + 26 files changed, 863 insertions(+), 322 deletions(-) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml diff --git a/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java index 2c8d67a..262a42e 100644 --- a/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java +++ b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java @@ -110,13 +110,25 @@ public ResponseEntity deleteSet(@PathVariable("modelName") } @GetMapping(value = "/") - @Operation(summary = "Get models names") + @Operation(summary = "Get simple infos of all models") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "names of all models")}) + @ApiResponse(responseCode = "200", description = "simple infos of all models")}) public ResponseEntity> getModels() { return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getModels()); } + @GetMapping(value = "/names") + @Operation(summary = "Get all model names") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "list of all model names")}) + public ResponseEntity> getModelNames() { + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(modelService.getModels().stream() + .map(SimpleModel::getName) + .toList()); + } + @DeleteMapping(value = "/") @Operation(summary = "Delete a list of models") @ApiResponses(value = { diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java index df846b0..1fb51d6 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java @@ -13,6 +13,7 @@ import java.util.Date; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -21,20 +22,17 @@ @Data @NoArgsConstructor public class ParametersSet { + private UUID id; private String name; private List parameters; @JsonIgnore private Date lastModifiedDate; public ParametersSet(ModelParameterSetEntity modelParameterSetEntity) { + id = modelParameterSetEntity.getId(); name = modelParameterSetEntity.getName(); parameters = modelParameterSetEntity.getParameters().stream().map(ModelParameter::new).collect(Collectors.toList()); lastModifiedDate = modelParameterSetEntity.getLastModifiedDate(); } - public ParametersSet(String name, List parameters) { - this.name = name; - this.parameters = parameters; - lastModifiedDate = new Date(); - } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java index 6fb3717..2fb0f2f 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java @@ -35,6 +35,7 @@ public class ParametersSetsGroup { private String modelName; public ParametersSetsGroup(ModelSetsGroupEntity setsGroupEntity) { + id = setsGroupEntity.getId(); name = setsGroupEntity.getName(); type = setsGroupEntity.getType(); sets = setsGroupEntity.getSets().stream().map(ParametersSet::new).collect(Collectors.toList()); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleGroup.java b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleGroup.java index e9761f8..a3305a0 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleGroup.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleGroup.java @@ -1,15 +1,21 @@ package org.gridsuite.mapping.server.dto.models; import lombok.Getter; +import lombok.NoArgsConstructor; import org.gridsuite.mapping.server.utils.SetGroupType; +import java.util.UUID; + +@NoArgsConstructor @Getter public class SimpleGroup { - private final String name; - private final SetGroupType type; - private final int setsNumber; + private UUID id; + private String name; + private SetGroupType type; + private int setsNumber; SimpleGroup(ParametersSetsGroup group) { + id = group.getId(); name = group.getName(); type = group.getType(); setsNumber = group.getSets().size(); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleModel.java b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleModel.java index 13f5573..316088f 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleModel.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleModel.java @@ -1,18 +1,23 @@ package org.gridsuite.mapping.server.dto.models; import lombok.Getter; +import lombok.NoArgsConstructor; import org.gridsuite.mapping.server.utils.EquipmentType; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; +@NoArgsConstructor @Getter public class SimpleModel { - private final String name; - private final EquipmentType type; - private final List groups; + private UUID id; + private String name; + private EquipmentType type; + private List groups; public SimpleModel(Model model) { + id = model.getId(); name = model.getModelName(); type = model.getEquipmentType(); groups = model.getSetsGroups().stream().map(SimpleGroup::new).collect(Collectors.toList()); diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java index 12f85e6..3c04b0e 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -30,18 +30,18 @@ @Getter @Setter @Entity -@Table(name = "models") +@Table(name = "model", indexes = {@Index(name = "model_name_index", columnList = "name")}) public class ModelEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include @Column(name = "id") private UUID id; - @Column(name = "model_name") + @Column(name = "name", nullable = false) private String modelName; + @Enumerated(EnumType.STRING) @Column(name = "equipment_type") private EquipmentType equipmentType; @@ -57,9 +57,11 @@ public class ModelEntity implements Serializable { // must exclude CascadeType.REMOVE to avoid unexpected cascade on delete a ModelVariableDefinitionEntity @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @JoinTable( - name = "models_model_variable_definitions", - joinColumns = {@JoinColumn(name = "model_id", referencedColumnName = "id")}, - inverseJoinColumns = {@JoinColumn(name = "variable_definition_id", referencedColumnName = "id")} + name = "model_model_variable_definition", + joinColumns = {@JoinColumn(name = "model_id", referencedColumnName = "id", + foreignKey = @ForeignKey(name = "model_model_variable_definition_model_id_fk"))}, + inverseJoinColumns = {@JoinColumn(name = "variable_definition_id", referencedColumnName = "id", + foreignKey = @ForeignKey(name = "model_model_variable_definition_variable_definition_id_fk"))} ) private Set variableDefinitions = LinkedHashSet.newLinkedHashSet(0); diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java index f02b25a..afdf9ac 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java @@ -12,23 +12,25 @@ @Getter @Setter @Entity -@Table(name = "models_model_parameter_definitions") +@Table(name = "model_model_parameter_definition") public class ModelModelParameterDefinitionEntity implements Serializable { @EmbeddedId private ModelModelParameterDefinitionId id; @EqualsAndHashCode.Include @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "model_id") + @JoinColumn(name = "model_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_model_parameter_definition_model_id_fk")) @MapsId("modelId") private ModelEntity model; @EqualsAndHashCode.Include @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinColumn(name = "parameter_definition_id") + @JoinColumn(name = "parameter_definition_id", referencedColumnName = "id", + foreignKey = @ForeignKey(name = "model_model_parameter_definition_parameter_definition_id_fk")) @MapsId("parameterDefinitionId") private ModelParameterDefinitionEntity parameterDefinition; + @Enumerated(EnumType.STRING) @Column(name = "origin") private ParameterOrigin origin; diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java index 984c27f..80d7525 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -30,20 +30,19 @@ @Getter @Setter @Entity -@Table(name = "model_parameter_definitions") +@Table(name = "model_parameter_definition") public class ModelParameterDefinitionEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include @Column(name = "id") private UUID id; - @Column(name = "name", unique = true, nullable = false) + @Column(name = "name", nullable = false) private String name; + @Enumerated(EnumType.STRING) @Column(name = "type") - @Enumerated private ParameterType type; @Column(name = "fixed_value") diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java index b6e6d31..5664295 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java @@ -7,10 +7,7 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.gridsuite.mapping.server.dto.models.ModelParameter; import java.io.Serializable; @@ -19,40 +16,34 @@ /** * @author Mathieu Scalbert */ -@Inheritance +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Entity -@Table(name = "model_parameters", indexes = {@Index(name = "model_parameter_set_index", columnList = "set_name")}) +@Table(name = "model_parameter", indexes = {@Index(name = "model_parameter_name_index", columnList = "name")}) public class ModelParameterEntity implements Serializable { + @EqualsAndHashCode.Include @Id - @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private UUID id; - @Column(name = "name") + @Column(name = "name", nullable = false) private String name; - @Column(name = "set_id") - private UUID setId; - @Column(name = "value_") private String value; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumns(foreignKey = @ForeignKey(name = "parameter_set_fk"), value = { - @JoinColumn(name = "set_id", referencedColumnName = "id", insertable = false, updatable = false) - }) + @JoinColumn(name = "set_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_parameter_set_id_fk")) private ModelParameterSetEntity set; public ModelParameterEntity(ModelParameterSetEntity set, ModelParameter parameter) { this.id = parameter.getId() == null ? UUID.randomUUID() : parameter.getId(); this.set = set; this.name = parameter.getName(); - this.setId = set.getId(); this.value = parameter.getValue(); } } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java index e95d46b..21f56ad 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -7,10 +7,7 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.gridsuite.mapping.server.dto.models.ParametersSet; import java.io.Serializable; @@ -22,21 +19,21 @@ /** * @author Mathieu Scalbert */ -@Inheritance +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Entity -@Table(name = "model_parameter_sets", indexes = {@Index(name = "model_parameter_sets_group_name_index", columnList = "group_name")}) +@Table(name = "model_parameter_set", indexes = {@Index(name = "model_parameter_set_name_index", columnList = "name")}) public class ModelParameterSetEntity implements Serializable { + @EqualsAndHashCode.Include @Id - @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private UUID id; - @Column(name = "name") + @Column(name = "name", nullable = false) private String name; @OneToMany(fetch = FetchType.LAZY, mappedBy = "set", cascade = CascadeType.ALL, orphanRemoval = true) @@ -46,12 +43,11 @@ public class ModelParameterSetEntity implements Serializable { private Date lastModifiedDate; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumns(foreignKey = @ForeignKey(name = "model_parameter_sets_fk"), value = { - @JoinColumn(name = "group_id", referencedColumnName = "id", insertable = false, updatable = false) - }) + @JoinColumn(name = "group_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_parameter_set_group_id_fk")) private ModelSetsGroupEntity group; public ModelParameterSetEntity(ModelSetsGroupEntity group, ParametersSet set) { + this.id = set.getId() == null ? UUID.randomUUID() : set.getId(); this.group = group; this.name = set.getName(); this.parameters = set.getParameters().stream().map(parameter -> new ModelParameterEntity(this, parameter)).collect(Collectors.toList()); diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java index 255520c..11d5b48 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java @@ -7,10 +7,7 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; import org.gridsuite.mapping.server.utils.SetGroupType; @@ -23,31 +20,32 @@ /** * @author Mathieu Scalbert */ -@Inheritance +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Entity -@Table(name = "model_sets_group", indexes = {@Index(name = "model_sets_group_model_name_index", columnList = "model_name")}) +@Table(name = "model_sets_group", indexes = {@Index(name = "model_sets_group_name_index", columnList = "name")}) public class ModelSetsGroupEntity implements Serializable { + @EqualsAndHashCode.Include @Id - @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private UUID id; - @Column(name = "name") + @Column(name = "name", nullable = false) private String name; - @OneToMany(fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) private List sets = new ArrayList<>(0); + @Enumerated(EnumType.STRING) @Column(name = "type") private SetGroupType type; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "model_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_sets_groups_fk")) + @JoinColumn(name = "model_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_sets_group_model_id_fk")) private ModelEntity model; public ModelSetsGroupEntity(ModelEntity model, ParametersSetsGroup group) { diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java index 9da026b..edf6e14 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java @@ -28,20 +28,19 @@ @Getter @Setter @Entity -@Table(name = "model_variable_definitions") +@Table(name = "model_variable_definition") public class ModelVariableDefinitionEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include @Column(name = "id") private UUID id; - @Column(name = "name") + @Column(name = "name", nullable = false) private String name; + @Enumerated(EnumType.STRING) @Column(name = "type") - @Enumerated private VariableType type; @Column(name = "unit") @@ -64,7 +63,7 @@ public class ModelVariableDefinitionEntity implements Serializable { public ModelVariableDefinitionEntity(ModelEntity model, ModelVariableSetEntity variablesSet, ModelVariableDefinition variableDefinition) { this(variableDefinition.getId() == null ? UUID.randomUUID() : variableDefinition.getId(), variableDefinition.getName(), variableDefinition.getType(), variableDefinition.getUnit(), variableDefinition.getFactor(), model != null ? new LinkedHashSet<>(List.of(model)) : new LinkedHashSet<>(), - new LinkedHashSet<>(List.of(variablesSet)), null, null); + variablesSet != null ? new LinkedHashSet<>(List.of(variablesSet)) : new LinkedHashSet<>(), null, null); } @CreatedDate diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java index 6cf51c4..5816c36 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java @@ -28,30 +28,29 @@ @Getter @Setter @Entity -@Table(name = "model_variable_sets") +@Table(name = "model_variable_set") public class ModelVariableSetEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) @EqualsAndHashCode.Include @Column(name = "id") private UUID id; - @Column(name = "name") + @Column(name = "name", nullable = false) private String name; @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinTable(name = "model_variable_sets_model_variable_definitions", - joinColumns = {@JoinColumn(name = "variable_set_id", referencedColumnName = "id")}, - inverseJoinColumns = {@JoinColumn(name = "variable_definition_id", referencedColumnName = "id")} + @JoinTable(name = "model_variable_set_model_variable_definition", + joinColumns = {@JoinColumn(name = "variable_set_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_variable_set_model_variable_definition_variable_set_id_fk"))}, + inverseJoinColumns = {@JoinColumn(name = "variable_definition_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_variable_set_model_variable_definition_variable_definition_id_fk"))} ) private Set variableDefinitions = new LinkedHashSet<>(0); @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @JoinTable( - name = "models_model_variable_sets", - joinColumns = {@JoinColumn(name = "variable_set_id", referencedColumnName = "id")}, - inverseJoinColumns = {@JoinColumn(name = "model_id", referencedColumnName = "id")} + name = "model_model_variable_set", + joinColumns = {@JoinColumn(name = "variable_set_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_model_variable_set_variable_set_id_fk"))}, + inverseJoinColumns = {@JoinColumn(name = "model_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_model_variable_set_model_id_fk"))} ) private Set models; diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java index 0205851..dd9f914 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java @@ -10,7 +10,7 @@ @Repository public interface ModelParameterDefinitionRepository extends JpaRepository { - List findAllByName(Collection names); + List findAllByNameIn(Collection names); - void deleteAllByName(Collection names); + void deleteAllByNameIn(Collection names); } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java index b6499bb..2dc0a45 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java @@ -24,7 +24,7 @@ public interface ModelRepository extends JpaRepository { Optional findByModelName(String modelName); - List findAllByModelName(Collection modelNames); + List findAllByModelNameIn(Collection modelNames); - void deleteAllByModelName(Collection modelNames); + void deleteAllByModelNameIn(Collection modelNames); } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java index 8eacab6..9ceb0dc 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariableRepository.java @@ -20,7 +20,7 @@ */ @Repository public interface ModelVariableRepository extends JpaRepository { - List findAllByName(Collection names); + List findAllByNameIn(Collection names); - void deleteAllByName(Collection names); + void deleteAllByNameIn(Collection names); } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java index 7de659b..5bd89d3 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelVariablesSetRepository.java @@ -19,9 +19,9 @@ * @author Thang PHAM */ public interface ModelVariablesSetRepository extends JpaRepository { - List findAllByName(Collection names); + List findAllByNameIn(Collection names); Optional findByName(String name); - void deleteAllByName(Collection names); + void deleteAllByNameIn(Collection names); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java index d81250b..6835807 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java @@ -279,7 +279,7 @@ public List getMappedModelsList(String mappingName) { .collect(Collectors.toSet()); // get model by name from db, concat to default models and convert to dtos - return Stream.concat(modelRepository.findAllByModelName(mappedModelNames).stream(), + return Stream.concat(modelRepository.findAllByModelNameIn(mappedModelNames).stream(), modelRepository.findAllByDefaultModelTrue().stream()) .map(Model::new).toList(); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java index 01f3f8f..fd55719 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java @@ -37,6 +37,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -231,6 +232,7 @@ public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersS if (new Model(modelToUpdate).isParameterSetGroupValid(setsGroup.getName(), strict)) { modelRepository.save(modelToUpdate); + setsGroup.setId(groupToAdd.getId()); // round-trip id return setsGroup; } else { throw new HttpClientErrorException(HttpStatus.BAD_REQUEST); @@ -240,15 +242,213 @@ public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersS @Override @Transactional public Model saveModel(Model model) { - modelRepository.save(new ModelEntity(model)); + ModelEntity modelEntity = new ModelEntity(model); + + // --- Process reusable entities --- // + // *** parameter definitions at model level *** // + processParameterDefinitions(modelEntity); + + // *** variable definitions *** // + // A map to store managed/loaded variables which can be shared with other models or within the model + Map sharedVariables = new HashMap<>(); + + // variables at the model level + processModelLevelVariableDefinitions(modelEntity, sharedVariables); + // variables at the variable-set level + processVariableSetLevelDefinitions(modelEntity, sharedVariables); + + // rely on Hibernate to save + modelRepository.save(modelEntity); return model; } + /** + * Process and merge parameter definitions at the model level with existing definitions in the database. + * Reuses existing parameter definitions where possible to maintain referential integrity. + */ + private void processParameterDefinitions(ModelEntity modelEntity) { + List parameterDefinitionsInModel = modelEntity.getParameterDefinitions(); + if (CollectionUtils.isEmpty(parameterDefinitionsInModel)) { + return; + } + + List parameterNames = parameterDefinitionsInModel.stream() + .map(ModelModelParameterDefinitionEntity::getParameterDefinition) + .map(ModelParameterDefinitionEntity::getName) + .toList(); + List existingParameterDefinitions = + modelParameterDefinitionRepository.findAllByNameIn(parameterNames); + + if (CollectionUtils.isEmpty(existingParameterDefinitions)) { + return; + } + + // indexing by parameter's name + Map existingParameterDefinitionsMap = existingParameterDefinitions.stream() + .collect(Collectors.toMap(ModelParameterDefinitionEntity::getName, Function.identity())); + + // perform merge + for (ModelModelParameterDefinitionEntity parameterDefinitionLink : parameterDefinitionsInModel) { + String parameterName = parameterDefinitionLink.getParameterDefinition().getName(); + if (existingParameterDefinitionsMap.containsKey(parameterName)) { + parameterDefinitionLink.setParameterDefinition(existingParameterDefinitionsMap.get(parameterName)); + } + } + } + + /** + * Process and merge variable definitions at the model level with existing definitions in the database. + * Populates the sharedVariables map with managed/loaded variables that can be shared. + */ + private void processModelLevelVariableDefinitions(ModelEntity modelEntity, + Map sharedVariables) { + Set variableDefinitionsInModel = modelEntity.getVariableDefinitions(); + if (CollectionUtils.isEmpty(variableDefinitionsInModel)) { + return; + } + + List variableNames = variableDefinitionsInModel.stream() + .map(ModelVariableDefinitionEntity::getName) + .toList(); + List existingVariables = + modelVariableRepository.findAllByNameIn(variableNames); + + // init the shared variables map with loaded variables + existingVariables.forEach(variable -> sharedVariables.put(variable.getName(), variable)); + + Set mergedVariables = new LinkedHashSet<>(); + // perform merge + for (ModelVariableDefinitionEntity variable : variableDefinitionsInModel) { + if (sharedVariables.containsKey(variable.getName())) { + mergedVariables.add(sharedVariables.get(variable.getName())); + } else { + mergedVariables.add(variable); + sharedVariables.put(variable.getName(), variable); + } + } + modelEntity.setVariableDefinitions(mergedVariables); + } + + /** + * Process and merge variable sets and their variable definitions with existing entities in the database. + * Uses the sharedVariables map to ensure variable definitions are properly reused across sets. + */ + private void processVariableSetLevelDefinitions(ModelEntity modelEntity, + Map sharedVariables) { + Set variableSets = modelEntity.getVariableSets(); + if (CollectionUtils.isEmpty(variableSets)) { + return; + } + + List variableSetNames = variableSets.stream() + .map(ModelVariableSetEntity::getName) + .toList(); + List existingVariableSets = + modelVariablesSetRepository.findAllByNameIn(variableSetNames); + + // indexing by variable set's name + Map existingVariableSetMap = existingVariableSets.stream() + .collect(Collectors.toMap(ModelVariableSetEntity::getName, Function.identity())); + + // Load variables not yet in the shared variables map + loadReferencedVariablesBySetIntoSharedMap(variableSets, sharedVariables); + + // Merge variable sets and variables simultaneously + Set mergedVariableSets = mergeVariableSets( + variableSets, existingVariableSetMap, sharedVariables, modelEntity); + + modelEntity.setVariableSets(mergedVariableSets); + } + + /** + * Load variable definitions that are referenced in variable sets but not yet in the shared variables map. + */ + private void loadReferencedVariablesBySetIntoSharedMap(Set variableSets, + Map sharedVariables) { + // Collect all variable names that are in variable sets + List allVariableNamesInSets = variableSets.stream() + .flatMap(variableSet -> variableSet.getVariableDefinitions().stream()) + .map(ModelVariableDefinitionEntity::getName) + .toList(); + + // load variables which not yet in the shared variables map + List variableNamesToLoad = allVariableNamesInSets.stream() + .filter(name -> !sharedVariables.containsKey(name)) + .toList(); + + if (CollectionUtils.isEmpty(variableNamesToLoad)) { + return; + } + + List existingVariablesInSet = + modelVariableRepository.findAllByNameIn(variableNamesToLoad); + // add new loaded variables to shared variables map + existingVariablesInSet.forEach(variable -> sharedVariables.put(variable.getName(), variable)); + } + + /** + * Merge variable sets with existing entities, reusing existing sets and variables where possible. + */ + private Set mergeVariableSets(Set variableSets, + Map existingVariableSetMap, + Map sharedVariables, + ModelEntity modelEntity) { + Set mergedVariableSets = new LinkedHashSet<>(); + + for (ModelVariableSetEntity variableSet : variableSets) { + ModelVariableSetEntity setToMerge = variableSet; + + if (existingVariableSetMap.containsKey(variableSet.getName())) { + // Reuse the existing variable set with existing variables in the set + setToMerge = existingVariableSetMap.get(variableSet.getName()); + if (setToMerge.getModels() == null) { + setToMerge.setModels(new LinkedHashSet<>()); + } + setToMerge.getModels().add(modelEntity); + } else { + // For a new set, must merge with managed variables + Set mergedVariableInSet = + mergeVariablesInSet(setToMerge, sharedVariables); + setToMerge.setVariableDefinitions(mergedVariableInSet); + } + + mergedVariableSets.add(setToMerge); + } + + return mergedVariableSets; + } + + /** + * Merge variable definitions within a variable set, reusing existing variables from the shared map. + */ + private Set mergeVariablesInSet(ModelVariableSetEntity variableSet, + Map sharedVariables) { + Set mergedVariableInSet = new LinkedHashSet<>(); + + for (ModelVariableDefinitionEntity variable : variableSet.getVariableDefinitions()) { + ModelVariableDefinitionEntity variableToMerge = variable; + + if (sharedVariables.containsKey(variable.getName())) { + variableToMerge = sharedVariables.get(variable.getName()); + if (variableToMerge.getVariablesSets() == null) { + variableToMerge.setVariablesSets(new LinkedHashSet<>()); + } + variableToMerge.getVariablesSets().add(variableSet); + } else { + sharedVariables.put(variable.getName(), variable); + } + + mergedVariableInSet.add(variableToMerge); + } + + return mergedVariableInSet; + } + @Override @Transactional public List deleteModels(List modelNames) { if (!CollectionUtils.isEmpty(modelNames)) { - List modelEntities = modelRepository.findAllByModelName(modelNames); + List modelEntities = modelRepository.findAllByModelNameIn(modelNames); List allParameterDefinitions = new ArrayList<>(); Set allVariableDefinitions = new HashSet<>(); Set allVariableSets = new HashSet<>(); @@ -267,29 +467,28 @@ public List deleteModels(List modelNames) { List variableSets = modelEntity.getVariableSets().stream().toList(); modelEntity.removeAllVariablesSet(variableSets); allVariableSets.addAll(variableSets); - - variableSets.forEach(variableSetEntity -> { - List variableDefinitionsInSet = variableSetEntity.getVariableDefinitions().stream().toList(); - variableSetEntity.removeAllVariableDefinition(variableDefinitionsInSet); - allVariableDefinitions.addAll(variableDefinitionsInSet); - }); }); // --- Perform delete cascade manually --- // // delete model first - modelRepository.deleteAllByModelName(modelNames); + modelRepository.deleteAllByModelNameIn(modelNames); // delete all parameter definitions which are not referenced by any model List toDeleteParameterDefinitions = allParameterDefinitions.stream().filter(elem -> elem.getModels().isEmpty()).toList(); if (!CollectionUtils.isEmpty(toDeleteParameterDefinitions)) { - modelParameterDefinitionRepository.deleteAllByName(toDeleteParameterDefinitions.stream() + modelParameterDefinitionRepository.deleteAllByNameIn(toDeleteParameterDefinitions.stream() .map(ModelParameterDefinitionEntity::getName).toList()); } // delete all variable sets which are not referenced by any model List toDeleteVariableSets = allVariableSets.stream().filter(elem -> elem.getModels().isEmpty()).toList(); if (!CollectionUtils.isEmpty(toDeleteVariableSets)) { - modelVariablesSetRepository.deleteAllByName(toDeleteVariableSets.stream() + toDeleteVariableSets.forEach(variableSetEntity -> { + List variableDefinitionsInSet = variableSetEntity.getVariableDefinitions().stream().toList(); + variableSetEntity.removeAllVariableDefinition(variableDefinitionsInSet); + allVariableDefinitions.addAll(variableDefinitionsInSet); + }); + modelVariablesSetRepository.deleteAllByNameIn(toDeleteVariableSets.stream() .map(ModelVariableSetEntity::getName).toList()); } @@ -297,7 +496,7 @@ public List deleteModels(List modelNames) { List toDeleteVariableDefinitions = allVariableDefinitions.stream() .filter(elem -> elem.getModels().isEmpty() && elem.getVariablesSets().isEmpty()).toList(); if (!CollectionUtils.isEmpty(toDeleteVariableDefinitions)) { - modelVariableRepository.deleteAllByName(toDeleteVariableDefinitions.stream() + modelVariableRepository.deleteAllByNameIn(toDeleteVariableDefinitions.stream() .map(ModelVariableDefinitionEntity::getName).toList()); } } @@ -340,7 +539,7 @@ public List getParameterDefinitionNames() { @Override @Transactional(readOnly = true) public List getParameterDefinitions(List parameterDefinitionNames) { - return modelParameterDefinitionRepository.findAllByName(parameterDefinitionNames).stream() + return modelParameterDefinitionRepository.findAllByNameIn(parameterDefinitionNames).stream() .map(parameterDefinitionEntity -> new ModelParameterDefinition(parameterDefinitionEntity, null, null)).toList(); } @@ -384,7 +583,7 @@ public Model addExistingParameterDefinitionsToModel(String modelName, List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllByName(parameterDefinitionNames); + List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllByNameIn(parameterDefinitionNames); // check whether found all, fail fast if (foundParameterDefinitionEntities.size() != parameterDefinitionNames.size()) { @@ -415,7 +614,7 @@ public Model removeExistingParameterDefinitionsFromModel(String modelName, List< // do remove in the list of parameter definitions if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { // find existing variable definitions - List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllByName(parameterDefinitionNames); + List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllByNameIn(parameterDefinitionNames); // remove in existing list modelToUpdate.removeAllParameterDefinition(foundParameterDefinitionEntities); @@ -463,7 +662,7 @@ public List saveNewParameterDefinitions(List deleteParameterDefinitions(List parameterDefinitionNames) { if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { - modelParameterDefinitionRepository.deleteAllByName(parameterDefinitionNames); + modelParameterDefinitionRepository.deleteAllByNameIn(parameterDefinitionNames); } return parameterDefinitionNames; } @@ -491,7 +690,7 @@ public List getVariableDefinitionNames() { @Transactional(readOnly = true) @Override public List getVariableDefinitions(List variableNames) { - return modelVariableRepository.findAllByName(variableNames).stream().map(ModelVariableDefinition::new).toList(); + return modelVariableRepository.findAllByNameIn(variableNames).stream().map(ModelVariableDefinition::new).toList(); } @Override @@ -526,7 +725,7 @@ public Model addExistingVariableDefinitionsToModel(String modelName, List foundVariableDefinitionEntities = modelVariableRepository.findAllByName(variableDefinitionNames); + List foundVariableDefinitionEntities = modelVariableRepository.findAllByNameIn(variableDefinitionNames); // check whether found all, fail fast if (foundVariableDefinitionEntities.size() != variableDefinitionNames.size()) { @@ -556,7 +755,7 @@ public Model removeExistingVariableDefinitionsFromModel(String modelName, List foundVariableDefinitionEntities = modelVariableRepository.findAllByName(variableDefinitionNames); + List foundVariableDefinitionEntities = modelVariableRepository.findAllByNameIn(variableDefinitionNames); // remove in existing list modelToUpdate.removeAllVariableDefinition(foundVariableDefinitionEntities); @@ -606,7 +805,7 @@ public List getVariablesSetNames() { @Override @Transactional(readOnly = true) public List getVariablesSets(List variablesSetNames) { - return modelVariablesSetRepository.findAllByName(variablesSetNames).stream().map(VariablesSet::new).toList(); + return modelVariablesSetRepository.findAllByNameIn(variablesSetNames).stream().map(VariablesSet::new).toList(); } @Override @@ -624,6 +823,34 @@ public List getVariablesSetsFromModel(String modelName) { @Transactional public VariablesSet saveNewVariablesSet(VariablesSet variableSet) { ModelVariableSetEntity variableSetEntity = new ModelVariableSetEntity(null, variableSet); + + // process reusable entities + Set variableDefinitions = variableSetEntity.getVariableDefinitions(); + if (!CollectionUtils.isEmpty(variableDefinitions)) { + List variableNamesInSet = variableDefinitions.stream().map(ModelVariableDefinitionEntity::getName).toList(); + List existingVariables = modelVariableRepository.findAllByNameIn(variableNamesInSet); + + // Indexing by variable's name + Map existingVariablesMap = existingVariables.stream() + .collect(Collectors.toMap(ModelVariableDefinitionEntity::getName, Function.identity())); + Set mergedVariables = new LinkedHashSet<>(); + // perform merge with existing entities + for (ModelVariableDefinitionEntity variable : variableDefinitions) { + ModelVariableDefinitionEntity mergedVariable = variable; + if (existingVariablesMap.get(variable.getName()) != null) { + mergedVariable = existingVariablesMap.get(variable.getName()); + if (mergedVariable.getVariablesSets() != null) { + mergedVariable.setVariablesSets(new LinkedHashSet<>()); + } + mergedVariable.getVariablesSets().add(variableSetEntity); + } + mergedVariables.add(mergedVariable); + } + // use merged result + variableSetEntity.setVariableDefinitions(mergedVariables); + } + + // rely on Hibernate to save ModelVariableSetEntity savedVariableSetEntity = modelVariablesSetRepository.save(variableSetEntity); return new VariablesSet(savedVariableSetEntity); } @@ -668,7 +895,7 @@ public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String vari if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions - List foundVariableDefinitionEntities = modelVariableRepository.findAllByName(variableDefinitionNames); + List foundVariableDefinitionEntities = modelVariableRepository.findAllByNameIn(variableDefinitionNames); // remove in existing list variableSetToUpdate.removeAllVariableDefinition(foundVariableDefinitionEntities); @@ -726,7 +953,7 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari // do merge with the list of variables set if (!CollectionUtils.isEmpty(variablesSetNames)) { // do merge with existing list - List foundVariablesSetEntities = modelVariablesSetRepository.findAllByName(variablesSetNames); + List foundVariablesSetEntities = modelVariablesSetRepository.findAllByNameIn(variablesSetNames); // check whether found all if (foundVariablesSetEntities.size() != variablesSetNames.size()) { @@ -753,7 +980,7 @@ public Model removeExistingVariablesSetsFromModel(String modelName, List // do merge with the list of variables set if (!CollectionUtils.isEmpty(variablesSetNames)) { // remove from existing list - List foundVariablesSetEntities = modelVariablesSetRepository.findAllByName(variablesSetNames); + List foundVariablesSetEntities = modelVariablesSetRepository.findAllByNameIn(variablesSetNames); modelToUpdate.removeAllVariablesSet(foundVariablesSetEntities); // save modified existing model entity @@ -782,7 +1009,7 @@ public Model removeAllExistingVariablesSetsFromModel(String modelName) { @Transactional public List deleteVariableDefinitions(List variableDefinitionNames) { if (!CollectionUtils.isEmpty(variableDefinitionNames)) { - modelVariableRepository.deleteAllByName(variableDefinitionNames); + modelVariableRepository.deleteAllByNameIn(variableDefinitionNames); } return variableDefinitionNames; @@ -792,7 +1019,7 @@ public List deleteVariableDefinitions(List variableDefinitionNam @Transactional public List deleteVariablesSets(List variablesSetNames) { if (!CollectionUtils.isEmpty(variablesSetNames)) { - modelVariablesSetRepository.deleteAllByName(variablesSetNames); + modelVariablesSetRepository.deleteAllByNameIn(variablesSetNames); } return variablesSetNames; diff --git a/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml b/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml index 26ac9dc..ed2d715 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml @@ -34,4 +34,7 @@ + + + diff --git a/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml b/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml new file mode 100644 index 0000000..161bffd --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index d32e825..806a9f0 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -47,3 +47,7 @@ databaseChangeLog: - include: file: changesets/changelog_20251117T141820Z.xml relativeToChangelogFile: true + + - include: + file: changesets/changelog_20251120T230357Z.xml + relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index 99ce3ba..89dbdaa 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -20,6 +20,7 @@ import org.gridsuite.mapping.server.utils.ParameterOrigin; import org.gridsuite.mapping.server.utils.ParameterType; import org.gridsuite.mapping.server.utils.SetGroupType; +import org.gridsuite.mapping.server.utils.assertions.Assertions; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -38,11 +39,8 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; -import java.util.stream.Collectors; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; @@ -58,7 +56,7 @@ @TestPropertySource(properties = {"ex-resources.automaton = src/test/resources/data/ex-automaton"}) public class ModelControllerTest { - public static Logger LOGGER = LoggerFactory.getLogger(ModelControllerTest.class); + public static final Logger LOGGER = LoggerFactory.getLogger(ModelControllerTest.class); @Autowired private ModelRepository modelRepository; @@ -124,12 +122,12 @@ public void testGetAutomatonDefinitions() throws Exception { String automatonsJsonResult = mvcResult.getResponse().getContentAsString(); - LOGGER.info("Automatons result in Json array = \n" + automatonsJsonResult); + LOGGER.info("Automatons result in Json array = \n {}", automatonsJsonResult); // Check result JsonNode jsonNode = objectMapper.readTree(automatonsJsonResult); - assertEquals(true, jsonNode.isArray()); - assertEquals(3, jsonNode.size()); + Assertions.assertThat(jsonNode.isArray()).isTrue(); + Assertions.assertThat(jsonNode.size()).isEqualTo(3); } @Test @@ -172,17 +170,23 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()); - mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") + MvcResult mvcResult = mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json("[" + set + "]", true)); + .andReturn(); + + String setJson = mvcResult.getResponse().getContentAsString(); + List resultSetList = objectMapper.readValue(setJson, new TypeReference<>() { }); + ParametersSet expectedSet = objectMapper.readValue(set, ParametersSet.class); + + Assertions.assertThat(resultSetList.getFirst()).recursivelyEquals(expectedSet); mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "PREFIX") .contentType(APPLICATION_JSON)) .andExpect(status().isNotFound()); - Date setCreationDate = modelRepository.findByModelName(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); + Date setCreationDate = modelRepository.findByModelName(modelName).get().getSetsGroups().getFirst().getSets().getFirst().getLastModifiedDate(); // Update data mvc.perform(post("/models/" + modelName + "/parameters/sets/strict") @@ -190,20 +194,16 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()); - Date setUpdateDate = modelRepository.findByModelName(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); + Date setUpdateDate = modelRepository.findByModelName(modelName).get().getSetsGroups().getFirst().getSets().getFirst().getLastModifiedDate(); - assertThat(setCreationDate.compareTo(setUpdateDate) < 0); + Assertions.assertThat(setCreationDate.compareTo(setUpdateDate) < 0).isTrue(); } @Test public void definitionTest() throws Exception { String modelName = "LoadAlphaBeta"; - mvc.perform(get("/models/" + modelName + "/parameters/definitions") - .contentType(APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json(""" + String expectedParamaterDefinitionsJson = """ [ {"name": "load_alpha", "type": "DOUBLE", "origin": "USER", "originName": null, "fixedValue": null}, {"name": "load_beta", "type": "DOUBLE", "origin": "USER", "originName": null, "fixedValue": null}, @@ -212,10 +212,24 @@ public void definitionTest() throws Exception { {"name": "load_U0Pu", "type": "DOUBLE", "origin": "NETWORK", "originName": "v_pu", "fixedValue": null}, {"name": "load_UPhase0", "type": "DOUBLE", "origin": "NETWORK", "originName": "angle_pu", "fixedValue": null} ] - """, false)); + """; + MvcResult mvcResult = mvc.perform(get("/models/" + modelName + "/parameters/definitions") + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) + .andReturn(); + + String resultParameterDefinitionsJson = objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(objectMapper.readTree(mvcResult.getResponse().getContentAsString())); + LOGGER.info("Result parameter definitions in json array \n {}", resultParameterDefinitionsJson); + LOGGER.info("Expected parameter definitions in json array \n {}", expectedParamaterDefinitionsJson); + + List actual = objectMapper.readValue(resultParameterDefinitionsJson, new TypeReference<>() { }); + List expected = objectMapper.readValue(expectedParamaterDefinitionsJson, new TypeReference<>() { }); + Assertions.assertThatDtoList(actual).recursivelyContainAll(expected); // --- GET all names of parameter definitions in the database --- // - MvcResult mvcResult = mvc.perform(get("/models/parameter-definitions/names") + mvcResult = mvc.perform(get("/models/parameter-definitions/names") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); @@ -223,21 +237,21 @@ public void definitionTest() throws Exception { // check result // must contain 6 names of parameter definitions in the database List foundParameterDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), - new TypeReference>() { }); - assertEquals(6, foundParameterDefinitionNames.size()); + new TypeReference<>() { }); + assertThat(foundParameterDefinitionNames).hasSize(6); // --- GET all parameter definitions in the database --- // mvcResult = mvc.perform(get("/models/parameter-definitions") .contentType(APPLICATION_JSON) - .param("parameterDefinitionNames", foundParameterDefinitionNames.stream().collect(Collectors.joining(",")))) + .param("parameterDefinitionNames", String.join(",", foundParameterDefinitionNames))) .andExpect(status().isOk()) .andReturn(); // check result // must contain 6 parameter definitions in the database List foundParameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), - new TypeReference>() { }); - assertEquals(6, foundParameterDefinitions.size()); + new TypeReference<>() { }); + assertThat(foundParameterDefinitions).hasSize(6); } @Test @@ -288,8 +302,8 @@ public void getTest() throws Exception { ArrayList groupSets = new ArrayList<>(); ModelParameterSetEntity setToSave = new ModelParameterSetEntity(UUID.randomUUID(), "LAB", null, new Date(), loadGroup); ArrayList setParameters = new ArrayList<>(); - setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_alpha", setToSave.getId(), "1.5", setToSave)); - setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_beta", setToSave.getId(), "2.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_alpha", "1.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_beta", "2.5", setToSave)); setToSave.setParameters(setParameters); groupSets.add(setToSave); loadGroup.setSets(groupSets); @@ -303,11 +317,7 @@ public void getTest() throws Exception { generatorThreeModel.setSetsGroups(generatorThreeGroups); modelRepository.save(generatorThreeModel); - mvc.perform(get("/models/") - .contentType(APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json(""" + String expectedModelsJson = """ [ { "name": "LoadAlphaBeta", @@ -324,10 +334,33 @@ public void getTest() throws Exception { ] } ] - """, true)); + """; + MvcResult mvcResult = mvc.perform(get("/models/") + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) + .andReturn(); + + String resultModelsJson = objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(objectMapper.readTree(mvcResult.getResponse().getContentAsString())); + LOGGER.info("Result models in json array = \n {}", resultModelsJson); + LOGGER.info("Expected models in json array = \n {}", expectedModelsJson); + List resultModels = objectMapper.readValue(resultModelsJson, new TypeReference<>() { }); + List expectedModels = objectMapper.readValue(expectedModelsJson, new TypeReference<>() { }); + Assertions.assertThatDtoList(resultModels).recursivelyContainAll(expectedModels); + + // --- GET all names of models in the database --- // + mvcResult = mvc.perform(get("/models/names") + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) + .andReturn(); + + List resultModelNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + Assertions.assertThat(resultModelNames).containsExactlyInAnyOrder("LoadAlphaBeta", "GeneratorThreeWindings"); // --- GET parameter set groups in the database --- // - MvcResult mvcResult = mvc.perform(get("/models/parameters-sets-groups") + mvcResult = mvc.perform(get("/models/parameters-sets-groups") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) @@ -335,8 +368,8 @@ public void getTest() throws Exception { // check result // must contain 2 parameter set groups, i.e. "LAB" and "GSTWPR" - List foundParametersSetsGroups = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(2, foundParametersSetsGroups.size()); + List foundParametersSetsGroups = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundParametersSetsGroups).hasSize(2); // --- GET parameter sets in the database --- // mvcResult = mvc.perform(get("/models/parameters-sets") @@ -347,8 +380,8 @@ public void getTest() throws Exception { // check result // must contain only 1 parameter set, i.e. "LAB" - List foundParametersSets = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(1, foundParametersSets.size()); + List foundParametersSets = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundParametersSets).hasSize(1); // --- GET parameters in the database --- // mvcResult = mvc.perform(get("/models/parameters") @@ -359,8 +392,8 @@ public void getTest() throws Exception { // check result // must contain 2 parameter, i.e. "load_alpha", "load_beta" - List foundParameters = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(2, foundParameters.size()); + List foundParameters = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundParameters).hasSize(2); } public static String readFileAsString(String file) throws Exception { @@ -382,13 +415,13 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // Get initial parameter definitions List parameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); - assertEquals(6, parameterDefinitions.size()); + assertThat(parameterDefinitions).hasSize(6); // --- Get initial parameter definitions from GET endpoint --- // mvcResult = mvc.perform(get("/models/" + modelName + "/parameters/definitions")) .andExpect(status().isOk()).andReturn(); - List parameterDefinitions1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(6, parameterDefinitions1.size()); + List parameterDefinitions1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(parameterDefinitions1).hasSize(6); // --- Try to get parameter definitions from unknown model --- // mvc.perform(get("/models/" + modelName + "_unknown" + "/parameters/definitions")) @@ -402,13 +435,13 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // Get current parameter definitions List parameterDefinitions2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); - LOGGER.info("Initial parameter definitions = " + parameterDefinitions); - LOGGER.info("Updated parameter definitions = " + parameterDefinitions2); + LOGGER.info("Initial parameter definitions = {}", parameterDefinitions); + LOGGER.info("Updated parameter definitions = {}", parameterDefinitions2); // check result // final model's parameter definitions must contain all ones of initial model - assertEquals(1, parameterDefinitions2.size() - parameterDefinitions.size()); - assertTrue(parameterDefinitions2.containsAll(parameterDefinitions)); + assertThat(parameterDefinitions2.size() - parameterDefinitions.size()).isOne(); + Assertions.assertThatDtoList(parameterDefinitions2).recursivelyContainAll(parameterDefinitions); // --- Remove an existing variable definition --- // mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove") @@ -418,13 +451,13 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // Get current parameter definitions List parameterDefinitions3 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); - LOGGER.info("Updated parameter definitions = " + parameterDefinitions2); - LOGGER.info("Removed parameter definitions = " + parameterDefinitions3); + LOGGER.info("Updated parameter definitions = {}", parameterDefinitions2); + LOGGER.info("Removed parameter definitions = {}", parameterDefinitions3); // check result // final model's parameter definitions must contain all ones of model - assertEquals(1, parameterDefinitions2.size() - parameterDefinitions3.size()); - assertTrue(parameterDefinitions2.containsAll(parameterDefinitions3)); + assertThat(parameterDefinitions2.size() - parameterDefinitions3.size()).isOne(); + Assertions.assertThatDtoList(parameterDefinitions2).recursivelyContainAll(parameterDefinitions3); // --- Remove all parameter definitions --- // mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove-all") @@ -432,24 +465,24 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { .andExpect(status().isOk()).andReturn(); List parameterDefinitions4 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); - LOGGER.info("Unset parameter definitions = " + parameterDefinitions4); + LOGGER.info("Unset parameter definitions = {}", parameterDefinitions4); // check result // must have no parameter definition - assertEquals(0, parameterDefinitions4.size()); + assertThat(parameterDefinitions4).isEmpty(); // --- Save new parameter definition --- // - List parameterDefinitionList = objectMapper.readValue(newParameterDefinitionsJson, new TypeReference>() { }); - parameterDefinitionList.get(0).setName("load_UPhase0_3"); + List parameterDefinitionList = objectMapper.readValue(newParameterDefinitionsJson, new TypeReference<>() { }); + parameterDefinitionList.getFirst().setName("load_UPhase0_3"); mvcResult = mvc.perform(post("/models/parameters/definitions") .content(objectMapper.writeValueAsString(parameterDefinitionList)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List savedParameterDefinitionList = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); + List savedParameterDefinitionList = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); // check result // must have the same number of input variable definitions - assertEquals(parameterDefinitionList.size(), savedParameterDefinitionList.size()); + assertThat(savedParameterDefinitionList).hasSameSizeAs(parameterDefinitionList); // --- Add existing parameter definition to model --- // mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add?origin=USER") @@ -459,9 +492,9 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // Get current parameter definitions in the model List parameterDefinitions6 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); - LOGGER.info("Updated parameter definitions = " + parameterDefinitions6); + LOGGER.info("Updated parameter definitions = {}", parameterDefinitions6); // must have the same number of above input parameter definitions - assertEquals(savedParameterDefinitionList.size(), parameterDefinitions6.size()); + assertThat(parameterDefinitions6).hasSameSizeAs(savedParameterDefinitionList); // --- Add unknown existing parameter definition to model => must fail fast --- // mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") @@ -474,12 +507,12 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { .content(objectMapper.writeValueAsString(List.of(parameterDefinitions.get(4).getName()))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List deletedParameterDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - LOGGER.info("Deleted parameter definitions = " + deletedParameterDefinitionNames); + List deletedParameterDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + LOGGER.info("Deleted parameter definitions = {}", deletedParameterDefinitionNames); // Check result - assertEquals(1, deletedParameterDefinitionNames.size()); - assertEquals(parameterDefinitions.get(4).getName(), deletedParameterDefinitionNames.get(0)); + assertThat(deletedParameterDefinitionNames).hasSize(1); + assertThat(deletedParameterDefinitionNames.getFirst()).isEqualTo(parameterDefinitions.get(4).getName()); } @Test @@ -499,13 +532,13 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // Get initial variable definitions List variableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); - assertEquals(5, variableDefinitions.size()); + assertThat(variableDefinitions).hasSize(5); // --- Get initial variable definitions from GET endpoint --- // mvcResult = mvc.perform(get("/models/" + modelName + "/variables")) .andExpect(status().isOk()).andReturn(); - List variableDefinitions1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(5, variableDefinitions1.size()); + List variableDefinitions1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(variableDefinitions1).hasSize(5); // --- Try to get variable definitions from unknown model --- // mvc.perform(get("/models/" + modelName + "_unknown" + "/variables")) @@ -519,13 +552,14 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // Get current variable definitions List variableDefinitions2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); - LOGGER.info("Initial variable definitions = " + variableDefinitions); - LOGGER.info("Updated variable definitions = " + variableDefinitions2); + LOGGER.info("Initial variable definitions = {}", variableDefinitions); + LOGGER.info("Updated variable definitions = {}", variableDefinitions2); // check result - // final model's variable definition must contains all ones of initial model - assertEquals(1, variableDefinitions2.size() - variableDefinitions.size()); - assertTrue(variableDefinitions2.containsAll(variableDefinitions)); + // final model's variable definition must contain all ones of the initial model + assertThat(variableDefinitions2.size() - variableDefinitions.size()).isOne(); + Assertions.assertThatDtoList(variableDefinitions2) + .recursivelyContainAll(variableDefinitions); // --- Remove an existing variable definition --- // mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/remove") @@ -535,13 +569,13 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // Get current variable definitions List variableDefinitions3 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); - LOGGER.info("Updated variable definitions = " + variableDefinitions2); - LOGGER.info("Removed variable definitions = " + variableDefinitions3); + LOGGER.info("Updated variable definitions = {}", variableDefinitions2); + LOGGER.info("Removed variable definitions = {}", variableDefinitions3); // check result // final model's variable definition must contain all ones of model - assertEquals(1, variableDefinitions2.size() - variableDefinitions3.size()); - assertTrue(variableDefinitions2.containsAll(variableDefinitions3)); + assertThat(variableDefinitions2.size() - variableDefinitions3.size()).isOne(); + Assertions.assertThatDtoList(variableDefinitions2).recursivelyContainAll(variableDefinitions3); // --- Remove all variable definitions --- // mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/remove-all") @@ -549,24 +583,24 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { .andExpect(status().isOk()).andReturn(); List variableDefinitions4 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); - LOGGER.info("Unset variable definitions = " + variableDefinitions4); + LOGGER.info("Unset variable definitions = {}", variableDefinitions4); // check result // must have no variable definition - assertEquals(0, variableDefinitions4.size()); + assertThat(variableDefinitions4).isEmpty(); // --- Save new variable definition --- // - List variableDefinitionList = objectMapper.readValue(newVariableDefinitionsJson, new TypeReference>() { }); - variableDefinitionList.get(0).setName("load_running_value_3"); + List variableDefinitionList = objectMapper.readValue(newVariableDefinitionsJson, new TypeReference<>() { }); + variableDefinitionList.getFirst().setName("load_running_value_3"); mvcResult = mvc.perform(post("/models/variables") .content(objectMapper.writeValueAsString(variableDefinitionList)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List savedVariableDefinitionList = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); + List savedVariableDefinitionList = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); // check result // must have the same number of input variable definitions - assertEquals(variableDefinitionList.size(), savedVariableDefinitionList.size()); + assertThat(savedVariableDefinitionList).hasSameSizeAs(variableDefinitionList); // --- Add existing variable definition to model --- // mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/add") @@ -576,9 +610,9 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // Get current variable definitions in the model List variableDefinitions6 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); - LOGGER.info("Updated variable definitions = " + variableDefinitions6); - // must have the same number of above input variable definitions - assertEquals(variableDefinitionList.size(), variableDefinitions6.size()); + LOGGER.info("Updated variable definitions = {}", variableDefinitions6); + // must have the same number of the above input variable definitions + assertThat(variableDefinitions6).hasSameSizeAs(variableDefinitionList); // --- add unknown existing variable definition to model => must fail fast --- // mvc.perform(patch("/models/" + modelName + "/variables/add") @@ -591,12 +625,12 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { .content(objectMapper.writeValueAsString(List.of(variableDefinitions.get(4).getName()))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List deletedVariableDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - LOGGER.info("Deleted variable definitions = " + deletedVariableDefinitionNames); + List deletedVariableDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + LOGGER.info("Deleted variable definitions = {}", deletedVariableDefinitionNames); // Check result - assertEquals(1, deletedVariableDefinitionNames.size()); - assertEquals(variableDefinitions.get(4).getName(), deletedVariableDefinitionNames.get(0)); + assertThat(deletedVariableDefinitionNames).hasSize(1); + assertThat(deletedVariableDefinitionNames.getFirst()).isEqualTo(variableDefinitions.get(4).getName()); } @@ -618,7 +652,7 @@ public void testSaveNewVariablesSetThenModifyVariableDefinitions() throws Except List variableDefinitions = variablesSet.getVariableDefinitions(); // Check result - assertEquals(2, variableDefinitions.size()); + assertThat(variableDefinitions).hasSize(2); // --- Put second time which add only a variable definition --- // mvcResult = mvc.perform(post("/models/variables-sets/" + variablesSet.getName() + "/variables") @@ -629,28 +663,28 @@ public void testSaveNewVariablesSetThenModifyVariableDefinitions() throws Except // Get variable definitions after adding VariablesSet variablesSet2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); List variableDefinitions2 = variablesSet2.getVariableDefinitions(); - LOGGER.info("Initial variable definitions = " + variableDefinitions); - LOGGER.info("Updated variable definitions = " + variableDefinitions2); + LOGGER.info("Initial variable definitions = {}", variableDefinitions); + LOGGER.info("Updated variable definitions = {}", variableDefinitions2); // Check result - assertEquals(4, variableDefinitions2.size()); + assertThat(variableDefinitions2).hasSize(4); // must contains all initial variable definitions - assertTrue(variableDefinitions2.containsAll(variableDefinitions)); + Assertions.assertThatDtoList(variableDefinitions2).recursivelyContainAll(variableDefinitions); // check in the database, must be 4 variable definitions, 2 in the initial set and 2 added later mvcResult = mvc.perform(get("/models/variable-definitions/names") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List foundVariableDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(4, foundVariableDefinitionNames.size()); + List foundVariableDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundVariableDefinitionNames).hasSize(4); mvcResult = mvc.perform(get("/models/variable-definitions") - .param("variableDefinitionNames", foundVariableDefinitionNames.stream().collect(Collectors.joining(","))) + .param("variableDefinitionNames", String.join(",", foundVariableDefinitionNames)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); List foundVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(4, foundVariableDefinitions.size()); + assertThat(foundVariableDefinitions).hasSize(4); // --- Remove an existing variable definition --- // mvcResult = mvc.perform(patch("/models/variables-sets/" + variablesSet.getName() + "/variables/remove") @@ -661,13 +695,13 @@ public void testSaveNewVariablesSetThenModifyVariableDefinitions() throws Except // Get current variable definitions VariablesSet variablesSet3 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); List variableDefinitions3 = variablesSet3.getVariableDefinitions(); - LOGGER.info("Updated variable definitions = " + variableDefinitions2); - LOGGER.info("Removed variable definitions = " + variableDefinitions3); + LOGGER.info("Updated variable definitions = {}", variableDefinitions2); + LOGGER.info("Removed variable definitions = {}", variableDefinitions3); // Check result - assertEquals(3, variableDefinitions3.size()); + assertThat(variableDefinitions3).hasSize(3); // must contains all variable definitions after removing - assertTrue(variableDefinitions2.containsAll(variableDefinitions3)); + Assertions.assertThatDtoList(variableDefinitions2).recursivelyContainAll(variableDefinitions3); // --- Remove all existing variable definition --- // mvcResult = mvc.perform(patch("/models/variables-sets/" + variablesSet.getName() + "/variables/remove-all") @@ -677,10 +711,10 @@ public void testSaveNewVariablesSetThenModifyVariableDefinitions() throws Except // Get current variable definitions after remove all VariablesSet variablesSet4 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); List variableDefinitions4 = variablesSet4.getVariableDefinitions(); - LOGGER.info("All removed variable definitions = " + variableDefinitions4); + LOGGER.info("All removed variable definitions = {}", variableDefinitions4); // Check result - assertEquals(0, variableDefinitions4.size()); + assertThat(variableDefinitions4).isEmpty(); } @@ -712,8 +746,8 @@ public void testSaveNewVariablesSetsWhichShareVariableDefinitions() throws Excep // --- Get initial variable definition from GET endpoint --- // mvcResult = mvc.perform(get("/models/variables-sets/" + threeWindingVariablesSet.getName() + "/variables")) .andExpect(status().isOk()).andReturn(); - List threeWindingVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(2, threeWindingVariableDefinitions.size()); + List threeWindingVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(threeWindingVariableDefinitions).hasSize(2); // --- Try to get variable definition from unknown variables set --- // mvc.perform(get("/models/variables-sets/" + "variable_set_unknown" + "/variables")) @@ -723,28 +757,28 @@ public void testSaveNewVariablesSetsWhichShareVariableDefinitions() throws Excep mvcResult = mvc.perform(get("/models/variables-sets/" + fourWindingVariablesSet.getName() + "/variables")) .andExpect(status().isOk()).andReturn(); - List fourWindingVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(3, fourWindingVariableDefinitions.size()); + List fourWindingVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(fourWindingVariableDefinitions).hasSize(3); // cross-check between two variables set Sets.SetView intersectionVariableDefinitions = Sets.intersection(new HashSet<>(fourWindingVariableDefinitions), new HashSet<>(threeWindingVariableDefinitions)); - assertEquals(2, intersectionVariableDefinitions.size()); + assertThat(intersectionVariableDefinitions).hasSize(2); // check in the database, must be 3 variable definitions, i.e. 2 shared variable definitions // and 1 in FourWindingsSynchronousGenerator mvcResult = mvc.perform(get("/models/variable-definitions/names") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List foundVariableDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(3, foundVariableDefinitionNames.size()); + List foundVariableDefinitionNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundVariableDefinitionNames).hasSize(3); mvcResult = mvc.perform(get("/models/variable-definitions") - .param("variableDefinitionNames", foundVariableDefinitionNames.stream().collect(Collectors.joining(","))) + .param("variableDefinitionNames", String.join(",", foundVariableDefinitionNames)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List foundVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(3, foundVariableDefinitions.size()); + List foundVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundVariableDefinitions).hasSize(3); } @@ -776,48 +810,48 @@ public void testSaveNewLoadModelsWhichShareParameterDefinitionsAndVariableDefini // --- Get variable definitions from GET endpoint --- // mvcResult = mvc.perform(get("/models/" + loadAlphaBetaModelName + "/variables")) .andExpect(status().isOk()).andReturn(); - List loadAlphaBetaVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(5, loadAlphaBetaVariableDefinitions.size()); + List loadAlphaBetaVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(loadAlphaBetaVariableDefinitions).hasSize(5); // --- Get initial parameter definitions from GET endpoint --- // mvcResult = mvc.perform(get("/models/" + loadAlphaBetaModelName + "/parameters/definitions")) .andExpect(status().isOk()).andReturn(); - List loadAlphaBetaParameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(6, loadAlphaBetaParameterDefinitions.size()); + List loadAlphaBetaParameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(loadAlphaBetaParameterDefinitions).hasSize(6); // --- Get variable definitions from GET endpoint --- // mvcResult = mvc.perform(get("/models/" + loadPQModelName + "/variables")) .andExpect(status().isOk()).andReturn(); - List loadPQVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(3, loadPQVariableDefinitions.size()); + List loadPQVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(loadPQVariableDefinitions).hasSize(3); // --- Get initial parameter definitions from GET endpoint --- // mvcResult = mvc.perform(get("/models/" + loadPQModelName + "/parameters/definitions")) .andExpect(status().isOk()).andReturn(); - List loadPQParameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(4, loadPQParameterDefinitions.size()); + List loadPQParameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(loadPQParameterDefinitions).hasSize(4); // cross-check variable definitions between two models Sets.SetView intersectionVariableDefinitions = Sets.intersection(new HashSet<>(loadAlphaBetaVariableDefinitions), new HashSet<>(loadPQVariableDefinitions)); - assertEquals(3, intersectionVariableDefinitions.size()); + assertThat(intersectionVariableDefinitions).hasSize(3); // cross-check parameter definitions between two models Sets.SetView intersectionParameterDefinitions = Sets.intersection(new HashSet<>(loadAlphaBetaParameterDefinitions), new HashSet<>(loadPQParameterDefinitions)); - assertEquals(3, intersectionParameterDefinitions.size()); + assertThat(intersectionParameterDefinitions).hasSize(3); // the last parameter definition of load alpha beta model must be NETWORK ModelParameterDefinition lastParameterDefinitionInLoadAlphaBetaModel = loadAlphaBetaParameterDefinitions.stream().reduce((first, second) -> second).get(); - assertEquals(ParameterOrigin.NETWORK, lastParameterDefinitionInLoadAlphaBetaModel.getOrigin()); + assertThat(lastParameterDefinitionInLoadAlphaBetaModel.getOrigin()).isEqualTo(ParameterOrigin.NETWORK); // the last parameter definition of load PQ model must be USER ModelParameterDefinition lastParameterDefinitionInLoadPQModel = loadPQParameterDefinitions.stream().reduce((first, second) -> second).get(); - assertEquals(ParameterOrigin.USER, lastParameterDefinitionInLoadPQModel.getOrigin()); + assertThat(lastParameterDefinitionInLoadPQModel.getOrigin()).isEqualTo(ParameterOrigin.USER); // two last parameter definitions in two models must be the same name, type, originName and fixedValue - assertEquals(lastParameterDefinitionInLoadAlphaBetaModel.getName(), lastParameterDefinitionInLoadPQModel.getName()); - assertEquals(lastParameterDefinitionInLoadAlphaBetaModel.getType(), lastParameterDefinitionInLoadPQModel.getType()); - assertEquals(lastParameterDefinitionInLoadAlphaBetaModel.getOriginName(), lastParameterDefinitionInLoadPQModel.getOriginName()); - assertEquals(lastParameterDefinitionInLoadAlphaBetaModel.getFixedValue(), lastParameterDefinitionInLoadPQModel.getFixedValue()); + assertThat(lastParameterDefinitionInLoadPQModel.getName()).isEqualTo(lastParameterDefinitionInLoadAlphaBetaModel.getName()); + assertThat(lastParameterDefinitionInLoadPQModel.getType()).isEqualTo(lastParameterDefinitionInLoadAlphaBetaModel.getType()); + assertThat(lastParameterDefinitionInLoadPQModel.getOriginName()).isEqualTo(lastParameterDefinitionInLoadAlphaBetaModel.getOriginName()); + assertThat(lastParameterDefinitionInLoadPQModel.getFixedValue()).isEqualTo(lastParameterDefinitionInLoadAlphaBetaModel.getFixedValue()); } @@ -837,11 +871,11 @@ public void testSaveGeneratorModel() throws Exception { ModelEntity savedModel = modelRepository.findByModelName(modelName).orElseThrow(); // sanity check - assertEquals(modelName, savedModel.getModelName()); - assertEquals(EquipmentType.GENERATOR, savedModel.getEquipmentType()); + assertThat(savedModel.getModelName()).isEqualTo(modelName); + assertThat(savedModel.getEquipmentType()).isEqualTo(EquipmentType.GENERATOR); // check variables sets - assertEquals(2, savedModel.getVariableSets().size()); + assertThat(savedModel.getVariableSets()).hasSize(2); } @Test @@ -865,15 +899,15 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { List variableDefinitionsOfVoltageRegulatorSet = variablesSet.stream().filter(set -> "VoltageRegulator".equals(set.getName())).findFirst().orElseThrow().getVariableDefinitions(); // Check result - assertEquals(2, variablesSet.size()); - assertEquals(4, variableDefinitionsOfGeneratorSet.size()); - assertEquals(1, variableDefinitionsOfVoltageRegulatorSet.size()); + assertThat(variablesSet).hasSize(2); + assertThat(variableDefinitionsOfGeneratorSet).hasSize(4); + assertThat(variableDefinitionsOfVoltageRegulatorSet.size()).isOne(); // --- Get initial variable sets from GET endpoint --- // mvcResult = mvc.perform(get("/models/" + model.getModelName() + "/variables-sets")) .andExpect(status().isOk()).andReturn(); - List variablesSet1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(2, variablesSet1.size()); + List variablesSet1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(variablesSet1).hasSize(2); // --- Try to get variable sets from unknown model --- // mvc.perform(get("/models/" + model.getModelName() + "_unknown" + "/variables")) @@ -894,10 +928,10 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { List variableDefinitionsOfRegulator2Set = variablesSet2.stream().filter(set -> "Generator2".equals(set.getName())).findFirst().orElseThrow().getVariableDefinitions(); // Check result - assertEquals(3, variablesSet2.size()); - assertEquals(4, variableDefinitionsOfGeneratorSet.size()); - assertEquals(1, variableDefinitionsOfVoltageRegulatorSet.size()); - assertEquals(2, variableDefinitionsOfRegulator2Set.size()); + assertThat(variablesSet2).hasSize(3); + assertThat(variableDefinitionsOfGeneratorSet).hasSize(4); + assertThat(variableDefinitionsOfVoltageRegulatorSet.size()).isOne(); + assertThat(variableDefinitionsOfRegulator2Set).hasSize(2); // --- Remove an existing variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/remove") @@ -910,9 +944,9 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { List variablesSet3 = model3.getVariablesSets(); // Check result - assertEquals(2, variablesSet3.size()); + assertThat(variablesSet3).hasSize(2); // must contains all variables sets after removing - assertTrue(variablesSet2.containsAll(variablesSet3)); + Assertions.assertThatDtoList(variablesSet2).recursivelyContainAll(variablesSet3); // --- Remove all variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/remove-all") @@ -924,7 +958,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { List variablesSet4 = model4.getVariablesSets(); // Check result - assertEquals(0, variablesSet4.size()); + assertThat(variablesSet4).isEmpty(); // --- Add an existing variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/add") @@ -937,7 +971,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { List variablesSet5 = model5.getVariablesSets(); // Check result - assertEquals(1, variablesSet5.size()); + assertThat(variablesSet5.size()).isOne(); // --- Add an unknown existing variables set => must fail fast --- // mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/add") @@ -950,26 +984,26 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { .content(objectMapper.writeValueAsString(List.of(variablesSet2.get(2).getName()))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List deletedVariablesSetNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); + List deletedVariablesSetNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); // Check result - assertEquals(1, deletedVariablesSetNames.size()); - assertEquals(variablesSet2.get(2).getName(), deletedVariablesSetNames.get(0)); + assertThat(deletedVariablesSetNames.size()).isOne(); + assertThat(deletedVariablesSetNames.getFirst()).isEqualTo(variablesSet2.get(2).getName()); // -- there is 2 variables set in database, i.e. two initial, one added, one deleted => remain 2 -- // mvcResult = mvc.perform(get("/models/variables-sets/names") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List foundVariableSetNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(2, foundVariableSetNames.size()); + List foundVariableSetNames = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundVariableSetNames).hasSize(2); mvcResult = mvc.perform(get("/models/variables-sets") - .param("variablesSetNames", foundVariableSetNames.stream().collect(Collectors.joining(","))) + .param("variablesSetNames", String.join(",", foundVariableSetNames)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List foundVariableSets = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(2, foundVariableSets.size()); + List foundVariableSets = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(foundVariableSets).hasSize(2); } @Test @@ -1012,11 +1046,17 @@ public void deleteTest() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()); - mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") + MvcResult mvcResult = mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json("[" + set + "]", true)); + .andReturn(); + + String setJson = mvcResult.getResponse().getContentAsString(); + List resultSetList = objectMapper.readValue(setJson, new TypeReference<>() { }); + ParametersSet expectedSet = objectMapper.readValue(set, ParametersSet.class); + + Assertions.assertThat(resultSetList.getFirst()).recursivelyEquals(expectedSet); // Trying to delete from a non-existing model will throw mvc.perform(delete("/models/" + "unknownModel" + "/parameters/sets/" + name + "/" + "FIXED" + "/" + name)) @@ -1032,11 +1072,15 @@ public void deleteTest() throws Exception { .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) .andExpect(content().json(setGroup)); - mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") + mvcResult = mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json("[" + set + "]", true)); + .andReturn(); + + setJson = mvcResult.getResponse().getContentAsString(); + resultSetList = objectMapper.readValue(setJson, new TypeReference<>() { }); + Assertions.assertThat(resultSetList.getFirst()).recursivelyEquals(expectedSet); // Delete the set mvc.perform(delete("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED" + "/" + name)) @@ -1051,11 +1095,13 @@ public void deleteTest() throws Exception { } """ .formatted(name, modelName))); - mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") + mvcResult = mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json("[]", true)); + .andReturn(); + List resultSets = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + Assertions.assertThat(resultSets).isEmpty(); } @Test @@ -1094,21 +1140,21 @@ public void testDeleteLoadModelsWhichShareParameterDefinitionsAndVariableDefinit // --- Check result --- // // model LOAD ALPHA BETA must be not exist in db Optional foundNoneExistingModelOpt = modelRepository.findByModelName(loadAlphaBetaModelName); - assertEquals(false, foundNoneExistingModelOpt.isPresent()); + assertThat(foundNoneExistingModelOpt).isNotPresent(); // must delete only 2 parameter definitions which are only used by load alpha beta // the rest 4 shared parameter definitions must be always present in db - List foundNoneExistingParameterDefinitions = modelParameterDefinitionRepository.findAllByName(List.of("load_alpha", "load_beta")); - assertEquals(0, foundNoneExistingParameterDefinitions.size()); - List foundExistingParameterDefinitions = modelParameterDefinitionRepository.findAllByName(List.of("load_P0Pu", "load_Q0Pu", "load_U0Pu", "load_UPhase0")); - assertEquals(4, foundExistingParameterDefinitions.size()); + List foundNoneExistingParameterDefinitions = modelParameterDefinitionRepository.findAllByNameIn(List.of("load_alpha", "load_beta")); + assertThat(foundNoneExistingParameterDefinitions).isEmpty(); + List foundExistingParameterDefinitions = modelParameterDefinitionRepository.findAllByNameIn(List.of("load_P0Pu", "load_Q0Pu", "load_U0Pu", "load_UPhase0")); + assertThat(foundExistingParameterDefinitions).hasSize(4); // must delete only 2 variable definitions which are only used by load alpha beta // the rest 3 shared variable definitions must be always present in db - List foundNoneExistingVariableDefinitions = modelVariableRepository.findAllByName(List.of("load_PRefPu", "load_running_value")); - assertEquals(0, foundNoneExistingVariableDefinitions.size()); - List foundExistingVariableDefinitions = modelVariableRepository.findAllByName(List.of("load_PPu", "load_QPu", "load_QRefPu")); - assertEquals(3, foundExistingVariableDefinitions.size()); + List foundNoneExistingVariableDefinitions = modelVariableRepository.findAllByNameIn(List.of("load_PRefPu", "load_running_value")); + assertThat(foundNoneExistingVariableDefinitions).isEmpty(); + List foundExistingVariableDefinitions = modelVariableRepository.findAllByNameIn(List.of("load_PPu", "load_QPu", "load_QRefPu")); + assertThat(foundExistingVariableDefinitions).hasSize(3); // --- Delete LOAD PQ --- // mvc.perform(delete("/models/") @@ -1119,12 +1165,12 @@ public void testDeleteLoadModelsWhichShareParameterDefinitionsAndVariableDefinit // --- Check result --- // // model LOAD PQ must be not exist in db foundNoneExistingModelOpt = modelRepository.findByModelName(loadPQModelName); - assertEquals(false, foundNoneExistingModelOpt.isPresent()); + assertThat(foundNoneExistingModelOpt).isNotPresent(); // db must not contain any parameter definition - assertEquals(0, modelParameterDefinitionRepository.findAll().size()); + assertThat(modelParameterDefinitionRepository.findAll()).isEmpty(); // db must not contain any variable definition - assertEquals(0, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).isEmpty(); } @@ -1143,10 +1189,10 @@ public void testDeleteGeneratorModelsWithVariableSets() throws Exception { // --- Check result --- // // This model has two variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllByName(List.of("Generator", "VoltageRegulator")); - assertEquals(2, variableSets.size()); + List variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("Generator", "VoltageRegulator")); + assertThat(variableSets).hasSize(2); // Variable set Generator contains 4 variable definitions and VoltageRegulator contains 1 variable definition => total = 5 - assertEquals(5, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).hasSize(5); // --- Delete model generator --- // mvc.perform(delete("/models/") @@ -1157,12 +1203,12 @@ public void testDeleteGeneratorModelsWithVariableSets() throws Exception { // --- Check result --- // // model generator model must be not exist in db Optional foundNoneExistingModelOpt = modelRepository.findByModelName(generatorModelName); - assertEquals(false, foundNoneExistingModelOpt.isPresent()); + assertThat(foundNoneExistingModelOpt).isNotPresent(); // db must not contain any variable set - assertEquals(0, modelVariablesSetRepository.findAll().size()); + assertThat(modelVariablesSetRepository.findAll()).isEmpty(); // db must not contain any variable definition - assertEquals(0, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).isEmpty(); } @Test @@ -1188,10 +1234,10 @@ public void testDeleteGeneratorModelsWhichShareVariableSets() throws Exception { // --- Check result --- // // These models have two shared variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllByName(List.of("Generator", "VoltageRegulator")); - assertEquals(2, variableSets.size()); + List variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("Generator", "VoltageRegulator")); + assertThat(variableSets).hasSize(2); // Variable set Generator contains 4 variable definitions and VoltageRegulator contains 1 variable definition => total = 5 - assertEquals(5, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).hasSize(5); // --- Delete model Three Windings Generator --- // mvc.perform(delete("/models/") @@ -1202,13 +1248,13 @@ public void testDeleteGeneratorModelsWhichShareVariableSets() throws Exception { // --- Check result --- // // model Three Windings Generator must be not exist in db Optional foundNoneExistingModelOpt = modelRepository.findByModelName(generatorModelThreeWindingsName); - assertEquals(false, foundNoneExistingModelOpt.isPresent()); + assertThat(foundNoneExistingModelOpt).isNotPresent(); - // These models have two shared variable sets => after delete one model, shared shared variable sets must be always in db - variableSets = modelVariablesSetRepository.findAllByName(List.of("Generator", "VoltageRegulator")); - assertEquals(2, variableSets.size()); + // These models have two shared variable sets => after delete one model, shared variable sets must be always in db + variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("Generator", "VoltageRegulator")); + assertThat(variableSets).hasSize(2); // Variable set Generator contains 4 variable definitions and VoltageRegulator contains 1 variable definition => total = 5 - assertEquals(5, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).hasSize(5); // --- Delete model Four Windings Generator --- // mvc.perform(delete("/models/") @@ -1219,13 +1265,13 @@ public void testDeleteGeneratorModelsWhichShareVariableSets() throws Exception { // --- Check result --- // // model Three Windings Generator must be not exist in db foundNoneExistingModelOpt = modelRepository.findByModelName(generatorModelFourWindingsName); - assertEquals(false, foundNoneExistingModelOpt.isPresent()); + assertThat(foundNoneExistingModelOpt).isNotPresent(); // the last model which uses shared variable sets has been deleted // db must not contain any variable set - assertEquals(0, modelVariablesSetRepository.findAll().size()); + assertThat(modelVariablesSetRepository.findAll()).isEmpty(); // db must not contain any variable definition - assertEquals(0, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).isEmpty(); } @@ -1252,10 +1298,10 @@ public void testDeleteGeneratorModelsWhichShareVariableDefinitionsBetweenDiffere // --- Check result --- // // These models have two shared 3 variables definitions between 2 different variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPQ", "GeneratorPV")); - assertEquals(2, variableSets.size()); + List variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("GeneratorPQ", "GeneratorPV")); + assertThat(variableSets).hasSize(2); // Variable set GeneratorPQ and GeneratorPV share 3 variable definitions - assertEquals(3, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).hasSize(3); // --- Delete model Generator PQ --- // mvc.perform(delete("/models/") @@ -1266,13 +1312,13 @@ public void testDeleteGeneratorModelsWhichShareVariableDefinitionsBetweenDiffere // --- Check result --- // // model Generator PQ must be not exist in db Optional foundNoneExistingModelOpt = modelRepository.findByModelName(generatorPQModelName); - assertEquals(false, foundNoneExistingModelOpt.isPresent()); + assertThat(foundNoneExistingModelOpt).isNotPresent(); // Variable set Generator PQ must be not exist in db - variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPQ")); - assertEquals(0, variableSets.size()); + variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("GeneratorPQ")); + assertThat(variableSets).isEmpty(); // 3 variable definitions used by variable set GeneratorPV must be always present in db - assertEquals(3, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).hasSize(3); // --- Delete model Generator PV --- // mvc.perform(delete("/models/") @@ -1281,10 +1327,10 @@ public void testDeleteGeneratorModelsWhichShareVariableDefinitionsBetweenDiffere .andExpect(status().isOk()).andReturn(); // Variable set Generator PV must be not exist in db - variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPV")); - assertEquals(0, variableSets.size()); + variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("GeneratorPV")); + assertThat(variableSets).isEmpty(); // 3 variable definitions used by variable set GeneratorPV must be not exist in db - assertEquals(0, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).isEmpty(); } @Test @@ -1310,10 +1356,11 @@ public void testDeleteAllGeneratorModelsWhichShareVariableDefinitionsBetweenDiff // --- Check result --- // // These models have two shared 3 variables definitions between 2 different variable sets => must be present in the db - List variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPQ", "GeneratorPV")); - assertEquals(2, variableSets.size()); + List variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("GeneratorPQ", "GeneratorPV")); + assertThat(variableSets).hasSize(2); // Variable set GeneratorPQ and GeneratorPV share 3 variable definitions - assertEquals(3, modelVariableRepository.findAll().size()); + List variables = modelVariableRepository.findAll(); + assertThat(variables).hasSize(3); // --- Delete model Generator PQ --- // mvc.perform(delete("/models/") @@ -1323,13 +1370,13 @@ public void testDeleteAllGeneratorModelsWhichShareVariableDefinitionsBetweenDiff // --- Check result --- // // model Generator PQ/PV must be not exist in db - List modelEntities = modelRepository.findAllByModelName(List.of(generatorPQModelName, generatorPVModelName)); - assertEquals(0, modelEntities.size()); + List modelEntities = modelRepository.findAllByModelNameIn(List.of(generatorPQModelName, generatorPVModelName)); + assertThat(modelEntities).isEmpty(); // Variable set Generator PQ/PV must be not exist in db - variableSets = modelVariablesSetRepository.findAllByName(List.of("GeneratorPV", "GeneratorPQ")); - assertEquals(0, variableSets.size()); + variableSets = modelVariablesSetRepository.findAllByNameIn(List.of("GeneratorPV", "GeneratorPQ")); + assertThat(variableSets).isEmpty(); // 3 variable definitions used by variable sets GeneratorPQ/PV must be not exist in db - assertEquals(0, modelVariableRepository.findAll().size()); + assertThat(modelVariableRepository.findAll()).isEmpty(); } } diff --git a/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java index 43c8ed6..96b8075 100644 --- a/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ParameterControllerTest.java @@ -9,12 +9,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.gridsuite.filter.expertfilter.ExpertFilter; import org.gridsuite.mapping.server.dto.InputMapping; +import org.gridsuite.mapping.server.dto.ParameterFile; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.model.*; import org.gridsuite.mapping.server.repository.ModelParameterDefinitionRepository; import org.gridsuite.mapping.server.repository.ModelRepository; import org.gridsuite.mapping.server.service.client.filter.FilterClient; import org.gridsuite.mapping.server.utils.*; +import org.gridsuite.mapping.server.utils.assertions.Assertions; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,6 +27,7 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.transaction.annotation.Transactional; import java.util.*; @@ -84,8 +87,8 @@ public void setUp() { ArrayList groupSets = new ArrayList<>(); ModelParameterSetEntity setToSave = new ModelParameterSetEntity(UUID.randomUUID(), "LAB", null, new Date(), loadGroup); ArrayList setParameters = new ArrayList<>(); - setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_alpha", setToSave.getId(), "1.5", setToSave)); - setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_beta", setToSave.getId(), "2.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_alpha", "1.5", setToSave)); + setParameters.add(new ModelParameterEntity(UUID.randomUUID(), "load_beta", "2.5", setToSave)); setToSave.setParameters(setParameters); groupSets.add(setToSave); loadGroup.setSets(groupSets); @@ -153,12 +156,19 @@ public void exportParametersTest() throws Exception { .andExpect(status().isOk()); // export parameter file - mvc.perform(get("/parameters/export") + MvcResult mvcResult = mvc.perform(get("/parameters/export") .queryParam("mappingName", name) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json(baseParameterFileJson(name, null), true)); + .andReturn(); + String resultParameterFileJson = objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(objectMapper.readTree(mvcResult.getResponse().getContentAsString())); + String expectedParameterFileJson = baseParameterFileJson(name, null); + + ParameterFile resultParameterFile = objectMapper.readValue(resultParameterFileJson, ParameterFile.class); + ParameterFile expectedParameterFile = objectMapper.readValue(expectedParameterFileJson, ParameterFile.class); + Assertions.assertThat(resultParameterFile).recursivelyEquals(expectedParameterFile); // try to export parameter file with unknown mapping mvc.perform(get("/parameters/export") @@ -210,11 +220,19 @@ public void parTest() throws Exception { .andExpect(status().isOk()); // export parameter file - mvc.perform(get("/parameters/export") + MvcResult mvcResult = mvc.perform(get("/parameters/export") .queryParam("mappingName", name) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json(baseParameterFileJson(name, objectMapper.writeValueAsString(parFile)), true)); + .andReturn(); + + String resultParameterFileJson = objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(objectMapper.readTree(mvcResult.getResponse().getContentAsString())); + String expectedParameterFileJson = baseParameterFileJson(name, objectMapper.writeValueAsString(parFile)); + + ParameterFile resultParameterFile = objectMapper.readValue(resultParameterFileJson, ParameterFile.class); + ParameterFile expectedParameterFile = objectMapper.readValue(expectedParameterFileJson, ParameterFile.class); + Assertions.assertThat(resultParameterFile).recursivelyEquals(expectedParameterFile); } } diff --git a/src/test/java/org/gridsuite/mapping/server/utils/assertions/Assertions.java b/src/test/java/org/gridsuite/mapping/server/utils/assertions/Assertions.java index f323c9d..07d9686 100644 --- a/src/test/java/org/gridsuite/mapping/server/utils/assertions/Assertions.java +++ b/src/test/java/org/gridsuite/mapping/server/utils/assertions/Assertions.java @@ -9,6 +9,10 @@ import org.assertj.core.util.CheckReturnValue; import org.gridsuite.filter.expertfilter.ExpertFilter; import org.gridsuite.mapping.server.dto.InputMapping; +import org.gridsuite.mapping.server.dto.ParameterFile; +import org.gridsuite.mapping.server.dto.models.ParametersSet; + +import java.util.List; /** * @author Tristan Chuine @@ -20,9 +24,22 @@ public static DTOAssert assertThat(T actu return new DTOAssert<>(actual); } + public static DTOAssert assertThat(T actual) { + return new DTOAssert<>(actual); + } + + public static DTOAssert assertThat(T actual) { + return new DTOAssert<>(actual); + } + @CheckReturnValue public static DTOAssert assertThat(T actual) { return new DTOAssert<>(actual); } + @CheckReturnValue + public static DTOAssert> assertThatDtoList(List actual) { + return new DTOAssert<>(actual); + } + } diff --git a/src/test/java/org/gridsuite/mapping/server/utils/assertions/DTOAssert.java b/src/test/java/org/gridsuite/mapping/server/utils/assertions/DTOAssert.java index a34eec7..13204aa 100644 --- a/src/test/java/org/gridsuite/mapping/server/utils/assertions/DTOAssert.java +++ b/src/test/java/org/gridsuite/mapping/server/utils/assertions/DTOAssert.java @@ -10,6 +10,7 @@ import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration; import java.time.ZonedDateTime; +import java.util.Comparator; import java.util.Date; import java.util.UUID; @@ -18,6 +19,19 @@ * @author Slimane Amar */ public class DTOAssert extends AbstractAssert, T> { + + // A comparator that uses the recursive configuration + Comparator recursiveComparator = (o1, o2) -> { + try { + Assertions.assertThat(o1) + .usingRecursiveComparison(getRecursiveConfiguration()) + .isEqualTo(o2); + return 0; // Equal according to recursive comparison + } catch (AssertionError e) { + return 1; // Not equal + } + }; + public DTOAssert(T actual) { super(actual, DTOAssert.class); } @@ -28,6 +42,18 @@ public DTOAssert recursivelyEquals(T other) { return myself; } + public DTOAssert recursivelyContainAll(T other) { + isNotNull(); + if (actual instanceof Iterable && other instanceof Iterable) { + Assertions.assertThat((Iterable) actual) + .usingElementComparator(recursiveComparator) + .containsAll((Iterable) other); + } else { + throw new AssertionError("Both actual and expected must be Iterables/Collections to use recursiveContainAll"); + } + return myself; + } + private RecursiveComparisonConfiguration getRecursiveConfiguration() { return RecursiveComparisonConfiguration.builder() .withIgnoreAllOverriddenEquals(true) // For equals test, need specific tests From 188c9b798bc5413b8cdc74ad6e5b5ce96f6a0c1a Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 24 Nov 2025 17:30:55 +0100 Subject: [PATCH 07/10] Enhance parameter set handling: ensure unique addition and merge existing sets by name in groups Signed-off-by: Thang PHAM --- .../mapping/server/model/ModelSetsGroupEntity.java | 1 + .../service/implementation/ModelServiceImpl.java | 11 +++++++++-- .../gridsuite/mapping/server/ModelControllerTest.java | 8 ++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java index 11d5b48..223e39f 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java @@ -63,6 +63,7 @@ public ModelSetsGroupEntity(ModelEntity model, ParametersSetsGroup group) { * @param parameterSet given parameter set */ public void addParameterSet(ModelParameterSetEntity parameterSet) { + this.sets.remove(parameterSet); // remove if already present, using id as a key this.sets.add(parameterSet); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java index fd55719..f7afb7e 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java @@ -226,8 +226,15 @@ public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersS if (previousGroup == null) { savedGroups.add(groupToAdd); } else { - // If additional checks are required here, ensure that set erasure cannot happen here with sets merging. - groupToAdd.getSets().forEach(previousGroup::addParameterSet); + // merge sets by name + groupToAdd.getSets().forEach(setToAdd -> { + // if set's name is existing in the group, consider the setToAdd as an update version by setting the same id + previousGroup.getSets().stream() + .filter(set -> set.getName().equals(setToAdd.getName())) + .findAny() + .ifPresent(existingSet -> setToAdd.setId(existingSet.getId())); + previousGroup.addParameterSet(setToAdd); + }); } if (new Model(modelToUpdate).isParameterSetGroupValid(setsGroup.getName(), strict)) { diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index 89dbdaa..c7dd521 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -186,7 +186,9 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isNotFound()); - Date setCreationDate = modelRepository.findByModelName(modelName).get().getSetsGroups().getFirst().getSets().getFirst().getLastModifiedDate(); + Date setCreationDate = modelRepository.findByModelName(modelName).get() + .getSetsGroups().getFirst() + .getSets().getFirst().getLastModifiedDate(); // Update data mvc.perform(post("/models/" + modelName + "/parameters/sets/strict") @@ -194,7 +196,9 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()); - Date setUpdateDate = modelRepository.findByModelName(modelName).get().getSetsGroups().getFirst().getSets().getFirst().getLastModifiedDate(); + Date setUpdateDate = modelRepository.findByModelName(modelName).get() + .getSetsGroups().getFirst() + .getSets().getFirst().getLastModifiedDate(); Assertions.assertThat(setCreationDate.compareTo(setUpdateDate) < 0).isTrue(); } From 93b287dc189b28d7b584766ac9b7bb6ce5d00b12 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 24 Nov 2025 18:15:13 +0100 Subject: [PATCH 08/10] Add preconditions to table drops and remove obsolete changelog file Signed-off-by: Thang PHAM --- .../changesets/changelog_20251117T141820Z.xml | 40 ----------- .../changesets/changelog_20251120T230357Z.xml | 69 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 4 -- 3 files changed, 69 insertions(+), 44 deletions(-) delete mode 100644 src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml diff --git a/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml b/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml deleted file mode 100644 index ed2d715..0000000 --- a/src/main/resources/db/changelog/changesets/changelog_20251117T141820Z.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml b/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml index 161bffd..afced60 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml @@ -2,6 +2,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 806a9f0..203b80c 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -44,10 +44,6 @@ databaseChangeLog: file: changesets/changelog_20240506T172219Z.xml relativeToChangelogFile: true - - include: - file: changesets/changelog_20251117T141820Z.xml - relativeToChangelogFile: true - - include: file: changesets/changelog_20251120T230357Z.xml relativeToChangelogFile: true From 702c0467f4c236cc01745dff9a0a2d44ca206607 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 5 Dec 2025 00:34:27 +0100 Subject: [PATCH 09/10] remove preCondition Signed-off-by: Thang PHAM --- .../changesets/changelog_20251120T230357Z.xml | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml b/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml index afced60..adb56b1 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20251120T230357Z.xml @@ -4,70 +4,37 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 0e9036f758da1b18ea5ee3e732c8f9416b6cbea3 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Wed, 10 Dec 2025 15:27:52 +0100 Subject: [PATCH 10/10] Remove equal and hashCode, EAGER fetch Signed-off-by: Thang PHAM --- .../mapping/server/model/ModelEntity.java | 2 -- .../ModelModelParameterDefinitionEntity.java | 8 ++++---- .../model/ModelModelParameterDefinitionId.java | 4 +--- .../model/ModelParameterDefinitionEntity.java | 7 ++++--- .../server/model/ModelParameterEntity.java | 7 ++++--- .../server/model/ModelParameterSetEntity.java | 9 +++++---- .../server/model/ModelSetsGroupEntity.java | 4 +--- .../model/ModelVariableDefinitionEntity.java | 7 ++++--- .../server/model/ModelVariableSetEntity.java | 7 ++++--- .../service/implementation/ModelServiceImpl.java | 16 ++++++++++------ 10 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java index 3c04b0e..fb3e3ad 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -23,7 +23,6 @@ /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @Builder @NoArgsConstructor @AllArgsConstructor @@ -34,7 +33,6 @@ public class ModelEntity implements Serializable { @Id - @EqualsAndHashCode.Include @Column(name = "id") private UUID id; diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java index afdf9ac..ece6a0a 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionEntity.java @@ -1,12 +1,14 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.utils.ParameterOrigin; import java.io.Serializable; -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @@ -17,13 +19,11 @@ public class ModelModelParameterDefinitionEntity implements Serializable { @EmbeddedId private ModelModelParameterDefinitionId id; - @EqualsAndHashCode.Include @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "model_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_model_parameter_definition_model_id_fk")) @MapsId("modelId") private ModelEntity model; - @EqualsAndHashCode.Include @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @JoinColumn(name = "parameter_definition_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "model_model_parameter_definition_parameter_definition_id_fk")) diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java index 3f19aee..952dd62 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelModelParameterDefinitionId.java @@ -6,17 +6,15 @@ import java.io.Serializable; import java.util.UUID; -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Embeddable public class ModelModelParameterDefinitionId implements Serializable { - @EqualsAndHashCode.Include private UUID modelId; - @EqualsAndHashCode.Include private UUID parameterDefinitionId; } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java index 80d7525..0713960 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -7,7 +7,10 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.utils.ParameterType; import org.springframework.data.annotation.CreatedDate; @@ -24,7 +27,6 @@ /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @@ -34,7 +36,6 @@ public class ModelParameterDefinitionEntity implements Serializable { @Id - @EqualsAndHashCode.Include @Column(name = "id") private UUID id; diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java index 5664295..acc3319 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java @@ -7,7 +7,10 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ModelParameter; import java.io.Serializable; @@ -16,7 +19,6 @@ /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @@ -25,7 +27,6 @@ @Table(name = "model_parameter", indexes = {@Index(name = "model_parameter_name_index", columnList = "name")}) public class ModelParameterEntity implements Serializable { - @EqualsAndHashCode.Include @Id @Column(name = "id") private UUID id; diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java index 21f56ad..16c8658 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -7,7 +7,10 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ParametersSet; import java.io.Serializable; @@ -19,7 +22,6 @@ /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @@ -28,7 +30,6 @@ @Table(name = "model_parameter_set", indexes = {@Index(name = "model_parameter_set_name_index", columnList = "name")}) public class ModelParameterSetEntity implements Serializable { - @EqualsAndHashCode.Include @Id @Column(name = "id") private UUID id; @@ -36,7 +37,7 @@ public class ModelParameterSetEntity implements Serializable { @Column(name = "name", nullable = false) private String name; - @OneToMany(fetch = FetchType.LAZY, mappedBy = "set", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "set", cascade = CascadeType.ALL, orphanRemoval = true) private List parameters; @Column(name = "last_modified_date") diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java index 223e39f..56413d0 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java @@ -20,7 +20,6 @@ /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @@ -37,7 +36,7 @@ public class ModelSetsGroupEntity implements Serializable { @Column(name = "name", nullable = false) private String name; - @OneToMany(fetch = FetchType.EAGER, mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) private List sets = new ArrayList<>(0); @Enumerated(EnumType.STRING) @@ -63,7 +62,6 @@ public ModelSetsGroupEntity(ModelEntity model, ParametersSetsGroup group) { * @param parameterSet given parameter set */ public void addParameterSet(ModelParameterSetEntity parameterSet) { - this.sets.remove(parameterSet); // remove if already present, using id as a key this.sets.add(parameterSet); } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java index edf6e14..6586cbc 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java @@ -8,7 +8,10 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ModelVariableDefinition; import org.gridsuite.mapping.server.utils.VariableType; import org.springframework.data.annotation.CreatedDate; @@ -22,7 +25,6 @@ /** * @author Thang PHAM */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @@ -32,7 +34,6 @@ public class ModelVariableDefinitionEntity implements Serializable { @Id - @EqualsAndHashCode.Include @Column(name = "id") private UUID id; diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java index 5816c36..58b1827 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java @@ -8,7 +8,10 @@ package org.gridsuite.mapping.server.model; import jakarta.persistence.*; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.VariablesSet; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; @@ -22,7 +25,6 @@ /** * @author Thang PHAM */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @@ -32,7 +34,6 @@ public class ModelVariableSetEntity implements Serializable { @Id - @EqualsAndHashCode.Include @Column(name = "id") private UUID id; diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java index f7afb7e..95a669e 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java @@ -227,14 +227,18 @@ public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersS savedGroups.add(groupToAdd); } else { // merge sets by name - groupToAdd.getSets().forEach(setToAdd -> { + groupToAdd.getSets().forEach(setToAdd -> // if set's name is existing in the group, consider the setToAdd as an update version by setting the same id previousGroup.getSets().stream() - .filter(set -> set.getName().equals(setToAdd.getName())) - .findAny() - .ifPresent(existingSet -> setToAdd.setId(existingSet.getId())); - previousGroup.addParameterSet(setToAdd); - }); + .filter(set -> set.getName().equals(setToAdd.getName())) + .findAny() + .ifPresent(existingSet -> { + setToAdd.setId(existingSet.getId()); + // replace the whole old set by the new set + previousGroup.removeParameterSet(existingSet); + previousGroup.addParameterSet(setToAdd); + }) + ); } if (new Model(modelToUpdate).isParameterSetGroupValid(setsGroup.getName(), strict)) {