From edcc34af43d0bbdc19e26908f10e8e964182d090 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 5 Jun 2023 19:11:55 +0200 Subject: [PATCH 01/16] Dynamic Simulation - Rework on model's parameters database --- .../server/controller/ModelController.java | 86 +++++++-- .../server/dto/models/ParametersSet.java | 2 +- .../dto/models/ParametersSetsGroup.java | 2 +- .../mapping/server/model/ModelEntity.java | 51 ++++- .../model/ModelParameterDefinitionEntity.java | 50 +++-- .../model/ModelParameterDefinitionId.java | 50 ----- .../server/model/ModelParameterEntity.java | 64 +++---- .../server/model/ModelParameterId.java | 60 ------ .../server/model/ModelParameterSetEntity.java | 75 ++++---- .../server/model/ModelParameterSetId.java | 57 ------ .../server/model/ModelSetsGroupEntity.java | 59 +++--- .../server/model/ModelSetsGroupId.java | 54 ------ .../ModelParameterDefinitionRepository.java | 9 + .../mapping/server/service/ModelService.java | 20 +- .../implementation/ModelServiceImpl.java | 142 ++++++++++++-- .../mapping/server/utils/Templater.java | 2 +- .../changesets/changelog_20230605T122651Z.xml | 126 +++++++++++++ .../db/changelog/db.changelog-master.yaml | 4 + .../mapping/server/ModelControllerTest.java | 178 ++++++++++++------ .../mapping/server/ModelEntitiesTest.java | 71 ------- .../mapping/server/ScriptControllerTest.java | 41 ++-- .../loadAlphaBeta_parameter_definitions.json | 8 + .../loadAlphaBeta_variable_definitions.json | 8 +- 23 files changed, 687 insertions(+), 532 deletions(-) delete mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java 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 create mode 100644 src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java create mode 100644 src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml delete mode 100644 src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java create mode 100644 src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json 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 438c9643..5ca42c9f 100644 --- a/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java +++ b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java @@ -60,21 +60,6 @@ public ResponseEntity saveSimpleParametersSet(@PathVariable return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveParametersSetsGroup(modelName, setsGroup, false)); } - @GetMapping(value = "/{modelName}/parameters/definitions/") - @Operation(summary = "get parameters definitions for a given model") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "parameters definitions of the model")}) - public ResponseEntity> getParametersDefinitionsFromModelName(@PathVariable("modelName") String modelName) { - return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getParametersDefinitionsFromModelName(modelName)); - } - - @GetMapping(value = "/") - @Operation(summary = "get models names") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "names of all models")}) - public ResponseEntity> getModels() { - return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getModels()); - } @PostMapping(value = "/") @Operation(summary = "Post a model") @@ -92,6 +77,73 @@ public ResponseEntity deleteSet(@PathVariable("modelName") return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.deleteSet(modelName, groupName, groupType, setName)); } + + @GetMapping(value = "/") + @Operation(summary = "get models names") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "names of all models")}) + public ResponseEntity> getModels() { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getModels()); + } + + // --- BEGIN parameter definition-related endpoints --- // + @GetMapping(value = "/{modelName}/parameters/definitions") + @Operation(summary = "get parameters definitions for a given model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "parameter definitions of the model")}) + public ResponseEntity> getParameterDefinitionsFromModel(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getParameterDefinitionsFromModel(modelName)); + } + + @PostMapping(value = "/{modelName}/parameters/definitions") + @Operation(summary = "Add new parameter definitions to model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "saved model")}) + public ResponseEntity addNewParameterDefinitionsToModel(@PathVariable("modelName") String modelName, @RequestBody List parameterDefinitions) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.addNewParameterDefinitionsToModel(modelName, parameterDefinitions)); + } + + @PatchMapping(value = "/{modelName}/parameters/definitions/add") + @Operation(summary = "Add existing parameter definitions to model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "saved model")}) + public ResponseEntity addExistingParameterDefinitionsToModel(@PathVariable("modelName") String modelName, @RequestBody List parameterDefinitionNames) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.addExistingParameterDefinitionsToModel(modelName, parameterDefinitionNames)); + } + + @PatchMapping(value = "/{modelName}/parameters/definitions/remove") + @Operation(summary = "Remove existing parameter definitions from model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "saved model")}) + public ResponseEntity removeExistingParameterDefinitionsFromModel(@PathVariable("modelName") String modelName, @RequestBody List parameterDefinitionNames) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeExistingParameterDefinitionsFromModel(modelName, parameterDefinitionNames)); + } + + @PatchMapping(value = "/{modelName}/parameters/definitions/remove-all") + @Operation(summary = "Reset empty parameter definitions on model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "saved model")}) + public ResponseEntity removeAllParameterDefinitionsFromModel(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeAllParameterDefinitionsOnModel(modelName)); + } + + @PostMapping(value = "/parameters/definitions") + @Operation(summary = "Save new parameter definitions") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Saved parameter definitions")}) + public ResponseEntity> saveNewParameterDefinitions(@RequestBody List parameterDefinitions) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveNewParameterDefinitions(parameterDefinitions)); + } + + @DeleteMapping(value = "/parameters/definitions") + @Operation(summary = "Delete parameter definitions") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Deleted parameter definitions")}) + public ResponseEntity> deleteParameterDefinitions(@RequestBody List parameterDefinitionNames) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.deleteParameterDefinitions(parameterDefinitionNames)); + } + // --- END parameter definition-related endpoints --- // + // --- BEGIN variable-related endpoints --- // @PostMapping(value = "/{modelName}/variables") @Operation(summary = "Add new variable definitions to model") @@ -113,7 +165,7 @@ public ResponseEntity addExistingVariablesToModel(@PathVariable("modelNam @Operation(summary = "Remove existing variable definitions from model") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "saved model")}) - public ResponseEntity removeExistingVariablesToModel(@PathVariable("modelName") String modelName, @RequestBody List variableDefinitionNames) { + public ResponseEntity removeExistingVariablesFromModel(@PathVariable("modelName") String modelName, @RequestBody List variableDefinitionNames) { return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeExistingVariableDefinitionsFromModel(modelName, variableDefinitionNames)); } @@ -121,7 +173,7 @@ public ResponseEntity removeExistingVariablesToModel(@PathVariable("model @Operation(summary = "Reset empty variable definitions on model") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "saved model")}) - public ResponseEntity removeAllVariablesToModel(@PathVariable("modelName") String modelName) { + public ResponseEntity removeAllVariablesOnModel(@PathVariable("modelName") String modelName) { return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeAllVariableDefinitionsOnModel(modelName)); } 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 16ce66e0..9aee68b1 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 @@ -27,7 +27,7 @@ public class ParametersSet { public ParametersSet(ModelParameterSetEntity modelParameterSetEntity) { name = modelParameterSetEntity.getName(); parameters = modelParameterSetEntity.getParameters().stream().map(ModelParameter::new).collect(Collectors.toList()); - lastModifiedDate = modelParameterSetEntity.getLastModifiedDate(); + lastModifiedDate = modelParameterSetEntity.getUpdatedDate(); } public ParametersSet(String name, List parameters) { 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 c4c0814c..113a6df5 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 @@ -33,6 +33,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/model/ModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java index 226c3b94..8c0af5f1 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -9,34 +9,40 @@ import lombok.*; import org.gridsuite.mapping.server.dto.models.Model; import org.gridsuite.mapping.server.utils.EquipmentType; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import javax.persistence.*; import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; +import static javax.persistence.TemporalType.TIMESTAMP; + /** * @author Mathieu Scalbert */ -@Getter -@Setter -@Table(name = "models") -@Entity +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @Builder @NoArgsConstructor @AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "models") public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity implements Serializable { // Could be replaced with UUID, but we lose the ease of use of names @Id + @EqualsAndHashCode.Include @Column(name = "model_name") private String modelName; @Column(name = "equipment_type") private EquipmentType equipmentType; - @OneToMany(targetEntity = ModelParameterDefinitionEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) - private List parameterDefinitions = new ArrayList<>(0); + @ManyToMany(targetEntity = ModelParameterDefinitionEntity.class, mappedBy = "models", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + private Set parameterDefinitions = new LinkedHashSet<>(0); @OneToMany(targetEntity = ModelSetsGroupEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) private List setsGroups = new ArrayList<>(0); @@ -55,13 +61,44 @@ public String getId() { public ModelEntity(Model modelToConvert) { modelName = modelToConvert.getModelName(); equipmentType = modelToConvert.getEquipmentType(); - parameterDefinitions = modelToConvert.getParameterDefinitions() != null ? modelToConvert.getParameterDefinitions().stream().map(parameterDefinition -> new ModelParameterDefinitionEntity(parameterDefinition.getName(), modelToConvert.getModelName(), parameterDefinition.getType(), parameterDefinition.getOrigin(), parameterDefinition.getOriginName(), parameterDefinition.getFixedValue(), this)).collect(Collectors.toList()) : null; + parameterDefinitions = modelToConvert.getParameterDefinitions() != null ? modelToConvert.getParameterDefinitions().stream().map(parameterDefinition -> new ModelParameterDefinitionEntity(this, parameterDefinition)).collect(Collectors.toSet()) : null; setsGroups = modelToConvert.getSetsGroups() != null ? modelToConvert.getSetsGroups().stream().map(group -> new ModelSetsGroupEntity(this, group)).collect(Collectors.toList()) : null; variableDefinitions = modelToConvert.getVariableDefinitions() != null ? modelToConvert.getVariableDefinitions().stream().map(variableDefinition -> new ModelVariableDefinitionEntity(this, null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)) : null; variableSets = modelToConvert.getVariablesSets() != null ? modelToConvert.getVariablesSets().stream().map(variablesSet -> new ModelVariableSetEntity(this, variablesSet)).collect(Collectors.toCollection(LinkedHashSet::new)) : null; } + @CreatedDate + @Temporal(TIMESTAMP) + @Column(name = "created_date", updatable = false) + private Date createdDate; + + @LastModifiedDate + @Temporal(TIMESTAMP) + @Column(name = "updated_date") + private Date updatedDate; + // --- utils methods --- // + + public void addSetsGroup(Collection setsGroups) { + setsGroups.forEach(setsGroup -> setsGroup.setModel(this)); + this.setsGroups.addAll(setsGroups); + } + + public void removeSetsGroup(Collection setsGroups) { + setsGroups.forEach(setsGroup -> setsGroup.setModel(null)); + this.setsGroups.removeAll(setsGroups); + } + + public void addParameterDefinitions(Collection parameterDefinitions) { + parameterDefinitions.forEach(parameterDefinition -> parameterDefinition.getModels().add(this)); + this.parameterDefinitions.addAll(parameterDefinitions); + } + + public void removeParameterDefinitions(Collection parameterDefinitions) { + parameterDefinitions.forEach(parameterDefinition -> parameterDefinition.getModels().remove(this)); + this.parameterDefinitions.removeAll(parameterDefinitions); + } + public void addVariableDefinitions(Collection variableDefinitions) { variableDefinitions.forEach(variableDefinition -> variableDefinition.getModels().add(this)); this.variableDefinitions.addAll(variableDefinitions); 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 624db623..c08e7e9e 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -6,37 +6,39 @@ */ package org.gridsuite.mapping.server.model; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; +import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.utils.ParameterOrigin; import org.gridsuite.mapping.server.utils.ParameterType; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import javax.persistence.*; import java.io.Serializable; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import static javax.persistence.TemporalType.TIMESTAMP; /** * @author Mathieu Scalbert */ -@Inheritance +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Entity -@Table(name = "model_parameter_definitions", indexes = {@Index(name = "model_parameter_definitions_model_name_index", columnList = "model_name")}) -@IdClass(ModelParameterDefinitionId.class) +@Table(name = "model_parameter_definitions") public class ModelParameterDefinitionEntity implements Serializable { @Id + @EqualsAndHashCode.Include @Column(name = "name") private String name; - @Id - @Column(name = "model_name") - private String modelName; - @Column(name = "type") @Enumerated private ParameterType type; @@ -51,8 +53,26 @@ public class ModelParameterDefinitionEntity implements Serializable { @Column(name = "fixed_value") private String fixedValue; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_parameter_definition_fk")) - @MapsId("modelName") - private ModelEntity model; + @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + @JoinTable( + name = "models_model_parameter_definitions", + joinColumns = {@JoinColumn(name = "parameter_definition_name", referencedColumnName = "name")}, + inverseJoinColumns = {@JoinColumn(name = "model_name")} + ) + private Set models; + + public ModelParameterDefinitionEntity(ModelEntity model, ModelParameterDefinition parameterDefinition) { + this(parameterDefinition.getName(), parameterDefinition.getType(), parameterDefinition.getOrigin(), parameterDefinition.getOriginName(), parameterDefinition.getFixedValue(), + model != null ? new LinkedHashSet<>(List.of(model)) : new LinkedHashSet<>(), null, null); + } + + @CreatedDate + @Temporal(TIMESTAMP) + @Column(name = "created_date", updatable = false) + private Date createdDate; + + @LastModifiedDate + @Temporal(TIMESTAMP) + @Column(name = "updated_date") + private Date updatedDate; } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java deleted file mode 100644 index 797305ee..00000000 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java +++ /dev/null @@ -1,50 +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 javax.persistence.Embeddable; -import java.io.Serializable; -import java.util.Objects; - -/** - * @author Mathieu Scalbert - */ -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -@Getter -@Setter -public class ModelParameterDefinitionId implements Serializable { - - private String name; - - private String modelName; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ModelParameterDefinitionId modelParameterDefinitionIdClass = (ModelParameterDefinitionId) o; - return name.equals(modelParameterDefinitionIdClass.name) && - modelName.equals(modelParameterDefinitionIdClass.modelName); - } - - @Override - public int hashCode() { - return Objects.hash(name, modelName); - } - -} 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 a9224b32..5d605203 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java @@ -6,68 +6,54 @@ */ package org.gridsuite.mapping.server.model; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.gridsuite.mapping.server.dto.models.ModelParameter; -import org.gridsuite.mapping.server.utils.SetGroupType; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import javax.persistence.*; import java.io.Serializable; +import java.util.Date; + +import static javax.persistence.TemporalType.TIMESTAMP; /** * @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")}) -@IdClass(ModelParameterId.class) public class ModelParameterEntity implements Serializable { @Id + @EqualsAndHashCode.Include @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 = "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) - }) - private ModelParameterSetEntity set; + @Id + @EqualsAndHashCode.Include + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + @JoinColumn(name = "set_name", referencedColumnName = "name", foreignKey = @ForeignKey(name = "parameter_set_parameter_fk"), updatable = false) + private ModelParameterSetEntity parameterSet; - public ModelParameterEntity(ModelParameterSetEntity set, ModelParameter parameter) { - this.set = set; - name = parameter.getName(); - groupName = set.getGroup().getName(); - groupType = set.getGroup().getType(); - modelName = set.getGroup().getModelName(); - setName = set.getName(); - value = parameter.getValue(); + public ModelParameterEntity(ModelParameterSetEntity parameterSet, ModelParameter parameter) { + this(parameter.getName(), parameter.getValue(), parameterSet, null, null); } + + @CreatedDate + @Temporal(TIMESTAMP) + @Column(name = "created_date", updatable = false) + private Date createdDate; + + @LastModifiedDate + @Temporal(TIMESTAMP) + @Column(name = "updated_date") + private Date updatedDate; } 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 ba828d7c..00000000 --- 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 javax.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/ModelParameterSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java index 5bedc427..edca16b8 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -6,69 +6,70 @@ */ package org.gridsuite.mapping.server.model; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.gridsuite.mapping.server.dto.models.ParametersSet; -import org.gridsuite.mapping.server.utils.SetGroupType; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import javax.persistence.*; import java.io.Serializable; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; +import static javax.persistence.TemporalType.TIMESTAMP; + /** * @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")}) -@IdClass(ModelParameterSetId.class) +@Table(name = "model_parameter_sets") public class ModelParameterSetEntity implements Serializable { @Id + @EqualsAndHashCode.Include @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) + @OneToMany(mappedBy = "parameterSet", cascade = {CascadeType.ALL}, orphanRemoval = true) private List parameters; - @Column(name = "last_modified_date") - private Date lastModifiedDate; - - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @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_name", referencedColumnName = "name", insertable = false, updatable = false), + @JoinColumn(name = "group_type", referencedColumnName = "type", 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(); + this(set.getName(), null, group, + null, null); + this.parameters = set.getParameters().stream().map(parameter -> new ModelParameterEntity(this, parameter)) + .collect(Collectors.toList()); + } + + @CreatedDate + @Temporal(TIMESTAMP) + @Column(name = "created_date", updatable = false) + private Date createdDate; + + @LastModifiedDate + @Temporal(TIMESTAMP) + @Column(name = "updated_date") + private Date updatedDate; + + // --- utils methods --- // + public void addParameters(Collection parameters) { + parameters.forEach(parameter -> parameter.setParameterSet(this)); + this.parameters.addAll(parameters); + } + + public void removeParameters(Collection parameters) { + parameters.forEach(parameter -> parameter.setParameterSet(null)); + this.parameters.removeAll(parameters); } } 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 31ec0ede..00000000 --- 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 javax.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/ModelSetsGroupEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java index 7bc28194..fdc0a1d8 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java @@ -6,57 +6,70 @@ */ package org.gridsuite.mapping.server.model; -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; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import javax.persistence.*; import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; +import static javax.persistence.TemporalType.TIMESTAMP; + /** * @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")}) -@IdClass(ModelSetsGroupId.class) public class ModelSetsGroupEntity implements Serializable { @Id + @EqualsAndHashCode.Include @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 + @EqualsAndHashCode.Include @Column(name = "type") private SetGroupType type; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_sets_groups_fk")) - @MapsId("modelName") + @OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) + private Set sets = new LinkedHashSet<>(0); + + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_sets_groups_fk"), updatable = false) private ModelEntity model; public ModelSetsGroupEntity(ModelEntity model, ParametersSetsGroup group) { - 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()); + this(group.getName(), group.getType(), null, model, null, null); + this.sets = group.getSets().stream().map(set -> new ModelParameterSetEntity(this, set)).collect(Collectors.toSet()); + } + + @CreatedDate + @Temporal(TIMESTAMP) + @Column(name = "created_date", updatable = false) + private Date createdDate; + + @LastModifiedDate + @Temporal(TIMESTAMP) + @Column(name = "updated_date") + private Date updatedDate; + + public void addSets(Collection parameterSets) { + parameterSets.forEach(parameterSet -> parameterSet.setGroup(this)); + this.sets.addAll(parameterSets); + } + + public void removeSets(Collection parameterSets) { + parameterSets.forEach(parameterSet -> parameterSet.setGroup(null)); + this.sets.removeAll(parameterSets); } } 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 78406434..00000000 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java +++ /dev/null @@ -1,54 +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 javax.persistence.Embeddable; -import java.io.Serializable; -import java.util.Objects; - -/** - * @author Mathieu Scalbert - */ -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -@Getter -@Setter -public class ModelSetsGroupId implements Serializable { - - private String name; - - private String modelName; - - 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/repository/ModelParameterDefinitionRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java new file mode 100644 index 00000000..72b8c0a0 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelParameterDefinitionRepository.java @@ -0,0 +1,9 @@ +package org.gridsuite.mapping.server.repository; + +import org.gridsuite.mapping.server.model.ModelParameterDefinitionEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ModelParameterDefinitionRepository extends JpaRepository { +} diff --git a/src/main/java/org/gridsuite/mapping/server/service/ModelService.java b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java index 5fc68c77..12b22e9a 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/ModelService.java +++ b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java @@ -16,8 +16,6 @@ */ public interface ModelService { - List getParametersDefinitionsFromModelName(String modelName); - List getModels(); List getSetsFromGroup(String modelName, String groupName, SetGroupType groupType); @@ -28,6 +26,23 @@ public interface ModelService { ParametersSetsGroup deleteSet(String modelName, String groupName, SetGroupType groupType, String setName); + // --- BEGIN parameter definition-related service methods --- // + List getParameterDefinitionsFromModel(String modelName); + + Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitions); + + Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames); + + Model removeExistingParameterDefinitionsFromModel(String modelName, List parameterDefinitionNames); + + Model removeAllParameterDefinitionsOnModel(String modelName); + + List saveNewParameterDefinitions(List parameterDefinitions); + + List deleteParameterDefinitions(List parameterDefinitionNames); + + // --- END parameter definition-related service methods --- // + // --- BEGIN variable-related service methods --- // Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitions); @@ -58,5 +73,6 @@ public interface ModelService { List deleteVariableDefinitions(List variableDefinitionNames); List deleteVariablesSets(List variablesSetNames); + // --- BEGIN variable-related service methods --- // } 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 0d82ad05..045a35a8 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 @@ -8,6 +8,7 @@ import org.gridsuite.mapping.server.dto.models.*; 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.repository.ModelVariableRepository; import org.gridsuite.mapping.server.repository.ModelVariablesSetRepository; @@ -33,31 +34,23 @@ public class ModelServiceImpl implements ModelService { public static final String VARIABLES_SET_NOT_FOUND = "Variables set not found: "; private final ModelRepository modelRepository; + private final ModelParameterDefinitionRepository modelParameterDefinitionRepository; private final ModelVariableRepository modelVariableRepository; private final ModelVariablesSetRepository modelVariablesSetRepository; @Autowired public ModelServiceImpl( ModelRepository modelRepository, + ModelParameterDefinitionRepository modelParameterDefinitionRepository, ModelVariableRepository modelVariableRepository, ModelVariablesSetRepository modelVariablesSetRepository ) { this.modelRepository = modelRepository; + this.modelParameterDefinitionRepository = modelParameterDefinitionRepository; this.modelVariableRepository = modelVariableRepository; this.modelVariablesSetRepository = modelVariablesSetRepository; } - @Override - public List getParametersDefinitionsFromModelName(String modelName) { - Optional foundModel = modelRepository.findById(modelName); - if (foundModel.isPresent()) { - Model modelToSend = new Model(foundModel.get()); - return modelToSend.getParameterDefinitions(); - } else { - throw new HttpClientErrorException(HttpStatus.NOT_FOUND); - } - } - @Override public List getModels() { return modelRepository.findAll().stream().map(modelEntity -> new SimpleModel(new Model(modelEntity))).collect(Collectors.toList()); @@ -85,7 +78,7 @@ public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersS List savedGroups = modelToUpdate.getSetsGroups(); ModelSetsGroupEntity previousGroup = savedGroups.stream().filter(savedGroup -> savedGroup.getName().equals(setsGroup.getName())).findAny().orElse(null); ModelSetsGroupEntity groupToAdd = new ModelSetsGroupEntity(modelToUpdate, setsGroup); - groupToAdd.getSets().forEach(set -> set.setLastModifiedDate(new Date())); + groupToAdd.getSets().forEach(set -> set.setUpdatedDate(new Date())); if (previousGroup == null) { savedGroups.add(groupToAdd); @@ -122,8 +115,8 @@ public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGrou .filter(setGroup -> setGroup.getName().equals(groupName) && setGroup.getType().equals(groupType)) .findAny() .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No group found")); - List sets = setsGroup.getSets(); - setsGroup.setSets(sets.stream().filter(set -> !set.getName().equals(setName)).collect(Collectors.toList())); + Set sets = setsGroup.getSets(); + setsGroup.setSets(sets.stream().filter(set -> !set.getName().equals(setName)).collect(Collectors.toSet())); modelRepository.save(modelToEdit); return new ParametersSetsGroup(setsGroup); } else { @@ -131,6 +124,123 @@ public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGrou } } + // --- BEGIN parameter definition-related service methods --- // + @Override + public List getParameterDefinitionsFromModel(String modelName) { + Optional foundModel = modelRepository.findById(modelName); + if (foundModel.isPresent()) { + Model modelToSend = new Model(foundModel.get()); + return modelToSend.getParameterDefinitions(); + } else { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND); + } + } + + @Override + public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitions) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + + // do merge with the list of parameter definitions + if (parameterDefinitions != null && !parameterDefinitions.isEmpty()) { + // do merge with existing list + List parameterDefinitionEntities = parameterDefinitions.stream() + .map(parameterDefinition -> new ModelParameterDefinitionEntity(modelToUpdate, parameterDefinition)) + .collect(Collectors.toList()); + modelToUpdate.addParameterDefinitions(parameterDefinitionEntities); + // save modified existing model entity + ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); + return new Model(savedModelEntity); + } else { + return new Model(modelToUpdate); + } + } + + @Override + public Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + + // do merge with the list of parameter definitions + if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + // find existing parameter definitions + List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); + + // check whether found all + if (foundParameterDefinitionEntities.size() != parameterDefinitionNames.size()) { + List foundNames = foundParameterDefinitionEntities.stream().map(ModelParameterDefinitionEntity::getName).collect(Collectors.toList()); + List notFoundNames = parameterDefinitionNames.stream().filter(name -> !foundNames.contains(name)).collect(Collectors.toList()); + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Some parameter definition not found: " + notFoundNames); + } + + // do merge with existing list + modelToUpdate.addParameterDefinitions(foundParameterDefinitionEntities); + + // save modified existing model entity + ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); + return new Model(savedModelEntity); + } else { + return new Model(modelToUpdate); + } + } + + @Override + public Model removeExistingParameterDefinitionsFromModel(String modelName, List parameterDefinitionNames) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + + // do remove in the list of parameter definitions + if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + // find existing variable definitions + List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); + + // remove in existing list + modelToUpdate.removeParameterDefinitions(foundParameterDefinitionEntities); + + // save modified existing model entity + ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); + return new Model(savedModelEntity); + } else { + return new Model(modelToUpdate); + } + } + + @Override + public Model removeAllParameterDefinitionsOnModel(String modelName) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + + // clear the existing list + modelToUpdate.removeParameterDefinitions(modelToUpdate.getParameterDefinitions()); + + // save modified existing model entity + ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); + return new Model(savedModelEntity); + } + + @Override + public List saveNewParameterDefinitions(List parameterDefinitions) { + if (parameterDefinitions != null && !parameterDefinitions.isEmpty()) { + Set parameterDefinitionEntities = parameterDefinitions.stream().map(variableDefinition -> new ModelParameterDefinitionEntity(null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)); + List savedParameterDefinitionEntities = modelParameterDefinitionRepository.saveAll(parameterDefinitionEntities); + return savedParameterDefinitionEntities.stream().map(ModelParameterDefinition::new).collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + @Override + public List deleteParameterDefinitions(List parameterDefinitionNames) { + if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + modelParameterDefinitionRepository.deleteAllById(parameterDefinitionNames); + } + return parameterDefinitionNames; + } + // --- END parameter definition-related service methods --- // + // --- BEGIN variable-related service methods --- // @Override @Transactional @@ -142,7 +252,9 @@ public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitionEntities = variableDefinitions.stream().map(variableDefinition -> new ModelVariableDefinitionEntity(modelToUpdate, null, variableDefinition)).collect(Collectors.toList()); + List variableDefinitionEntities = variableDefinitions.stream() + .map(variableDefinition -> new ModelVariableDefinitionEntity(modelToUpdate, null, variableDefinition)) + .collect(Collectors.toList()); modelToUpdate.addVariableDefinitions(variableDefinitionEntities); // save modified existing model entity ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index 1a1609f4..f80204ad 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -69,7 +69,7 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi String[] rulesScripts = sortedRules.getRules().stream().map(flatRule -> { ST ruleScript = new ST(ruleTemplate); ruleScript.add("composition", flatRule.getComposition()); - ruleScript.add("modelName", flatRule.getMappedModel().getModelName()); + ruleScript.add("modelName", flatRule.getMappedModel().getModel().getModelName()); ruleScript.add("parameterSetId", modelToParamSetId(flatRule.getMappedModel())); return ruleScript.render(); }).toArray(String[]::new); diff --git a/src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml new file mode 100644 index 00000000..703c964d --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 42204033..1c64ba09 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -15,3 +15,7 @@ databaseChangeLog: - include: file: changesets/changelog_20230531T113101Z.xml relativeToChangelogFile: true + + - include: + file: changesets/changelog_20230605T122651Z.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 3af0db43..a0e54796 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -9,9 +9,11 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.gridsuite.mapping.server.dto.models.Model; +import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ModelVariableDefinition; import org.gridsuite.mapping.server.dto.models.VariablesSet; 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.repository.ModelVariableRepository; import org.gridsuite.mapping.server.repository.ModelVariablesSetRepository; @@ -35,10 +37,7 @@ import java.nio.file.Files; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.Assert.assertEquals; @@ -61,6 +60,10 @@ public class ModelControllerTest { @Autowired private ModelRepository modelRepository; + + @Autowired + private ModelParameterDefinitionRepository modelParameterDefinitionRepository; + @Autowired private ModelVariableRepository modelVariableRepository; @Autowired @@ -72,14 +75,15 @@ public class ModelControllerTest { @Autowired ObjectMapper objectMapper; - private void cleanDB() { + public void cleanDB() { modelVariableRepository.deleteAll(); modelVariablesSetRepository.deleteAll(); + modelParameterDefinitionRepository.deleteAll(); modelRepository.deleteAll(); } private ModelParameterDefinitionEntity createDefinitionEntity(String name, ParameterType type, ParameterOrigin origin, String originName, ModelEntity model) { - return new ModelParameterDefinitionEntity(name, model.getModelName(), type, origin, originName, null, model); + return new ModelParameterDefinitionEntity(model, new ModelParameterDefinition(name, type, origin, originName, null)); } @Before @@ -88,7 +92,7 @@ public void setUp() { // prepare token model ModelEntity modelToSave = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, - null, new ArrayList<>(), Set.of(), Set.of()); + new LinkedHashSet<>(), new ArrayList<>(), Set.of(), Set.of(), null, null); ArrayList definitions = new ArrayList<>(); definitions.add(createDefinitionEntity("load_alpha", ParameterType.DOUBLE, ParameterOrigin.USER, null, modelToSave)); definitions.add(createDefinitionEntity("load_beta", ParameterType.DOUBLE, ParameterOrigin.USER, null, modelToSave)); @@ -96,7 +100,7 @@ public void setUp() { definitions.add(createDefinitionEntity("load_Q0Pu", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "q_pu", modelToSave)); definitions.add(createDefinitionEntity("load_U0Pu", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "v_pu", modelToSave)); definitions.add(createDefinitionEntity("load_UPhase0", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "angle_pu", modelToSave)); - modelToSave.setParameterDefinitions(definitions); + modelToSave.addParameterDefinitions(definitions); modelRepository.save(modelToSave); } @@ -144,7 +148,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 createdDate = new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets()).get(0).getCreatedDate(); // Update data mvc.perform(post("/models/" + modelName + "/parameters/sets/strict") @@ -152,9 +156,9 @@ 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 updatedDate = new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets()).get(0).getUpdatedDate(); - assertThat(setCreationDate.compareTo(setUpdateDate) < 0); + assertThat(createdDate.compareTo(updatedDate) < 0); } @Test @@ -172,7 +176,7 @@ public void definitionTest() throws Exception { "{\"name\":\"load_Q0Pu\",\"type\":\"DOUBLE\",\"origin\":\"NETWORK\",\"originName\":\"q_pu\",\"fixedValue\":null},\n" + "{\"name\":\"load_U0Pu\",\"type\":\"DOUBLE\",\"origin\":\"NETWORK\",\"originName\":\"v_pu\",\"fixedValue\":null},\n" + "{\"name\":\"load_UPhase0\",\"type\":\"DOUBLE\",\"origin\":\"NETWORK\",\"originName\":\"angle_pu\",\"fixedValue\":null}\n" + - "]", true)); + "]", false)); } @Test @@ -209,29 +213,23 @@ public void invalidTest() throws Exception { @Test @Transactional public void getTest() throws Exception { + // Prepare models ModelEntity loadModel = modelRepository.findById("LoadAlphaBeta").get(); - List loadGroups = loadModel.getSetsGroups(); - ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", loadModel.getModelName(), null, SetGroupType.FIXED, loadModel); - ArrayList groupSets = new ArrayList<>(); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", loadGroup.getName(), loadModel.getModelName(), loadGroup.getType(), - 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)); - setToSave.setParameters(setParameters); - groupSets.add(setToSave); - loadGroup.setSets(groupSets); - loadGroups.add(loadGroup); - loadModel.setSetsGroups(loadGroups); + ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, new LinkedHashSet<>(), loadModel, null, null); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", new ArrayList<>(), loadGroup, null, null); + List setParameters = new ArrayList<>(); + setParameters.add(new ModelParameterEntity("load_alpha", "1.5", setToSave, null, null)); + setParameters.add(new ModelParameterEntity("load_beta", "2.5", setToSave, null, null)); + setToSave.addParameters(setParameters); + loadGroup.addSets(Set.of(setToSave)); + loadModel.addSetsGroup(Set.of(loadGroup)); modelRepository.save(loadModel); - ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, new ArrayList<>(), null, Set.of(), Set.of()); + ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, Set.of(), null, Set.of(), Set.of(), null, null); ArrayList generatorThreeGroups = new ArrayList<>(); - generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", generatorThreeModel.getModelName(), new ArrayList<>(), SetGroupType.PREFIX, generatorThreeModel)); - generatorThreeModel.setSetsGroups(generatorThreeGroups); + generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", SetGroupType.PREFIX, null, generatorThreeModel, null, null)); + generatorThreeModel.addSetsGroup(generatorThreeGroups); modelRepository.save(generatorThreeModel); mvc.perform(get("/models/") @@ -249,41 +247,103 @@ public static String readFileAsString(String file) throws Exception { } @Test - @Transactional - public void testSaveLoadModel() throws Exception { + public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { String modelName = "LoadAlphaBeta"; - ModelEntity previousModel = modelRepository.findById(modelName).orElseThrow(); - String newModel = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta.json"); + String newModelJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta.json"); + String newParameterDefinitionsJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json"); + cleanDB(); - // Put data - mvc.perform(post("/models/") - .content(newModel) + // Put data first time with initial parameter definitions + MvcResult mvcResult = mvc.perform(post("/models/") + .content(newModelJson) .contentType(APPLICATION_JSON)) - .andExpect(status().isOk()); + .andExpect(status().isOk()).andReturn(); - // Get Data - ModelEntity savedModel = modelRepository.findById(modelName).orElseThrow(); + // Get initial parameter definitions + List parameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + assertEquals(6, parameterDefinitions.size()); + + // Put data second time which add only a parameter definition + MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/parameters/definitions") + .content(newParameterDefinitionsJson) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); - assertEquals(previousModel.getModelName(), savedModel.getModelName()); - assertEquals(previousModel.getEquipmentType(), savedModel.getEquipmentType()); - List previousDefinitions = previousModel.getParameterDefinitions(); - List savedDefinitions = savedModel.getParameterDefinitions(); - assertEquals(previousDefinitions.size(), savedDefinitions.size()); - for (int i = 0; i < previousDefinitions.size(); i++) { - ModelParameterDefinitionEntity previousDefinition = previousDefinitions.get(i); - ModelParameterDefinitionEntity savedDefinition = savedDefinitions.get(i); - assertEquals(previousDefinition.getName(), savedDefinition.getName()); - assertEquals(previousDefinition.getModelName(), savedDefinition.getModelName()); - assertEquals(previousDefinition.getType(), savedDefinition.getType()); - assertEquals(previousDefinition.getOrigin(), savedDefinition.getOrigin()); - assertEquals(previousDefinition.getOriginName(), savedDefinition.getOriginName()); - assertEquals(previousDefinition.getFixedValue(), savedDefinition.getFixedValue()); - } - // Import does not check sets because it is not part of the typical model import - - // test variable definitions - assertEquals(5, savedModel.getVariableDefinitions().size()); + // Get current parameter definitions + List parameterDefinitions2 = objectMapper.readValue(mvcResult2.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + 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)); + + // Remove an existing variable definition + MvcResult mvcResult3 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove") + .content(objectMapper.writeValueAsString(List.of(parameterDefinitions2.get(5).getName()))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + // Get current parameter definitions + List parameterDefinitions3 = objectMapper.readValue(mvcResult3.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + 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)); + + // remove all parameter definitions + MvcResult mvcResult4 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove-all") + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + List parameterDefinitions4 = objectMapper.readValue(mvcResult4.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + LOGGER.info("Unset parameter definitions = " + parameterDefinitions4); + + // check result + // must have no parameter definition + assertEquals(0, parameterDefinitions4.size()); + + // save new parameter definition + List parameterDefinitionList = objectMapper.readValue(newParameterDefinitionsJson, new TypeReference>() { }); + parameterDefinitionList.get(0).setName("load_UPhase0_3"); + MvcResult mvcResult5 = mvc.perform(post("/models/parameters/definitions") + .content(objectMapper.writeValueAsString(parameterDefinitionList)) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + List savedParameterDefinitionList = objectMapper.readValue(mvcResult5.getResponse().getContentAsString(), new TypeReference>() { }); + + // check result + // must have the same number of input variable definitions + assertEquals(parameterDefinitionList.size(), savedParameterDefinitionList.size()); + + // add existing parameter definition to model + MvcResult mvcResult6 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") + .content(objectMapper.writeValueAsString(savedParameterDefinitionList.stream().map(ModelParameterDefinition::getName))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + // Get current parameter definitions in the model + List parameterDefinitions6 = objectMapper.readValue(mvcResult6.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + LOGGER.info("Updated parameter definitions = " + parameterDefinitions6); + // must have the same number of above input parameter definitions + assertEquals(savedParameterDefinitionList.size(), parameterDefinitions6.size()); + + // --- delete definitively a parameter definition --- // + mvcResult = mvc.perform(delete("/models/parameters/definitions") + .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); + + // Check result + assertEquals(1, deletedParameterDefinitionNames.size()); + assertEquals(parameterDefinitions.get(4).getName(), deletedParameterDefinitionNames.get(0)); } @Test 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 de2f11ee..00000000 --- a/src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java +++ /dev/null @@ -1,71 +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.ModelParameterDefinitionId; -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 parameterDefinitionIdTestEqualHashCode() { - ModelParameterDefinitionId id = new ModelParameterDefinitionId("name", "modelName"); - ModelParameterDefinitionId id2 = new ModelParameterDefinitionId("name", "modelName"); - - assertEquals(id, id); - assertEquals(id, id2); - assertNotEquals(null, id); - assertNotEquals("id", id); - } - - @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); - } -} diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index 0aad767d..a9755f66 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -6,7 +6,9 @@ */ package org.gridsuite.mapping.server; +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.repository.ScriptRepository; import org.gridsuite.mapping.server.utils.EquipmentType; @@ -25,7 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Date; +import java.util.LinkedHashSet; import java.util.Set; import static org.springframework.http.MediaType.APPLICATION_JSON; @@ -47,16 +49,20 @@ public class ScriptControllerTest { @Autowired private MockMvc mvc; + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ModelParameterDefinitionRepository modelParameterDefinitionRepository; + private void cleanDB() { scriptRepository.deleteAll(); + modelParameterDefinitionRepository.deleteAll(); modelRepository.deleteAll(); } - @Autowired - private ModelRepository modelRepository; - private ModelParameterDefinitionEntity createDefinitionEntity(String name, ParameterType type, ParameterOrigin origin, String originName, ModelEntity model) { - return new ModelParameterDefinitionEntity(name, model.getModelName(), type, origin, originName, null, model); + return new ModelParameterDefinitionEntity(model, new ModelParameterDefinition(name, type, origin, originName, null)); } @Before @@ -64,17 +70,14 @@ public void setUp() { cleanDB(); // Prepare models - ModelEntity loadModel = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, null, null, Set.of(), Set.of()); + ModelEntity loadModel = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, new LinkedHashSet<>(), null, Set.of(), Set.of(), null, null); ArrayList loadGroups = new ArrayList<>(); - ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", loadModel.getModelName(), null, SetGroupType.FIXED, loadModel); - ArrayList groupSets = new ArrayList<>(); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", loadGroup.getName(), loadModel.getModelName(), loadGroup.getType(), - null, - new Date(), - loadGroup); + ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, null, loadModel, null, null); + Set groupSets = new LinkedHashSet<>(); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", null, loadGroup, null, null); 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("load_alpha", "1.5", setToSave, null, null)); + setParameters.add(new ModelParameterEntity("load_beta", "2.5", setToSave, null, null)); setToSave.setParameters(setParameters); groupSets.add(setToSave); loadGroup.setSets(groupSets); @@ -88,18 +91,18 @@ public void setUp() { definitions.add(createDefinitionEntity("load_Q0Pu", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "q_pu", loadModel)); definitions.add(createDefinitionEntity("load_U0Pu", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "v_pu", loadModel)); definitions.add(createDefinitionEntity("load_UPhase0", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "angle_pu", loadModel)); - loadModel.setParameterDefinitions(definitions); + loadModel.addParameterDefinitions(definitions); modelRepository.save(loadModel); - ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, null, null, null, null); + ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, 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("GSTWPR", SetGroupType.PREFIX, null, generatorThreeModel, null, null)); generatorThreeModel.setSetsGroups(generatorThreeGroups); modelRepository.save(generatorThreeModel); - ModelEntity generatorFourModel = new ModelEntity("GeneratorFourWindings", EquipmentType.GENERATOR, null, null, null, null); + ModelEntity generatorFourModel = new ModelEntity("GeneratorFourWindings", EquipmentType.GENERATOR, 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("GSFWPR", SetGroupType.PREFIX, null, generatorFourModel, null, null)); generatorFourModel.setSetsGroups(generatorFourGroups); modelRepository.save(generatorFourModel); } diff --git a/src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json b/src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json new file mode 100644 index 00000000..6f5e33c1 --- /dev/null +++ b/src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json @@ -0,0 +1,8 @@ +[ + { + "name": "load_UPhase0_2", + "type": "DOUBLE", + "origin": "NETWORK", + "originName": "angle_pu" + } +] diff --git a/src/test/resources/data/model/load/loadAlphaBeta_variable_definitions.json b/src/test/resources/data/model/load/loadAlphaBeta_variable_definitions.json index cd14be1d..1aa121ab 100644 --- a/src/test/resources/data/model/load/loadAlphaBeta_variable_definitions.json +++ b/src/test/resources/data/model/load/loadAlphaBeta_variable_definitions.json @@ -1,6 +1,6 @@ [ - { - "name": "load_running_value_2", - "type": "DOUBLE" - } + { + "name": "load_running_value_2", + "type": "DOUBLE" + } ] From 79e65a9246dd523f18d1202041ec2d04c619fd2c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 5 Jun 2023 20:15:43 +0200 Subject: [PATCH 02/16] Remove all related rework on model's parameters --- .../server/controller/ModelController.java | 2 - .../server/dto/models/ParametersSet.java | 2 +- .../dto/models/ParametersSetsGroup.java | 2 +- .../mapping/server/model/ModelEntity.java | 10 -- .../server/model/ModelParameterEntity.java | 64 +++++---- .../server/model/ModelParameterId.java | 60 +++++++++ .../server/model/ModelParameterSetEntity.java | 75 +++++------ .../server/model/ModelParameterSetId.java | 57 ++++++++ .../server/model/ModelSetsGroupEntity.java | 59 ++++---- .../server/model/ModelSetsGroupId.java | 54 ++++++++ .../implementation/ModelServiceImpl.java | 6 +- .../mapping/server/utils/Templater.java | 2 +- .../changesets/changelog_20230605T122651Z.xml | 126 ------------------ .../changesets/changelog_20230605T173446Z.xml | 51 +++++++ .../db/changelog/db.changelog-master.yaml | 2 +- .../mapping/server/ModelControllerTest.java | 34 +++-- .../mapping/server/ModelEntitiesTest.java | 60 +++++++++ .../mapping/server/ScriptControllerTest.java | 20 +-- 18 files changed, 420 insertions(+), 266 deletions(-) create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java delete mode 100644 src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml create mode 100644 src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml create mode 100644 src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java 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 5ca42c9f..332f145b 100644 --- a/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java +++ b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java @@ -60,7 +60,6 @@ public ResponseEntity saveSimpleParametersSet(@PathVariable return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveParametersSetsGroup(modelName, setsGroup, false)); } - @PostMapping(value = "/") @Operation(summary = "Post a model") @ApiResponses(value = { @@ -77,7 +76,6 @@ public ResponseEntity deleteSet(@PathVariable("modelName") return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.deleteSet(modelName, groupName, groupType, setName)); } - @GetMapping(value = "/") @Operation(summary = "get models names") @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 9aee68b1..16ce66e0 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 @@ -27,7 +27,7 @@ public class ParametersSet { public ParametersSet(ModelParameterSetEntity modelParameterSetEntity) { name = modelParameterSetEntity.getName(); parameters = modelParameterSetEntity.getParameters().stream().map(ModelParameter::new).collect(Collectors.toList()); - lastModifiedDate = modelParameterSetEntity.getUpdatedDate(); + lastModifiedDate = modelParameterSetEntity.getLastModifiedDate(); } public ParametersSet(String name, List parameters) { 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 113a6df5..c4c0814c 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 @@ -33,6 +33,6 @@ public ParametersSetsGroup(ModelSetsGroupEntity setsGroupEntity) { name = setsGroupEntity.getName(); type = setsGroupEntity.getType(); sets = setsGroupEntity.getSets().stream().map(ParametersSet::new).collect(Collectors.toList()); - modelName = setsGroupEntity.getModel().getModelName(); + modelName = setsGroupEntity.getModelName(); } } 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 8c0af5f1..2a8c9403 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -79,16 +79,6 @@ public ModelEntity(Model modelToConvert) { // --- utils methods --- // - public void addSetsGroup(Collection setsGroups) { - setsGroups.forEach(setsGroup -> setsGroup.setModel(this)); - this.setsGroups.addAll(setsGroups); - } - - public void removeSetsGroup(Collection setsGroups) { - setsGroups.forEach(setsGroup -> setsGroup.setModel(null)); - this.setsGroups.removeAll(setsGroups); - } - public void addParameterDefinitions(Collection parameterDefinitions) { parameterDefinitions.forEach(parameterDefinition -> parameterDefinition.getModels().add(this)); this.parameterDefinitions.addAll(parameterDefinitions); 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 5d605203..a9224b32 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java @@ -6,54 +6,68 @@ */ package org.gridsuite.mapping.server.model; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ModelParameter; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; +import org.gridsuite.mapping.server.utils.SetGroupType; import javax.persistence.*; import java.io.Serializable; -import java.util.Date; - -import static javax.persistence.TemporalType.TIMESTAMP; /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@Inheritance @NoArgsConstructor @AllArgsConstructor @Getter @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 - @EqualsAndHashCode.Include @Column(name = "name") private String name; - @Column(name = "value_") - private String value; + @Id + @Column(name = "model_name") + private String modelName; @Id - @EqualsAndHashCode.Include - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinColumn(name = "set_name", referencedColumnName = "name", foreignKey = @ForeignKey(name = "parameter_set_parameter_fk"), updatable = false) - private ModelParameterSetEntity parameterSet; + @Column(name = "group_name") + private String groupName; - public ModelParameterEntity(ModelParameterSetEntity parameterSet, ModelParameter parameter) { - this(parameter.getName(), parameter.getValue(), parameterSet, null, null); - } + @Id + @Column(name = "group_type") + private SetGroupType groupType; - @CreatedDate - @Temporal(TIMESTAMP) - @Column(name = "created_date", updatable = false) - private Date createdDate; + @Id + @Column(name = "set_name") + private String setName; + + @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) + }) + private ModelParameterSetEntity set; - @LastModifiedDate - @Temporal(TIMESTAMP) - @Column(name = "updated_date") - private Date updatedDate; + public ModelParameterEntity(ModelParameterSetEntity set, ModelParameter parameter) { + this.set = set; + name = parameter.getName(); + groupName = set.getGroup().getName(); + groupType = set.getGroup().getType(); + modelName = set.getGroup().getModelName(); + setName = set.getName(); + value = parameter.getValue(); + } } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java new file mode 100644 index 00000000..ba828d7c --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java @@ -0,0 +1,60 @@ +/** + * 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 javax.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/ModelParameterSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java index edca16b8..5bedc427 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -6,70 +6,69 @@ */ package org.gridsuite.mapping.server.model; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ParametersSet; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; +import org.gridsuite.mapping.server.utils.SetGroupType; import javax.persistence.*; import java.io.Serializable; -import java.util.*; +import java.util.Date; +import java.util.List; import java.util.stream.Collectors; -import static javax.persistence.TemporalType.TIMESTAMP; - /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@Inheritance @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Entity -@Table(name = "model_parameter_sets") +@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 - @EqualsAndHashCode.Include @Column(name = "name") private String name; - @OneToMany(mappedBy = "parameterSet", cascade = {CascadeType.ALL}, orphanRemoval = true) + @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; - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + @Column(name = "last_modified_date") + private Date lastModifiedDate; + + @ManyToOne(fetch = FetchType.LAZY) @JoinColumns(foreignKey = @ForeignKey(name = "model_parameter_sets_fk"), value = { - @JoinColumn(name = "group_name", referencedColumnName = "name", insertable = false, updatable = false), - @JoinColumn(name = "group_type", referencedColumnName = "type", insertable = false, updatable = false) + @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) }) private ModelSetsGroupEntity group; public ModelParameterSetEntity(ModelSetsGroupEntity group, ParametersSet set) { - this(set.getName(), null, group, - null, null); - this.parameters = set.getParameters().stream().map(parameter -> new ModelParameterEntity(this, parameter)) - .collect(Collectors.toList()); - } - - @CreatedDate - @Temporal(TIMESTAMP) - @Column(name = "created_date", updatable = false) - private Date createdDate; - - @LastModifiedDate - @Temporal(TIMESTAMP) - @Column(name = "updated_date") - private Date updatedDate; - - // --- utils methods --- // - public void addParameters(Collection parameters) { - parameters.forEach(parameter -> parameter.setParameterSet(this)); - this.parameters.addAll(parameters); - } - - public void removeParameters(Collection parameters) { - parameters.forEach(parameter -> parameter.setParameterSet(null)); - this.parameters.removeAll(parameters); + 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/ModelParameterSetId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java new file mode 100644 index 00000000..31ec0ede --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java @@ -0,0 +1,57 @@ +/** + * 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 javax.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/ModelSetsGroupEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java index fdc0a1d8..7bc28194 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java @@ -6,70 +6,57 @@ */ package org.gridsuite.mapping.server.model; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; import org.gridsuite.mapping.server.utils.SetGroupType; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; import javax.persistence.*; import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; import java.util.stream.Collectors; -import static javax.persistence.TemporalType.TIMESTAMP; - /** * @author Mathieu Scalbert */ -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@Inheritance @NoArgsConstructor @AllArgsConstructor @Getter @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 - @EqualsAndHashCode.Include @Column(name = "name") private String name; @Id - @EqualsAndHashCode.Include + @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; - @OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) - private Set sets = new LinkedHashSet<>(0); - - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_sets_groups_fk"), updatable = false) + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_sets_groups_fk")) + @MapsId("modelName") private ModelEntity model; public ModelSetsGroupEntity(ModelEntity model, ParametersSetsGroup group) { - this(group.getName(), group.getType(), null, model, null, null); - this.sets = group.getSets().stream().map(set -> new ModelParameterSetEntity(this, set)).collect(Collectors.toSet()); - } - - @CreatedDate - @Temporal(TIMESTAMP) - @Column(name = "created_date", updatable = false) - private Date createdDate; - - @LastModifiedDate - @Temporal(TIMESTAMP) - @Column(name = "updated_date") - private Date updatedDate; - - public void addSets(Collection parameterSets) { - parameterSets.forEach(parameterSet -> parameterSet.setGroup(this)); - this.sets.addAll(parameterSets); - } - - public void removeSets(Collection parameterSets) { - parameterSets.forEach(parameterSet -> parameterSet.setGroup(null)); - this.sets.removeAll(parameterSets); + 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 new file mode 100644 index 00000000..78406434 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java @@ -0,0 +1,54 @@ +/** + * 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 javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +/** + * @author Mathieu Scalbert + */ +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +@Getter +@Setter +public class ModelSetsGroupId implements Serializable { + + private String name; + + private String modelName; + + 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/service/implementation/ModelServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java index 045a35a8..39af7685 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 @@ -78,7 +78,7 @@ public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersS List savedGroups = modelToUpdate.getSetsGroups(); ModelSetsGroupEntity previousGroup = savedGroups.stream().filter(savedGroup -> savedGroup.getName().equals(setsGroup.getName())).findAny().orElse(null); ModelSetsGroupEntity groupToAdd = new ModelSetsGroupEntity(modelToUpdate, setsGroup); - groupToAdd.getSets().forEach(set -> set.setUpdatedDate(new Date())); + groupToAdd.getSets().forEach(set -> set.setLastModifiedDate(new Date())); if (previousGroup == null) { savedGroups.add(groupToAdd); @@ -115,8 +115,8 @@ public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGrou .filter(setGroup -> setGroup.getName().equals(groupName) && setGroup.getType().equals(groupType)) .findAny() .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No group found")); - Set sets = setsGroup.getSets(); - setsGroup.setSets(sets.stream().filter(set -> !set.getName().equals(setName)).collect(Collectors.toSet())); + List sets = setsGroup.getSets(); + setsGroup.setSets(sets.stream().filter(set -> !set.getName().equals(setName)).collect(Collectors.toList())); modelRepository.save(modelToEdit); return new ParametersSetsGroup(setsGroup); } else { diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index f80204ad..1a1609f4 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -69,7 +69,7 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi String[] rulesScripts = sortedRules.getRules().stream().map(flatRule -> { ST ruleScript = new ST(ruleTemplate); ruleScript.add("composition", flatRule.getComposition()); - ruleScript.add("modelName", flatRule.getMappedModel().getModel().getModelName()); + ruleScript.add("modelName", flatRule.getMappedModel().getModelName()); ruleScript.add("parameterSetId", modelToParamSetId(flatRule.getMappedModel())); return ruleScript.render(); }).toArray(String[]::new); diff --git a/src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml deleted file mode 100644 index 703c964d..00000000 --- a/src/main/resources/db/changelog/changesets/changelog_20230605T122651Z.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml new file mode 100644 index 00000000..84aa0858 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 1c64ba09..667f0146 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -17,5 +17,5 @@ databaseChangeLog: relativeToChangelogFile: true - include: - file: changesets/changelog_20230605T122651Z.xml + file: changesets/changelog_20230605T173446Z.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 a0e54796..223f0a80 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -148,7 +148,7 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isNotFound()); - Date createdDate = new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets()).get(0).getCreatedDate(); + Date setCreationDate = modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); // Update data mvc.perform(post("/models/" + modelName + "/parameters/sets/strict") @@ -156,9 +156,9 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()); - Date updatedDate = new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets()).get(0).getUpdatedDate(); + Date setUpdateDate = modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets().get(0).getLastModifiedDate(); - assertThat(createdDate.compareTo(updatedDate) < 0); + assertThat(setCreationDate.compareTo(setUpdateDate) < 0); } @Test @@ -216,20 +216,27 @@ public void getTest() throws Exception { // Prepare models ModelEntity loadModel = modelRepository.findById("LoadAlphaBeta").get(); - ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, new LinkedHashSet<>(), loadModel, null, null); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", new ArrayList<>(), loadGroup, null, null); - List setParameters = new ArrayList<>(); - setParameters.add(new ModelParameterEntity("load_alpha", "1.5", setToSave, null, null)); - setParameters.add(new ModelParameterEntity("load_beta", "2.5", setToSave, null, null)); - setToSave.addParameters(setParameters); - loadGroup.addSets(Set.of(setToSave)); - loadModel.addSetsGroup(Set.of(loadGroup)); + List loadGroups = loadModel.getSetsGroups(); + ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", loadModel.getModelName(), null, SetGroupType.FIXED, loadModel); + ArrayList groupSets = new ArrayList<>(); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", loadGroup.getName(), loadModel.getModelName(), loadGroup.getType(), + 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)); + setToSave.setParameters(setParameters); + groupSets.add(setToSave); + loadGroup.setSets(groupSets); + loadGroups.add(loadGroup); + loadModel.setSetsGroups(loadGroups); modelRepository.save(loadModel); ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, Set.of(), null, Set.of(), Set.of(), null, null); ArrayList generatorThreeGroups = new ArrayList<>(); - generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", SetGroupType.PREFIX, null, generatorThreeModel, null, null)); - generatorThreeModel.addSetsGroup(generatorThreeGroups); + generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", generatorThreeModel.getModelName(), new ArrayList<>(), SetGroupType.PREFIX, generatorThreeModel)); + generatorThreeModel.setSetsGroups(generatorThreeGroups); modelRepository.save(generatorThreeModel); mvc.perform(get("/models/") @@ -252,7 +259,6 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { String newModelJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta.json"); String newParameterDefinitionsJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json"); - cleanDB(); // Put data first time with initial parameter definitions MvcResult mvcResult = mvc.perform(post("/models/") diff --git a/src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java b/src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java new file mode 100644 index 00000000..593a8e78 --- /dev/null +++ b/src/test/java/org/gridsuite/mapping/server/ModelEntitiesTest.java @@ -0,0 +1,60 @@ +/** + * 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); + } +} diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index a9755f66..85058e73 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Date; import java.util.LinkedHashSet; import java.util.Set; @@ -72,12 +73,15 @@ public void setUp() { // Prepare models ModelEntity loadModel = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, new LinkedHashSet<>(), null, Set.of(), Set.of(), null, null); ArrayList loadGroups = new ArrayList<>(); - ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, null, loadModel, null, null); - Set groupSets = new LinkedHashSet<>(); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", null, loadGroup, null, null); + ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", loadModel.getModelName(), null, SetGroupType.FIXED, loadModel); + ArrayList groupSets = new ArrayList<>(); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", loadGroup.getName(), loadModel.getModelName(), loadGroup.getType(), + null, + new Date(), + loadGroup); ArrayList setParameters = new ArrayList<>(); - setParameters.add(new ModelParameterEntity("load_alpha", "1.5", setToSave, null, null)); - setParameters.add(new ModelParameterEntity("load_beta", "2.5", setToSave, null, null)); + 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)); setToSave.setParameters(setParameters); groupSets.add(setToSave); loadGroup.setSets(groupSets); @@ -96,13 +100,13 @@ public void setUp() { ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, null, null, null, null, null, null); ArrayList generatorThreeGroups = new ArrayList<>(); - generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", SetGroupType.PREFIX, null, generatorThreeModel, null, null)); + generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", generatorThreeModel.getModelName(), null, SetGroupType.PREFIX, generatorThreeModel)); generatorThreeModel.setSetsGroups(generatorThreeGroups); modelRepository.save(generatorThreeModel); ModelEntity generatorFourModel = new ModelEntity("GeneratorFourWindings", EquipmentType.GENERATOR, null, null, null, null, null, null); ArrayList generatorFourGroups = new ArrayList<>(); - generatorFourGroups.add(new ModelSetsGroupEntity("GSFWPR", SetGroupType.PREFIX, null, generatorFourModel, null, null)); + generatorFourGroups.add(new ModelSetsGroupEntity("GSFWPR", generatorFourModel.getModelName(), null, SetGroupType.PREFIX, generatorFourModel)); generatorFourModel.setSetsGroups(generatorFourGroups); modelRepository.save(generatorFourModel); } @@ -406,7 +410,7 @@ public void parTest() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json(scriptOutput, true)); + .andExpect(content().json(scriptOutput, false)); } @Test From f6b46d3f4a03bf8282cb18bd53a5299193686bbb Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 5 Jun 2023 22:03:32 +0200 Subject: [PATCH 03/16] Correct test data --- .../mapping/server/ScriptControllerTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index 85058e73..d979ade2 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -88,7 +88,7 @@ public void setUp() { loadGroups.add(loadGroup); loadModel.setSetsGroups(loadGroups); - ArrayList definitions = new ArrayList<>(); + Set definitions = new LinkedHashSet<>(); definitions.add(createDefinitionEntity("load_alpha", ParameterType.DOUBLE, ParameterOrigin.USER, null, loadModel)); definitions.add(createDefinitionEntity("load_beta", ParameterType.DOUBLE, ParameterOrigin.USER, null, loadModel)); definitions.add(createDefinitionEntity("load_P0Pu", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "p_pu", loadModel)); @@ -387,12 +387,12 @@ public void parTest() throws Exception { String parFile = "\n" + "\n" + " \n" + - " \n" + - " \n" + - " \n" + - " \n" + " \n" + + " \n" + " \n" + + " \n" + + " \n" + + " \n" + " \n" + ""; @@ -410,7 +410,7 @@ public void parTest() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) - .andExpect(content().json(scriptOutput, false)); + .andExpect(content().json(scriptOutput, true)); } @Test From 2f976703ff640aa98c0029b25d28ac0fb8be637c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Tue, 6 Jun 2023 11:47:08 +0200 Subject: [PATCH 04/16] Grain test coverage --- .../RestResponseEntityExceptionHandler.java | 14 ++ .../implementation/ModelServiceImpl.java | 148 +++++++++--------- .../mapping/server/ModelControllerTest.java | 10 ++ 3 files changed, 97 insertions(+), 75 deletions(-) create mode 100644 src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java diff --git a/src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java new file mode 100644 index 00000000..15cd00f7 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/RestResponseEntityExceptionHandler.java @@ -0,0 +1,14 @@ +package org.gridsuite.mapping.server; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.client.HttpClientErrorException; + +@ControllerAdvice +public class RestResponseEntityExceptionHandler { + @ExceptionHandler(HttpClientErrorException.class) + protected ResponseEntity handleHttpClientErrorException(HttpClientErrorException exception) { + return ResponseEntity.status(exception.getStatusCode()).body(exception.getStatusText()); + } +} 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 39af7685..46e7936e 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 @@ -51,6 +51,10 @@ public ModelServiceImpl( this.modelVariablesSetRepository = modelVariablesSetRepository; } + private ModelEntity getModelToUpdate(String modelName, Optional foundModelOpt) { + return foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + } + @Override public List getModels() { return modelRepository.findAll().stream().map(modelEntity -> new SimpleModel(new Model(modelEntity))).collect(Collectors.toList()); @@ -127,20 +131,19 @@ public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGrou // --- BEGIN parameter definition-related service methods --- // @Override public List getParameterDefinitionsFromModel(String modelName) { - Optional foundModel = modelRepository.findById(modelName); - if (foundModel.isPresent()) { - Model modelToSend = new Model(foundModel.get()); - return modelToSend.getParameterDefinitions(); - } else { - throw new HttpClientErrorException(HttpStatus.NOT_FOUND); - } + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelEntity = getModelToUpdate(modelName, foundModelOpt); + + Model modelToSend = new Model(modelEntity); + return modelToSend.getParameterDefinitions(); } @Override public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitions) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of parameter definitions if (parameterDefinitions != null && !parameterDefinitions.isEmpty()) { @@ -150,25 +153,24 @@ public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of parameter definitions if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { // find existing parameter definitions List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); - // check whether found all + // check whether found all, fail fast if (foundParameterDefinitionEntities.size() != parameterDefinitionNames.size()) { List foundNames = foundParameterDefinitionEntities.stream().map(ModelParameterDefinitionEntity::getName).collect(Collectors.toList()); List notFoundNames = parameterDefinitionNames.stream().filter(name -> !foundNames.contains(name)).collect(Collectors.toList()); @@ -179,18 +181,18 @@ public Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do remove in the list of parameter definitions if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { @@ -201,25 +203,26 @@ public Model removeExistingParameterDefinitionsFromModel(String modelName, List< modelToUpdate.removeParameterDefinitions(foundParameterDefinitionEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); + } @Override public Model removeAllParameterDefinitionsOnModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // clear the existing list modelToUpdate.removeParameterDefinitions(modelToUpdate.getParameterDefinitions()); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); + modelRepository.save(modelToUpdate); + + return new Model(modelToUpdate); } @Override @@ -229,6 +232,7 @@ public List saveNewParameterDefinitions(List savedParameterDefinitionEntities = modelParameterDefinitionRepository.saveAll(parameterDefinitionEntities); return savedParameterDefinitionEntities.stream().map(ModelParameterDefinition::new).collect(Collectors.toList()); } + return Collections.emptyList(); } @@ -247,7 +251,7 @@ public List deleteParameterDefinitions(List parameterDefinitionN public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitions) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variable definitions if (variableDefinitions != null && !variableDefinitions.isEmpty()) { @@ -257,11 +261,11 @@ public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variable definitions if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { // find existing variable definitions List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); - // check whether found all + // check whether found all, fail fast if (foundVariableDefinitionEntities.size() != variableDefinitionNames.size()) { List foundNames = foundVariableDefinitionEntities.stream().map(ModelVariableDefinitionEntity::getName).collect(Collectors.toList()); List notFoundNames = variableDefinitionNames.stream().filter(name -> !foundNames.contains(name)).collect(Collectors.toList()); @@ -287,11 +291,10 @@ public Model addExistingVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do remove in the list of variable definitions if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { @@ -310,11 +313,10 @@ public Model removeExistingVariableDefinitionsFromModel(String modelName, List saveNewVariableDefinitions(List foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // clear the existing list modelToUpdate.removeVariableDefinitions(modelToUpdate.getVariableDefinitions()); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); + modelRepository.save(modelToUpdate); + + return new Model(modelToUpdate); } @Override @@ -363,12 +366,10 @@ public VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetNam List variableDefinitionEntities = variableDefinitions.stream().map(variableDefinition -> new ModelVariableDefinitionEntity(null, variableSetToUpdate, variableDefinition)).collect(Collectors.toList()); variableSetToUpdate.addVariableDefinitions(variableDefinitionEntities); // save modified existing variables set entity - ModelVariableSetEntity savedVariablesSetEntity = modelVariablesSetRepository.save(variableSetToUpdate); - return new VariablesSet(savedVariablesSetEntity); - - } else { - return new VariablesSet(variableSetToUpdate); + modelVariablesSetRepository.save(variableSetToUpdate); } + + return new VariablesSet(variableSetToUpdate); } @Override @@ -387,12 +388,10 @@ public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String vari // save modified existing variables set entity // variable definitions are systematically deleted via orphanRemoval = true - ModelVariableSetEntity savedVariablesSetEntity = modelVariablesSetRepository.save(variableSetToUpdate); - - return new VariablesSet(savedVariablesSetEntity); - } else { - return new VariablesSet(variableSetToUpdate); + modelVariablesSetRepository.save(variableSetToUpdate); } + + return new VariablesSet(variableSetToUpdate); } @Override @@ -407,8 +406,8 @@ public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSet // save modified existing variables set entity // variable definitions are systematically deleted via orphanRemoval = true - ModelVariableSetEntity savedVariablesSetEntity = modelVariablesSetRepository.save(variableSetToUpdate); - return new VariablesSet(savedVariablesSetEntity); + modelVariablesSetRepository.save(variableSetToUpdate); + return new VariablesSet(variableSetToUpdate); } @Override @@ -416,7 +415,7 @@ public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSet public Model addNewVariablesSetsToModel(String modelName, List variableSets) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variables set if (variableSets != null && !variableSets.isEmpty()) { @@ -424,11 +423,10 @@ public Model addNewVariablesSetsToModel(String modelName, List var List variablesSetEntities = variableSets.stream().map(variablesSet -> new ModelVariableSetEntity(modelToUpdate, variablesSet)).collect(Collectors.toList()); modelToUpdate.addVariablesSets(variablesSetEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); } @Override @@ -436,7 +434,7 @@ public Model addNewVariablesSetsToModel(String modelName, List var public Model addExistingVariablesSetsToModel(String modelName, List variablesSetNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variables set if (variablesSetNames != null && !variablesSetNames.isEmpty()) { @@ -452,11 +450,10 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari modelToUpdate.addVariablesSets(foundVariablesSetEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); } @Override @@ -464,7 +461,7 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari public Model removeExistingVariablesSetsFromModel(String modelName, List variablesSetNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variables set if (variablesSetNames != null && !variablesSetNames.isEmpty()) { @@ -473,24 +470,24 @@ public Model removeExistingVariablesSetsFromModel(String modelName, List modelToUpdate.removeVariablesSets(foundVariablesSetEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); } @Override public Model removeAllExistingVariablesSetsFromModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); modelToUpdate.removeVariablesSets(modelToUpdate.getVariableSets()); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); + modelRepository.save(modelToUpdate); + + return new Model(modelToUpdate); } @Override @@ -499,6 +496,7 @@ public List deleteVariableDefinitions(List variableDefinitionNam if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { modelVariableRepository.deleteAllById(variableDefinitionNames); } + return variableDefinitionNames; } diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index 223f0a80..fa259ac7 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -270,6 +270,16 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { List parameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); assertEquals(6, parameterDefinitions.size()); + // Get initial parameter definitions from GET endpoint + MvcResult mvcResult1 = mvc.perform(get("/models/" + modelName + "/parameters/definitions")) + .andExpect(status().isOk()).andReturn(); + List parameterDefinitions1 = objectMapper.readValue(mvcResult1.getResponse().getContentAsString(), new TypeReference>() { }); + assertEquals(6, parameterDefinitions1.size()); + + // Try to get parameter definitions from unknown model + mvc.perform(get("/models/" + modelName + "_unknown" + "/parameters/definitions")) + .andExpect(status().isNotFound()); + // Put data second time which add only a parameter definition MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/parameters/definitions") .content(newParameterDefinitionsJson) From d400ed10aaacc1baa4fef6d7b927c7d008a9fd98 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Tue, 6 Jun 2023 12:09:12 +0200 Subject: [PATCH 05/16] Grain test coverage --- .../implementation/ModelServiceImpl.java | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) 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 46e7936e..cf268e70 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 @@ -18,6 +18,7 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.server.ResponseStatusException; @@ -146,7 +147,7 @@ public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitionEntities = parameterDefinitions.stream() .map(parameterDefinition -> new ModelParameterDefinitionEntity(modelToUpdate, parameterDefinition)) @@ -166,7 +167,7 @@ public Model addExistingParameterDefinitionsToModel(String modelName, List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); @@ -195,7 +196,7 @@ public Model removeExistingParameterDefinitionsFromModel(String modelName, List< ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do remove in the list of parameter definitions - if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { // find existing variable definitions List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); @@ -227,7 +228,7 @@ public Model removeAllParameterDefinitionsOnModel(String modelName) { @Override public List saveNewParameterDefinitions(List parameterDefinitions) { - if (parameterDefinitions != null && !parameterDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitions)) { Set parameterDefinitionEntities = parameterDefinitions.stream().map(variableDefinition -> new ModelParameterDefinitionEntity(null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)); List savedParameterDefinitionEntities = modelParameterDefinitionRepository.saveAll(parameterDefinitionEntities); return savedParameterDefinitionEntities.stream().map(ModelParameterDefinition::new).collect(Collectors.toList()); @@ -238,7 +239,7 @@ public List saveNewParameterDefinitions(List deleteParameterDefinitions(List parameterDefinitionNames) { - if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { modelParameterDefinitionRepository.deleteAllById(parameterDefinitionNames); } return parameterDefinitionNames; @@ -254,7 +255,7 @@ public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitionEntities = variableDefinitions.stream() .map(variableDefinition -> new ModelVariableDefinitionEntity(modelToUpdate, null, variableDefinition)) @@ -276,7 +277,7 @@ public Model addExistingVariableDefinitionsToModel(String modelName, List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); @@ -305,7 +306,7 @@ public Model removeExistingVariableDefinitionsFromModel(String modelName, List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); @@ -322,7 +323,7 @@ public Model removeExistingVariableDefinitionsFromModel(String modelName, List saveNewVariableDefinitions(List variableDefinitions) { - if (variableDefinitions != null && !variableDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitions)) { Set variableDefinitionEntities = variableDefinitions.stream().map(variableDefinition -> new ModelVariableDefinitionEntity(null, null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)); List savedVariableDefinitionEntities = modelVariableRepository.saveAll(variableDefinitionEntities); return savedVariableDefinitionEntities.stream().map(ModelVariableDefinition::new).collect(Collectors.toList()); @@ -361,7 +362,7 @@ public VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetNam ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); - if (variableDefinitions != null && !variableDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitions)) { // do merge with existing list List variableDefinitionEntities = variableDefinitions.stream().map(variableDefinition -> new ModelVariableDefinitionEntity(null, variableSetToUpdate, variableDefinition)).collect(Collectors.toList()); variableSetToUpdate.addVariableDefinitions(variableDefinitionEntities); @@ -379,7 +380,7 @@ public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String vari ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); - if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); @@ -418,7 +419,7 @@ public Model addNewVariablesSetsToModel(String modelName, List var ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variables set - if (variableSets != null && !variableSets.isEmpty()) { + if (!CollectionUtils.isEmpty(variableSets)) { // do merge with existing list List variablesSetEntities = variableSets.stream().map(variablesSet -> new ModelVariableSetEntity(modelToUpdate, variablesSet)).collect(Collectors.toList()); modelToUpdate.addVariablesSets(variablesSetEntities); @@ -437,7 +438,7 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variables set - if (variablesSetNames != null && !variablesSetNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variablesSetNames)) { // do merge with existing list List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); @@ -464,7 +465,7 @@ public Model removeExistingVariablesSetsFromModel(String modelName, List ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); // do merge with the list of variables set - if (variablesSetNames != null && !variablesSetNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variablesSetNames)) { // remove from existing list List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); modelToUpdate.removeVariablesSets(foundVariablesSetEntities); @@ -493,7 +494,7 @@ public Model removeAllExistingVariablesSetsFromModel(String modelName) { @Override @Transactional public List deleteVariableDefinitions(List variableDefinitionNames) { - if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitionNames)) { modelVariableRepository.deleteAllById(variableDefinitionNames); } @@ -504,7 +505,7 @@ public List deleteVariableDefinitions(List variableDefinitionNam @Transactional public List deleteVariablesSets(List variablesSetNames) { - if (variablesSetNames != null && !variablesSetNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variablesSetNames)) { // cleanup associations List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); @@ -519,7 +520,7 @@ public List deleteVariablesSets(List variablesSetNames) { return foundVariablesSetNames; } - return List.of(); + return variablesSetNames; } // --- END variable-related service methods --- // From 5a629b9ea21fbebf55f1609ab9354722e5dc31b8 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Tue, 6 Jun 2023 14:07:28 +0200 Subject: [PATCH 06/16] Grain test coverage --- .../implementation/ModelServiceImpl.java | 6 ++ .../mapping/server/ModelControllerTest.java | 60 ++++++++++++------- 2 files changed, 45 insertions(+), 21 deletions(-) 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 cf268e70..eefdbbe4 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 @@ -141,6 +141,7 @@ public List getParameterDefinitionsFromModel(String mo } @Override + @Transactional public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitions) { Optional foundModelOpt = modelRepository.findById(modelName); @@ -161,6 +162,7 @@ public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); @@ -190,6 +192,7 @@ public Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); @@ -212,6 +215,7 @@ public Model removeExistingParameterDefinitionsFromModel(String modelName, List< } @Override + @Transactional public Model removeAllParameterDefinitionsOnModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); @@ -227,6 +231,7 @@ public Model removeAllParameterDefinitionsOnModel(String modelName) { } @Override + @Transactional public List saveNewParameterDefinitions(List parameterDefinitions) { if (!CollectionUtils.isEmpty(parameterDefinitions)) { Set parameterDefinitionEntities = parameterDefinitions.stream().map(variableDefinition -> new ModelParameterDefinitionEntity(null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)); @@ -238,6 +243,7 @@ public List saveNewParameterDefinitions(List deleteParameterDefinitions(List parameterDefinitionNames) { if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { modelParameterDefinitionRepository.deleteAllById(parameterDefinitionNames); diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index fa259ac7..dec7c73e 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -260,7 +260,7 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { String newParameterDefinitionsJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json"); cleanDB(); - // Put data first time with initial parameter definitions + // --- Put data first time with initial parameter definitions --- // MvcResult mvcResult = mvc.perform(post("/models/") .content(newModelJson) .contentType(APPLICATION_JSON)) @@ -270,17 +270,17 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { List parameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); assertEquals(6, parameterDefinitions.size()); - // Get initial parameter definitions from GET endpoint + // --- Get initial parameter definitions from GET endpoint --- // MvcResult mvcResult1 = mvc.perform(get("/models/" + modelName + "/parameters/definitions")) .andExpect(status().isOk()).andReturn(); List parameterDefinitions1 = objectMapper.readValue(mvcResult1.getResponse().getContentAsString(), new TypeReference>() { }); assertEquals(6, parameterDefinitions1.size()); - // Try to get parameter definitions from unknown model + // --- Try to get parameter definitions from unknown model --- // mvc.perform(get("/models/" + modelName + "_unknown" + "/parameters/definitions")) .andExpect(status().isNotFound()); - // Put data second time which add only a parameter definition + // --- Put data second time which add only a parameter definition --- // MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/parameters/definitions") .content(newParameterDefinitionsJson) .contentType(APPLICATION_JSON)) @@ -296,7 +296,7 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { assertEquals(1, parameterDefinitions2.size() - parameterDefinitions.size()); assertTrue(parameterDefinitions2.containsAll(parameterDefinitions)); - // Remove an existing variable definition + // --- Remove an existing variable definition --- // MvcResult mvcResult3 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove") .content(objectMapper.writeValueAsString(List.of(parameterDefinitions2.get(5).getName()))) .contentType(APPLICATION_JSON)) @@ -312,7 +312,7 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { assertEquals(1, parameterDefinitions2.size() - parameterDefinitions3.size()); assertTrue(parameterDefinitions2.containsAll(parameterDefinitions3)); - // remove all parameter definitions + // --- Remove all parameter definitions --- // MvcResult mvcResult4 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); @@ -324,7 +324,7 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // must have no parameter definition assertEquals(0, parameterDefinitions4.size()); - // save new parameter definition + // --- Save new parameter definition --- // List parameterDefinitionList = objectMapper.readValue(newParameterDefinitionsJson, new TypeReference>() { }); parameterDefinitionList.get(0).setName("load_UPhase0_3"); MvcResult mvcResult5 = mvc.perform(post("/models/parameters/definitions") @@ -337,7 +337,7 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // must have the same number of input variable definitions assertEquals(parameterDefinitionList.size(), savedParameterDefinitionList.size()); - // add existing parameter definition to model + // --- Add existing parameter definition to model --- // MvcResult mvcResult6 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") .content(objectMapper.writeValueAsString(savedParameterDefinitionList.stream().map(ModelParameterDefinition::getName))) .contentType(APPLICATION_JSON)) @@ -349,7 +349,13 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // must have the same number of above input parameter definitions assertEquals(savedParameterDefinitionList.size(), parameterDefinitions6.size()); - // --- delete definitively a parameter definition --- // + // --- Add unknown existing parameter definition to model => must fail fast --- // + mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") + .content(objectMapper.writeValueAsString(List.of("parameter_definition_unknown"))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isNotFound()); + + // --- Delete definitively a parameter definition --- // mvcResult = mvc.perform(delete("/models/parameters/definitions") .content(objectMapper.writeValueAsString(List.of(parameterDefinitions.get(4).getName()))) .contentType(APPLICATION_JSON)) @@ -371,7 +377,7 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { cleanDB(); - // Put data first time with initial variable definitions + // --- Put data first time with initial variable definitions --- // MvcResult mvcResult = mvc.perform(post("/models/") .content(newModelJson) .contentType(APPLICATION_JSON)) @@ -381,7 +387,7 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { List variableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); assertEquals(5, variableDefinitions.size()); - // Put data second time which add only a variable definition + // --- Put data second time which add only a variable definition --- // MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/variables") .content(newVariableDefinitionsJson) .contentType(APPLICATION_JSON)) @@ -397,7 +403,7 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { assertEquals(1, variableDefinitions2.size() - variableDefinitions.size()); assertTrue(variableDefinitions2.containsAll(variableDefinitions)); - // Remove an existing variable definition + // --- Remove an existing variable definition --- // MvcResult mvcResult3 = mvc.perform(patch("/models/" + modelName + "/variables/remove") .content(objectMapper.writeValueAsString(List.of(variableDefinitions2.get(5).getName()))) .contentType(APPLICATION_JSON)) @@ -409,11 +415,11 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { LOGGER.info("Removed variable definitions = " + variableDefinitions3); // check result - // final model's variable definition must contains all ones of model + // final model's variable definition must contain all ones of model assertEquals(1, variableDefinitions2.size() - variableDefinitions3.size()); assertTrue(variableDefinitions2.containsAll(variableDefinitions3)); - // remove all variable definitions + // --- Remove all variable definitions --- // MvcResult mvcResult4 = mvc.perform(patch("/models/" + modelName + "/variables/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); @@ -425,7 +431,7 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // must have no variable definition assertEquals(0, variableDefinitions4.size()); - // save new variable definition + // --- Save new variable definition --- // List variableDefinitionList = objectMapper.readValue(newVariableDefinitionsJson, new TypeReference>() { }); variableDefinitionList.get(0).setName("load_running_value_3"); MvcResult mvcResult5 = mvc.perform(post("/models/variables") @@ -438,7 +444,7 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // must have the same number of input variable definitions assertEquals(variableDefinitionList.size(), savedVariableDefinitionList.size()); - // add existing variable definition to model + // --- Add existing variable definition to model --- // MvcResult mvcResult6 = mvc.perform(patch("/models/" + modelName + "/variables/add") .content(objectMapper.writeValueAsString(savedVariableDefinitionList.stream().map(ModelVariableDefinition::getName))) .contentType(APPLICATION_JSON)) @@ -450,7 +456,13 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // must have the same number of above input variable definitions assertEquals(variableDefinitionList.size(), variableDefinitions6.size()); - // --- delete definitively a variable definition --- // + // --- add unknown existing variable definition to model => must fail fast --- // + mvc.perform(patch("/models/" + modelName + "/variables/add") + .content(objectMapper.writeValueAsString(List.of("variable_definition_unknown"))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isNotFound()); + + // --- Delete definitively a variable definition --- // mvcResult = mvc.perform(delete("/models/variables") .content(objectMapper.writeValueAsString(List.of(variableDefinitions.get(4).getName()))) .contentType(APPLICATION_JSON)) @@ -639,7 +651,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { assertEquals(1, variableDefinitionsOfVoltageRegulatorSet.size()); assertEquals(2, variableDefinitionsOfRegulator2Set.size()); - // --- remove an existing variables set --- // + // --- Remove an existing variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/remove") .content(objectMapper.writeValueAsString(List.of(variablesSet2.get(2).getName()))) .contentType(APPLICATION_JSON)) @@ -654,7 +666,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { // must contains all variables sets after removing assertTrue(variablesSet2.containsAll(variablesSet3)); - // --- remove all variables set --- // + // --- Remove all variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); @@ -666,7 +678,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { // Check result assertEquals(0, variablesSet4.size()); - // --- add an existing variables set --- // + // --- Add an existing variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/add") .content(objectMapper.writeValueAsString(List.of(variablesSet2.get(2).getName()))) .contentType(APPLICATION_JSON)) @@ -679,7 +691,13 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { // Check result assertEquals(1, variablesSet5.size()); - // --- delete definitively a variables set --- // + // --- Add an unknown existing variables set => must fail fast --- // + mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/add") + .content(objectMapper.writeValueAsString(List.of("variable_set_unknown"))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isNotFound()); + + // --- Delete definitively a variables set --- // mvcResult = mvc.perform(delete("/models/variables-sets") .content(objectMapper.writeValueAsString(List.of(variablesSet2.get(2).getName()))) .contentType(APPLICATION_JSON)) From 05644ef7bdad80cbb13b474156cb9ca2aadf8fe4 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Tue, 6 Jun 2023 15:00:26 +0200 Subject: [PATCH 07/16] Grain test coverage --- .../server/controller/ModelController.java | 24 ++++++ .../mapping/server/service/ModelService.java | 6 ++ .../implementation/ModelServiceImpl.java | 74 +++++++++++++----- .../mapping/server/ModelControllerTest.java | 78 +++++++++++++------ 4 files changed, 138 insertions(+), 44 deletions(-) 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 332f145b..e1f3acca 100644 --- a/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java +++ b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java @@ -143,6 +143,14 @@ public ResponseEntity> deleteParameterDefinitions(@RequestBody List // --- END parameter definition-related endpoints --- // // --- BEGIN variable-related endpoints --- // + @GetMapping(value = "/{modelName}/variables") + @Operation(summary = "get variable definitions for a given model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "variable definitions of the model")}) + public ResponseEntity> getVariablesFromModel(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getVariableDefinitionsFromModel(modelName)); + } + @PostMapping(value = "/{modelName}/variables") @Operation(summary = "Add new variable definitions to model") @ApiResponses(value = { @@ -175,6 +183,14 @@ public ResponseEntity removeAllVariablesOnModel(@PathVariable("modelName" return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeAllVariableDefinitionsOnModel(modelName)); } + @GetMapping(value = "/variables-sets/{variableSetName}/variables") + @Operation(summary = "Add variable definitions from variables set") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "variable definitions of variables set")}) + public ResponseEntity> getVariablesFromVariablesSet(@PathVariable("variableSetName") String variableSetName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getVariableDefinitionsFromVariablesSet(variableSetName)); + } + @PostMapping(value = "/variables-sets/{variableSetName}/variables") @Operation(summary = "Add new variable definitions to variables set") @ApiResponses(value = { @@ -199,6 +215,14 @@ public ResponseEntity removeAllVariableDefinitionOnVariablesSet(@P return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeAllVariableDefinitionOnVariablesSet(variableSetName)); } + @GetMapping(value = "/{modelName}/variables-sets") + @Operation(summary = "get variable sets for a given model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "variable sets of the model")}) + public ResponseEntity> getVariablesSetsFromModel(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getVariablesSetsFromModel(modelName)); + } + @PostMapping(value = "/{modelName}/variables-sets") @Operation(summary = "Add new variables set to model") @ApiResponses(value = { diff --git a/src/main/java/org/gridsuite/mapping/server/service/ModelService.java b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java index 12b22e9a..655a6b56 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/ModelService.java +++ b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java @@ -44,6 +44,8 @@ public interface ModelService { // --- END parameter definition-related service methods --- // // --- BEGIN variable-related service methods --- // + List getVariableDefinitionsFromModel(String modelName); + Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitions); Model addExistingVariableDefinitionsToModel(String modelName, List variableDefinitionNames); @@ -54,8 +56,12 @@ public interface ModelService { Model removeAllVariableDefinitionsOnModel(String modelName); + List getVariablesSetsFromModel(String modelName); + VariablesSet saveNewVariablesSet(VariablesSet variableSet); + List getVariableDefinitionsFromVariablesSet(String variableSetName); + VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetName, List variableDefinitions); VariablesSet removeExistingVariableDefinitionFromVariablesSet(String variableSetName, List variableDefinitionNames); 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 eefdbbe4..e82b24e5 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 @@ -52,10 +52,14 @@ public ModelServiceImpl( this.modelVariablesSetRepository = modelVariablesSetRepository; } - private ModelEntity getModelToUpdate(String modelName, Optional foundModelOpt) { + private ModelEntity getModelFromOptional(String modelName, Optional foundModelOpt) { return foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); } + private ModelVariableSetEntity getVariableSetFromOptional(String variableSetName, Optional foundVariableSetOpt) { + return foundVariableSetOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + } + @Override public List getModels() { return modelRepository.findAll().stream().map(modelEntity -> new SimpleModel(new Model(modelEntity))).collect(Collectors.toList()); @@ -134,7 +138,7 @@ public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGrou public List getParameterDefinitionsFromModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelEntity = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); Model modelToSend = new Model(modelEntity); return modelToSend.getParameterDefinitions(); @@ -145,7 +149,7 @@ public List getParameterDefinitionsFromModel(String mo public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitions) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of parameter definitions if (!CollectionUtils.isEmpty(parameterDefinitions)) { @@ -166,7 +170,7 @@ public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of parameter definitions if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { @@ -196,7 +200,7 @@ public Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do remove in the list of parameter definitions if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { @@ -219,7 +223,7 @@ public Model removeExistingParameterDefinitionsFromModel(String modelName, List< public Model removeAllParameterDefinitionsOnModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // clear the existing list modelToUpdate.removeParameterDefinitions(modelToUpdate.getParameterDefinitions()); @@ -250,6 +254,16 @@ public List deleteParameterDefinitions(List parameterDefinitionN } return parameterDefinitionNames; } + + @Override + public List getVariableDefinitionsFromModel(String modelName) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); + + Model modelToSend = new Model(modelEntity); + return modelToSend.getVariableDefinitions(); + } // --- END parameter definition-related service methods --- // // --- BEGIN variable-related service methods --- // @@ -258,7 +272,7 @@ public List deleteParameterDefinitions(List parameterDefinitionN public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitions) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variable definitions if (!CollectionUtils.isEmpty(variableDefinitions)) { @@ -280,7 +294,7 @@ public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variable definitions if (!CollectionUtils.isEmpty(variableDefinitionNames)) { @@ -309,7 +323,7 @@ public Model addExistingVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do remove in the list of variable definitions if (!CollectionUtils.isEmpty(variableDefinitionNames)) { @@ -342,7 +356,7 @@ public List saveNewVariableDefinitions(List foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // clear the existing list modelToUpdate.removeVariableDefinitions(modelToUpdate.getVariableDefinitions()); @@ -353,6 +367,16 @@ public Model removeAllVariableDefinitionsOnModel(String modelName) { return new Model(modelToUpdate); } + @Override + public List getVariablesSetsFromModel(String modelName) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); + + Model modelToSend = new Model(modelEntity); + return modelToSend.getVariablesSets(); + } + @Override @Transactional public VariablesSet saveNewVariablesSet(VariablesSet variableSet) { @@ -361,12 +385,22 @@ public VariablesSet saveNewVariablesSet(VariablesSet variableSet) { return new VariablesSet(savedVariableSetEntity); } + @Override + public List getVariableDefinitionsFromVariablesSet(String variableSetName) { + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); + + ModelVariableSetEntity variableSetEntity = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); + + VariablesSet variablesSet = new VariablesSet(variableSetEntity); + return variablesSet.getVariableDefinitions(); + } + @Override @Transactional public VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetName, List variableDefinitions) { - Optional foundModelOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); - ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); if (!CollectionUtils.isEmpty(variableDefinitions)) { // do merge with existing list @@ -382,9 +416,9 @@ public VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetNam @Override @Transactional public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String variableSetName, List variableDefinitionNames) { - Optional foundModelOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); - ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions @@ -404,9 +438,9 @@ public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String vari @Override @Transactional public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSetName) { - Optional foundModelOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); - ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); // clear the existing list variableSetToUpdate.removeVariableDefinitions(variableSetToUpdate.getVariableDefinitions()); @@ -422,7 +456,7 @@ public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSet public Model addNewVariablesSetsToModel(String modelName, List variableSets) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set if (!CollectionUtils.isEmpty(variableSets)) { @@ -441,7 +475,7 @@ public Model addNewVariablesSetsToModel(String modelName, List var public Model addExistingVariablesSetsToModel(String modelName, List variablesSetNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set if (!CollectionUtils.isEmpty(variablesSetNames)) { @@ -468,7 +502,7 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari public Model removeExistingVariablesSetsFromModel(String modelName, List variablesSetNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set if (!CollectionUtils.isEmpty(variablesSetNames)) { @@ -487,7 +521,7 @@ public Model removeExistingVariablesSetsFromModel(String modelName, List public Model removeAllExistingVariablesSetsFromModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = getModelToUpdate(modelName, foundModelOpt); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); modelToUpdate.removeVariablesSets(modelToUpdate.getVariableSets()); diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index dec7c73e..3de1527d 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -271,9 +271,9 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { assertEquals(6, parameterDefinitions.size()); // --- Get initial parameter definitions from GET endpoint --- // - MvcResult mvcResult1 = mvc.perform(get("/models/" + modelName + "/parameters/definitions")) + mvcResult = mvc.perform(get("/models/" + modelName + "/parameters/definitions")) .andExpect(status().isOk()).andReturn(); - List parameterDefinitions1 = objectMapper.readValue(mvcResult1.getResponse().getContentAsString(), new TypeReference>() { }); + List parameterDefinitions1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); assertEquals(6, parameterDefinitions1.size()); // --- Try to get parameter definitions from unknown model --- // @@ -281,13 +281,13 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { .andExpect(status().isNotFound()); // --- Put data second time which add only a parameter definition --- // - MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/parameters/definitions") + mvcResult = mvc.perform(post("/models/" + modelName + "/parameters/definitions") .content(newParameterDefinitionsJson) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current parameter definitions - List parameterDefinitions2 = objectMapper.readValue(mvcResult2.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Initial parameter definitions = " + parameterDefinitions); LOGGER.info("Updated parameter definitions = " + parameterDefinitions2); @@ -297,13 +297,13 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { assertTrue(parameterDefinitions2.containsAll(parameterDefinitions)); // --- Remove an existing variable definition --- // - MvcResult mvcResult3 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove") + mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove") .content(objectMapper.writeValueAsString(List.of(parameterDefinitions2.get(5).getName()))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current parameter definitions - List parameterDefinitions3 = objectMapper.readValue(mvcResult3.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions3 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Updated parameter definitions = " + parameterDefinitions2); LOGGER.info("Removed parameter definitions = " + parameterDefinitions3); @@ -313,11 +313,11 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { assertTrue(parameterDefinitions2.containsAll(parameterDefinitions3)); // --- Remove all parameter definitions --- // - MvcResult mvcResult4 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove-all") + mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List parameterDefinitions4 = objectMapper.readValue(mvcResult4.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions4 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Unset parameter definitions = " + parameterDefinitions4); // check result @@ -327,24 +327,24 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { // --- Save new parameter definition --- // List parameterDefinitionList = objectMapper.readValue(newParameterDefinitionsJson, new TypeReference>() { }); parameterDefinitionList.get(0).setName("load_UPhase0_3"); - MvcResult mvcResult5 = mvc.perform(post("/models/parameters/definitions") + mvcResult = mvc.perform(post("/models/parameters/definitions") .content(objectMapper.writeValueAsString(parameterDefinitionList)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List savedParameterDefinitionList = objectMapper.readValue(mvcResult5.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()); // --- Add existing parameter definition to model --- // - MvcResult mvcResult6 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") + mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") .content(objectMapper.writeValueAsString(savedParameterDefinitionList.stream().map(ModelParameterDefinition::getName))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current parameter definitions in the model - List parameterDefinitions6 = objectMapper.readValue(mvcResult6.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions6 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Updated parameter definitions = " + parameterDefinitions6); // must have the same number of above input parameter definitions assertEquals(savedParameterDefinitionList.size(), parameterDefinitions6.size()); @@ -387,14 +387,24 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { List variableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); assertEquals(5, variableDefinitions.size()); + // --- 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()); + + // --- Try to get variable definitions from unknown model --- // + mvc.perform(get("/models/" + modelName + "_unknown" + "/variables")) + .andExpect(status().isNotFound()); + // --- Put data second time which add only a variable definition --- // - MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/variables") + mvcResult = mvc.perform(post("/models/" + modelName + "/variables") .content(newVariableDefinitionsJson) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current variable definitions - List variableDefinitions2 = objectMapper.readValue(mvcResult2.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + List variableDefinitions2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); LOGGER.info("Initial variable definitions = " + variableDefinitions); LOGGER.info("Updated variable definitions = " + variableDefinitions2); @@ -404,13 +414,13 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { assertTrue(variableDefinitions2.containsAll(variableDefinitions)); // --- Remove an existing variable definition --- // - MvcResult mvcResult3 = mvc.perform(patch("/models/" + modelName + "/variables/remove") + mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/remove") .content(objectMapper.writeValueAsString(List.of(variableDefinitions2.get(5).getName()))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current variable definitions - List variableDefinitions3 = objectMapper.readValue(mvcResult3.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + List variableDefinitions3 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); LOGGER.info("Updated variable definitions = " + variableDefinitions2); LOGGER.info("Removed variable definitions = " + variableDefinitions3); @@ -420,11 +430,11 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { assertTrue(variableDefinitions2.containsAll(variableDefinitions3)); // --- Remove all variable definitions --- // - MvcResult mvcResult4 = mvc.perform(patch("/models/" + modelName + "/variables/remove-all") + mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List variableDefinitions4 = objectMapper.readValue(mvcResult4.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + List variableDefinitions4 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); LOGGER.info("Unset variable definitions = " + variableDefinitions4); // check result @@ -434,24 +444,24 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { // --- Save new variable definition --- // List variableDefinitionList = objectMapper.readValue(newVariableDefinitionsJson, new TypeReference>() { }); variableDefinitionList.get(0).setName("load_running_value_3"); - MvcResult mvcResult5 = mvc.perform(post("/models/variables") + mvcResult = mvc.perform(post("/models/variables") .content(objectMapper.writeValueAsString(variableDefinitionList)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List savedVariableDefinitionList = objectMapper.readValue(mvcResult5.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()); // --- Add existing variable definition to model --- // - MvcResult mvcResult6 = mvc.perform(patch("/models/" + modelName + "/variables/add") + mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/add") .content(objectMapper.writeValueAsString(savedVariableDefinitionList.stream().map(ModelVariableDefinition::getName))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current variable definitions in the model - List variableDefinitions6 = objectMapper.readValue(mvcResult6.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + 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()); @@ -566,14 +576,24 @@ public void testSaveNewVariablesSetsWhichShareVariableDefinitions() throws Excep // Check result assertEquals(2, variableDefinitions.size()); + // --- Get initial variable definition from GET endpoint --- // + mvcResult = mvc.perform(get("/models/variables-sets/" + variablesSet.getName() + "/variables")) + .andExpect(status().isOk()).andReturn(); + List variableDefinitions1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); + assertEquals(2, variableDefinitions1.size()); + + // --- Try to get variable definition from unknown variables set --- // + mvc.perform(get("/models/variables-sets/" + "variable_set_unknown" + "/variables")) + .andExpect(status().isNotFound()); + // --- Put the second variables set with 3 variable definitions in which 2 ones are identical to first variables set --- // - MvcResult mvcResult2 = mvc.perform(post("/models/variables-sets") + mvcResult = mvc.perform(post("/models/variables-sets") .content(newVariablesSet2Json) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get initial variable definitions - VariablesSet variablesSet2 = objectMapper.readValue(mvcResult2.getResponse().getContentAsString(), VariablesSet.class); + VariablesSet variablesSet2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); List variableDefinitions2 = variablesSet2.getVariableDefinitions(); // Check result @@ -631,6 +651,16 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { assertEquals(4, variableDefinitionsOfGeneratorSet.size()); assertEquals(1, variableDefinitionsOfVoltageRegulatorSet.size()); + // --- 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()); + + // --- Try to get variable sets from unknown model --- // + mvc.perform(get("/models/" + model.getModelName() + "_unknown" + "/variables")) + .andExpect(status().isNotFound()); + // --- Put second time which add only a variables sets --- // mvcResult = mvc.perform(post("/models/" + model.getModelName() + "/variables-sets") .content("[\n" + newVariablesSetJson + "\n]") From 3ba4b7f78fe3a1dfb7da619da651a5b1df0758ff Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Tue, 6 Jun 2023 18:21:00 +0200 Subject: [PATCH 08/16] re-factorisation script SQL for parameter definitions --- src/main/resources/IEEE14Models.sql | 562 ++++++++++++++++------------ 1 file changed, 317 insertions(+), 245 deletions(-) diff --git a/src/main/resources/IEEE14Models.sql b/src/main/resources/IEEE14Models.sql index 55f798b1..627ccc6e 100644 --- a/src/main/resources/IEEE14Models.sql +++ b/src/main/resources/IEEE14Models.sql @@ -1,15 +1,15 @@ -- Temporary models values while no user interface for them is provided. -INSERT INTO models (model_name, equipment_type) -VALUES ('GeneratorSynchronousThreeWindings', 0), - ('GeneratorSynchronousFourWindings', 0), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 0), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 0), - ('GeneratorPQ', 0), - ('GeneratorPV', 0), - ('LoadAlphaBeta', 1), - ('LoadPQ', 1), - ('CurrentLimitAutomaton', 2); +INSERT INTO models (model_name, equipment_type, created_date) +VALUES ('GeneratorSynchronousThreeWindings', 0, now()::timestamp), + ('GeneratorSynchronousFourWindings', 0, now()::timestamp), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 0, now()::timestamp), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 0, now()::timestamp), + ('GeneratorPQ', 0, now()::timestamp), + ('GeneratorPV', 0, now()::timestamp), + ('LoadAlphaBeta', 1, now()::timestamp), + ('LoadPQ', 1, now()::timestamp), + ('CurrentLimitAutomaton', 2, now()::timestamp); INSERT INTO model_sets_group (model_name, name, type) VALUES ('GeneratorSynchronousThreeWindings', 'GSTW', 0), @@ -37,223 +37,295 @@ VALUES ('GSTW', 0, 'GeneratorSynchronousThreeWindings', 'GSTW'), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'CLA_2_4'), ('CLA_2_5', 0, 'CurrentLimitAutomaton', 'CLA_2_5'); -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousThreeWindings', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousThreeWindings', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindings', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindings', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousFourWindings', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousFourWindings', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XpqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tpq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindings', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindings', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_KGover', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_Gain', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_KGover', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_Gain', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('GeneratorPQ', 'generator_AlphaPuPNom', 2, NULL, 2), - ('GeneratorPQ', 'generator_PNom', 0, 'pMax', 2), - ('GeneratorPQ', 'generator_PMin', 0, 'pMin', 2), - ('GeneratorPQ', 'generator_PMax', 0, 'pMax', 2), - ('GeneratorPQ', 'generator_P0Pu', 0, 'p_pu', 2), - ('GeneratorPQ', 'generator_Q0Pu', 0, 'q_pu', 2), - ('GeneratorPQ', 'generator_U0Pu', 0, 'v_pu', 2), - ('GeneratorPQ', 'generator_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('GeneratorPV', 'generator_AlphaPuPNom', 2, NULL, 2), - ('GeneratorPV', 'generator_LambdaPuSNom', 2, NULL, 2), - ('GeneratorPV', 'generator_QMax', 2, NULL, 2), - ('GeneratorPV', 'generator_QMin', 2, NULL, 2), - ('GeneratorPV', 'generator_PNom', 0, 'pMax', 2), - ('GeneratorPV', 'generator_SNom', 0, 'pMax', 2), - ('GeneratorPV', 'generator_PMin', 0, 'pMin', 2), - ('GeneratorPV', 'generator_PMax', 0, 'pMax', 2), - ('GeneratorPV', 'generator_P0Pu', 0, 'p_pu', 2), - ('GeneratorPV', 'generator_Q0Pu', 0, 'q_pu', 2), - ('GeneratorPV', 'generator_U0Pu', 0, 'v_pu', 2), - ('GeneratorPV', 'generator_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('LoadAlphaBeta', 'load_alpha', 2, NULL, 2), - ('LoadAlphaBeta', 'load_beta', 2, NULL, 2), - ('LoadAlphaBeta', 'load_P0Pu', 0, 'p_pu', 2), - ('LoadAlphaBeta', 'load_Q0Pu', 0, 'q_pu', 2), - ('LoadAlphaBeta', 'load_U0Pu', 0, 'v_pu', 2), - ('LoadAlphaBeta', 'load_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('LoadPQ', 'load_P0Pu', 0, 'p_pu', 2), - ('LoadPQ', 'load_Q0Pu', 0, 'q_pu', 2), - ('LoadPQ', 'load_U0Pu', 0, 'v_pu', 2), - ('LoadPQ', 'load_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', 2, NULL, 0), - ('CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 2, NULL, 1), - ('CurrentLimitAutomaton', 'currentLimitAutomaton_IMax', 2, NULL, 2), - ('CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing', 2, NULL, 2); +INSERT INTO model_parameter_definitions (name, origin, origin_name, type, fixed_value, created_date) +VALUES ('generator_UNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_SNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_PNomTurb', 2, NULL, 2, NULL, now()::timestamp), + ('generator_PNomAlt', 2, NULL, 2, NULL, now()::timestamp), + ('generator_ExcitationPu', 1, NULL, 0, 1, now()::timestamp), + ('generator_MdPuEfd', 2, NULL, 2, NULL, now()::timestamp), + ('generator_H', 2, NULL, 2, NULL, now()::timestamp), + ('generator_DPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_SnTfo', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UNomHV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UNomLV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UBaseHV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UBaseLV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_RTfPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XTfPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_RaPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XlPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XdPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XpdPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XppdPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tpd0', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tppd0', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XqPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XppqPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tppq0', 2, NULL, 2, NULL, now()::timestamp), + ('generator_md', 2, NULL, 2, NULL, now()::timestamp), + ('generator_mq', 2, NULL, 2, NULL, now()::timestamp), + ('generator_nd', 2, NULL, 2, NULL, now()::timestamp), + ('generator_nq', 2, NULL, 2, NULL, now()::timestamp), + ('URef_ValueIn', 1, NULL, 2, 0, now()::timestamp), + ('Pm_ValueIn', 1, NULL, 2, 0, now()::timestamp), + ('generator_P0Pu', 0, 'p_pu', 2, NULL, now()::timestamp), + ('generator_Q0Pu', 0, 'q_pu', 2, NULL, now()::timestamp), + ('generator_UPhase0', 0, 'angle_pu', 2, NULL, now()::timestamp), + ('generator_U0Pu', 0, 'v_pu', 2, NULL, now()::timestamp), + ('generator_XpqPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tpq0', 2, NULL, 2, NULL, now()::timestamp), + ('governor_KGover', 2, NULL, 2, NULL, now()::timestamp), + ('governor_PMin', 2, NULL, 2, NULL, now()::timestamp), + ('governor_PMax', 2, NULL, 2, NULL, now()::timestamp), + ('governor_PNom', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_LagEfdMin', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_LagEfdMax', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_EfdMinPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_EfdMaxPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_UsRefMinPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_UsRefMaxPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_Gain', 2, NULL, 2, NULL, now()::timestamp), + ('generator_AlphaPuPNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_PNom', 0, 'pMax', 2, NULL, now()::timestamp), + ('generator_PMin', 0, 'pMin', 2, NULL, now()::timestamp), + ('generator_PMax', 0, 'pMax', 2, NULL, now()::timestamp), + ('generator_LambdaPuSNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_QMax', 2, NULL, 2, NULL, now()::timestamp), + ('generator_QMin', 2, NULL, 2, NULL, now()::timestamp); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousThreeWindings', 'generator_UNom'), + ('GeneratorSynchronousThreeWindings', 'generator_SNom'), + ('GeneratorSynchronousThreeWindings', 'generator_PNomTurb'), + ('GeneratorSynchronousThreeWindings', 'generator_PNomAlt'), + ('GeneratorSynchronousThreeWindings', 'generator_ExcitationPu'), + ('GeneratorSynchronousThreeWindings', 'generator_MdPuEfd'), + ('GeneratorSynchronousThreeWindings', 'generator_H'), + ('GeneratorSynchronousThreeWindings', 'generator_DPu'), + ('GeneratorSynchronousThreeWindings', 'generator_SnTfo'), + ('GeneratorSynchronousThreeWindings', 'generator_UNomHV'), + ('GeneratorSynchronousThreeWindings', 'generator_UNomLV'), + ('GeneratorSynchronousThreeWindings', 'generator_UBaseHV'), + ('GeneratorSynchronousThreeWindings', 'generator_UBaseLV'), + ('GeneratorSynchronousThreeWindings', 'generator_RTfPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XTfPu'), + ('GeneratorSynchronousThreeWindings', 'generator_RaPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XlPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XdPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XpdPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XppdPu'), + ('GeneratorSynchronousThreeWindings', 'generator_Tpd0'), + ('GeneratorSynchronousThreeWindings', 'generator_Tppd0'), + ('GeneratorSynchronousThreeWindings', 'generator_XqPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XppqPu'), + ('GeneratorSynchronousThreeWindings', 'generator_Tppq0'), + ('GeneratorSynchronousThreeWindings', 'generator_md'), + ('GeneratorSynchronousThreeWindings', 'generator_mq'), + ('GeneratorSynchronousThreeWindings', 'generator_nd'), + ('GeneratorSynchronousThreeWindings', 'generator_nq'), + ('GeneratorSynchronousThreeWindings', 'URef_ValueIn'), + ('GeneratorSynchronousThreeWindings', 'Pm_ValueIn'), + ('GeneratorSynchronousThreeWindings', 'generator_P0Pu'), + ('GeneratorSynchronousThreeWindings', 'generator_Q0Pu'), + ('GeneratorSynchronousThreeWindings', 'generator_UPhase0'), + ('GeneratorSynchronousThreeWindings', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousFourWindings', 'generator_UNom'), + ('GeneratorSynchronousFourWindings', 'generator_SNom'), + ('GeneratorSynchronousFourWindings', 'generator_PNomTurb'), + ('GeneratorSynchronousFourWindings', 'generator_PNomAlt'), + ('GeneratorSynchronousFourWindings', 'generator_ExcitationPu'), + ('GeneratorSynchronousFourWindings', 'generator_MdPuEfd'), + ('GeneratorSynchronousFourWindings', 'generator_H'), + ('GeneratorSynchronousFourWindings', 'generator_DPu'), + ('GeneratorSynchronousFourWindings', 'generator_SnTfo'), + ('GeneratorSynchronousFourWindings', 'generator_UNomHV'), + ('GeneratorSynchronousFourWindings', 'generator_UNomLV'), + ('GeneratorSynchronousFourWindings', 'generator_UBaseHV'), + ('GeneratorSynchronousFourWindings', 'generator_UBaseLV'), + ('GeneratorSynchronousFourWindings', 'generator_RTfPu'), + ('GeneratorSynchronousFourWindings', 'generator_XTfPu'), + ('GeneratorSynchronousFourWindings', 'generator_RaPu'), + ('GeneratorSynchronousFourWindings', 'generator_XlPu'), + ('GeneratorSynchronousFourWindings', 'generator_XdPu'), + ('GeneratorSynchronousFourWindings', 'generator_XpdPu'), + ('GeneratorSynchronousFourWindings', 'generator_XppdPu'), + ('GeneratorSynchronousFourWindings', 'generator_Tpd0'), + ('GeneratorSynchronousFourWindings', 'generator_Tppd0'), + ('GeneratorSynchronousFourWindings', 'generator_XqPu'), + ('GeneratorSynchronousFourWindings', 'generator_XppqPu'), + ('GeneratorSynchronousFourWindings', 'generator_Tppq0'), + ('GeneratorSynchronousFourWindings', 'generator_md'), + ('GeneratorSynchronousFourWindings', 'generator_mq'), + ('GeneratorSynchronousFourWindings', 'generator_nd'), + ('GeneratorSynchronousFourWindings', 'generator_nq'), + ('GeneratorSynchronousFourWindings', 'generator_XpqPu'), + ('GeneratorSynchronousFourWindings', 'generator_Tpq0'), + ('GeneratorSynchronousFourWindings', 'URef_ValueIn'), + ('GeneratorSynchronousFourWindings', 'Pm_ValueIn'), + ('GeneratorSynchronousFourWindings', 'generator_P0Pu'), + ('GeneratorSynchronousFourWindings', 'generator_Q0Pu'), + ('GeneratorSynchronousFourWindings', 'generator_UPhase0'), + ('GeneratorSynchronousFourWindings', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNom'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SNom'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomTurb'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomAlt'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_ExcitationPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_MdPuEfd'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_H'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_DPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SnTfo'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomHV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomLV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseHV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseLV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RTfPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XTfPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RaPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XlPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XdPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XpdPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppdPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tpd0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppd0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XqPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppqPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppq0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_md'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_mq'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nd'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nq'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_KGover'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMin'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMax'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PNom'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_Gain'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'URef_ValueIn'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'Pm_ValueIn'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_P0Pu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Q0Pu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UPhase0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNom'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SNom'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomTurb'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomAlt'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_ExcitationPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_MdPuEfd'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_H'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_DPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SnTfo'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomHV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomLV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseHV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseLV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RTfPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XTfPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RaPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XlPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XdPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpdPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppdPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpd0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppd0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XqPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppqPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppq0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_md'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_mq'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nd'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nq'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpqPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpq0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_KGover'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMin'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMax'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PNom'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_Gain'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'URef_ValueIn'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'Pm_ValueIn'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_P0Pu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Q0Pu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UPhase0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorPQ', 'generator_AlphaPuPNom'), + ('GeneratorPQ', 'generator_PNom'), + ('GeneratorPQ', 'generator_PMin'), + ('GeneratorPQ', 'generator_PMax'), + ('GeneratorPQ', 'generator_P0Pu'), + ('GeneratorPQ', 'generator_Q0Pu'), + ('GeneratorPQ', 'generator_U0Pu'), + ('GeneratorPQ', 'generator_UPhase0'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorPV', 'generator_AlphaPuPNom'), + ('GeneratorPV', 'generator_LambdaPuSNom'), + ('GeneratorPV', 'generator_QMax'), + ('GeneratorPV', 'generator_QMin'), + ('GeneratorPV', 'generator_PNom'), + ('GeneratorPV', 'generator_SNom'), + ('GeneratorPV', 'generator_PMin'), + ('GeneratorPV', 'generator_PMax'), + ('GeneratorPV', 'generator_P0Pu'), + ('GeneratorPV', 'generator_Q0Pu'), + ('GeneratorPV', 'generator_U0Pu'), + ('GeneratorPV', 'generator_UPhase0'); + +INSERT INTO model_parameter_definitions (name, origin, origin_name, type, created_date) +VALUES ('load_alpha', 2, NULL, 2, now()::timestamp), + ('load_beta', 2, NULL, 2, now()::timestamp), + ('load_P0Pu', 0, 'p_pu', 2, now()::timestamp), + ('load_Q0Pu', 0, 'q_pu', 2, now()::timestamp), + ('load_U0Pu', 0, 'v_pu', 2, now()::timestamp), + ('load_UPhase0', 0, 'angle_pu', 2, now()::timestamp); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('LoadAlphaBeta', 'load_alpha'), + ('LoadAlphaBeta', 'load_beta'), + ('LoadAlphaBeta', 'load_P0Pu'), + ('LoadAlphaBeta', 'load_Q0Pu'), + ('LoadAlphaBeta', 'load_U0Pu'), + ('LoadAlphaBeta', 'load_UPhase0'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('LoadPQ', 'load_P0Pu'), + ('LoadPQ', 'load_Q0Pu'), + ('LoadPQ', 'load_U0Pu'), + ('LoadPQ', 'load_UPhase0'); + +INSERT INTO model_parameter_definitions (name, origin, origin_name, type, created_date) +VALUES + ('currentLimitAutomaton_OrderToEmit', 2, NULL, 0, now()::timestamp), + ('currentLimitAutomaton_Running', 2, NULL, 1, now()::timestamp), + ('currentLimitAutomaton_IMax', 2, NULL, 2, now()::timestamp), + ('currentLimitAutomaton_tLagBeforeActing', 2, NULL, 2, now()::timestamp); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit'), + ('CurrentLimitAutomaton', 'currentLimitAutomaton_Running'), + ('CurrentLimitAutomaton', 'currentLimitAutomaton_IMax'), + ('CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing'); INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) VALUES ('GSTW', 0, 'GeneratorSynchronousThreeWindings', 'generator_ExcitationPu', 'GSTW', 1.), @@ -486,13 +558,13 @@ VALUES ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 'CLA', true), ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_IMax', 'CLA', 1000.), ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing', 'CLA', 10.); - + INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) VALUES ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', 'CLA_2_4', 3), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 'CLA_2_4', true), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_IMax', 'CLA_2_4', 1000.), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing', 'CLA_2_4', 10.); - + INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) VALUES ('CLA_2_5', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', 'CLA_2_5', 1), ('CLA_2_5', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 'CLA_2_5', true), @@ -779,12 +851,12 @@ VALUES ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UPhase0', 'IEEE14_GEN____8_SM'); -- variables for LoadAlphaBeta model -INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date, updated_date) -VALUES ('load_PPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_PRefPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_QPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_QRefPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_running_value', 1, NULL, NULL, now()::timestamp, now()::timestamp); +INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date) +VALUES ('load_PPu', 2, 'MW', 100, now()::timestamp), + ('load_PRefPu', 2, 'MW', 100, now()::timestamp), + ('load_QPu', 2, 'MW', 100, now()::timestamp), + ('load_QRefPu', 2, 'MW', 100, now()::timestamp), + ('load_running_value', 1, NULL, NULL, now()::timestamp); INSERT INTO models_model_variable_definitions (model_name, variable_definition_name) VALUES ('LoadAlphaBeta', 'load_PPu'), @@ -793,16 +865,16 @@ VALUES ('LoadAlphaBeta', 'load_PPu'), ('LoadAlphaBeta', 'load_QRefPu'), ('LoadAlphaBeta', 'load_running_value'); -INSERT INTO model_variable_sets (variable_set_name, created_date, updated_date) -VALUES ('Generator', now()::timestamp, now()::timestamp), - ('VoltageRegulator', now()::timestamp, now()::timestamp); +INSERT INTO model_variable_sets (variable_set_name, created_date) +VALUES ('Generator', now()::timestamp), + ('VoltageRegulator', now()::timestamp); -- variables grouped in sets used in generator models -INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date, updated_date) -VALUES ('generator_omegaPu', 2, 'pu', NULL, now()::timestamp, now()::timestamp), - ('generator_PGen', 2, 'MW', NULL, now()::timestamp, now()::timestamp), - ('generator_QGen', 2, 'MW', NULL, now()::timestamp, now()::timestamp), - ('generator_UStatorPu', 2, 'pu', NULL, now()::timestamp, now()::timestamp); +INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date) +VALUES ('generator_omegaPu', 2, 'pu', NULL, now()::timestamp), + ('generator_PGen', 2, 'MW', NULL, now()::timestamp), + ('generator_QGen', 2, 'MW', NULL, now()::timestamp), + ('generator_UStatorPu', 2, 'pu', NULL, now()::timestamp); INSERT INTO model_variable_sets_model_variable_definitions (variable_definition_name, variable_set_name) VALUES ('generator_omegaPu', 'Generator'), @@ -810,8 +882,8 @@ VALUES ('generator_omegaPu', 'Generator'), ('generator_QGen', 'Generator'), ('generator_UStatorPu', 'Generator'); -INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date, updated_date) -VALUES ('voltageRegulator_EfdPu', 2, 'pu', NULL, now()::timestamp, now()::timestamp); +INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date) +VALUES ('voltageRegulator_EfdPu', 2, 'pu', NULL, now()::timestamp); INSERT INTO model_variable_sets_model_variable_definitions (variable_definition_name, variable_set_name) VALUES ('voltageRegulator_EfdPu', 'VoltageRegulator'); From f75ecb9312419c2307a316d39580d7d5bff9abb1 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 8 Jun 2023 13:46:04 +0200 Subject: [PATCH 09/16] Revert many-to-many relationship in order to make Hibernate persist parent-children with reuse existing children --- .../mapping/server/model/ModelEntity.java | 22 ++-- .../model/ModelParameterDefinitionEntity.java | 8 +- .../model/ModelVariableDefinitionEntity.java | 18 ++-- .../server/model/ModelVariableSetEntity.java | 6 +- .../mapping/server/ModelControllerTest.java | 101 ++++++++++++++---- .../resources/data/model/load/loadPQ.json | 52 +++++++++ 6 files changed, 162 insertions(+), 45 deletions(-) create mode 100644 src/test/resources/data/model/load/loadPQ.json 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 2a8c9403..3a73bdf8 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -30,7 +30,7 @@ @Setter @Entity @Table(name = "models") -public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity implements Serializable { +public class ModelEntity implements Serializable { // Could be replaced with UUID, but we lose the ease of use of names @Id @@ -41,23 +41,29 @@ public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity parameterDefinitions = new LinkedHashSet<>(0); @OneToMany(targetEntity = ModelSetsGroupEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) private List setsGroups = new ArrayList<>(0); - @ManyToMany(targetEntity = ModelVariableDefinitionEntity.class, mappedBy = "models", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + // 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_name")}, + inverseJoinColumns = {@JoinColumn(name = "variable_definition_name")} + ) private Set variableDefinitions = new LinkedHashSet<>(0); @ManyToMany(targetEntity = ModelVariableSetEntity.class, mappedBy = "models", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) private Set variableSets = new LinkedHashSet<>(0); - @Override - public String getId() { - return modelName; - } - public ModelEntity(Model modelToConvert) { modelName = modelToConvert.getModelName(); equipmentType = modelToConvert.getEquipmentType(); 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 c08e7e9e..538923d9 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -53,11 +53,9 @@ public class ModelParameterDefinitionEntity implements Serializable { @Column(name = "fixed_value") private String fixedValue; - @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinTable( - name = "models_model_parameter_definitions", - joinColumns = {@JoinColumn(name = "parameter_definition_name", referencedColumnName = "name")}, - inverseJoinColumns = {@JoinColumn(name = "model_name")} + @ManyToMany( + mappedBy = "parameterDefinitions", + cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH} ) private Set models; 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 9bddbc79..5ec3dba1 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java @@ -45,19 +45,15 @@ public class ModelVariableDefinitionEntity implements Serializable { @Column(name = "factor") private Double factor; - // 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 = "variable_definition_name")}, - inverseJoinColumns = {@JoinColumn(name = "model_name")} - ) + @ManyToMany( + mappedBy = "variableDefinitions", + cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) private Set models; - @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinTable(name = "model_variable_sets_model_variable_definitions", - joinColumns = {@JoinColumn(name = "variable_definition_name")}, - inverseJoinColumns = {@JoinColumn(name = "variable_set_name")}) + @ManyToMany( + mappedBy = "variableDefinitions", + cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH} + ) private Set variablesSets; public ModelVariableDefinitionEntity(ModelEntity model, ModelVariableSetEntity variablesSet, ModelVariableDefinition variableDefinition) { 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 9a524148..3091849a 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java @@ -35,7 +35,11 @@ public class ModelVariableSetEntity implements Serializable { @Column(name = "variable_set_name") private String name; - @ManyToMany(targetEntity = ModelVariableDefinitionEntity.class, mappedBy = "variablesSets", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + @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")} + ) private Set variableDefinitions = new LinkedHashSet<>(0); @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index 3de1527d..9df68450 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; import org.gridsuite.mapping.server.dto.models.Model; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ModelVariableDefinition; @@ -76,10 +77,11 @@ public class ModelControllerTest { ObjectMapper objectMapper; public void cleanDB() { - modelVariableRepository.deleteAll(); + // delete from parent to child + modelRepository.deleteAll(); modelVariablesSetRepository.deleteAll(); + modelVariableRepository.deleteAll(); modelParameterDefinitionRepository.deleteAll(); - modelRepository.deleteAll(); } private ModelParameterDefinitionEntity createDefinitionEntity(String name, ParameterType type, ParameterOrigin origin, String originName, ModelEntity model) { @@ -556,7 +558,6 @@ public void testSaveNewVariablesSetThenModifyVariableDefinitions() throws Except } @Test - @Transactional public void testSaveNewVariablesSetsWhichShareVariableDefinitions() throws Exception { String newVariablesSetJson = readFileAsString("src/test/resources/data/model/generator/variablesSet_ThreeWindingsSynchronousGenerator.json"); String newVariablesSet2Json = readFileAsString("src/test/resources/data/model/generator/variablesSet_FourWindingsSynchronousGenerator.json"); @@ -570,37 +571,97 @@ public void testSaveNewVariablesSetsWhichShareVariableDefinitions() throws Excep .andExpect(status().isOk()).andReturn(); // Get initial variable definitions - VariablesSet variablesSet = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); - List variableDefinitions = variablesSet.getVariableDefinitions(); + VariablesSet threeWindingVariablesSet = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); - // Check result - assertEquals(2, variableDefinitions.size()); + // --- Put the second variables set with 3 variable definitions in which 2 ones are identical to first variables set --- // + mvcResult = mvc.perform(post("/models/variables-sets") + .content(newVariablesSet2Json) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + // Get initial variable definitions + VariablesSet fourWindingVariablesSet = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); // --- Get initial variable definition from GET endpoint --- // - mvcResult = mvc.perform(get("/models/variables-sets/" + variablesSet.getName() + "/variables")) + mvcResult = mvc.perform(get("/models/variables-sets/" + threeWindingVariablesSet.getName() + "/variables")) .andExpect(status().isOk()).andReturn(); - List variableDefinitions1 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); - assertEquals(2, variableDefinitions1.size()); + List threeWindingVariableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference>() { }); + assertEquals(2, threeWindingVariableDefinitions.size()); // --- Try to get variable definition from unknown variables set --- // mvc.perform(get("/models/variables-sets/" + "variable_set_unknown" + "/variables")) .andExpect(status().isNotFound()); - // --- Put the second variables set with 3 variable definitions in which 2 ones are identical to first variables set --- // - mvcResult = mvc.perform(post("/models/variables-sets") - .content(newVariablesSet2Json) + // --- Get initial variable definition from GET endpoint --- // + 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()); + + // cross-check between two variables set + Sets.SetView intersectionVariableDefinitions = Sets.intersection(new HashSet<>(fourWindingVariableDefinitions), new HashSet<>(threeWindingVariableDefinitions)); + assertEquals(2, intersectionVariableDefinitions.size()); + } + + @Test + public void testSaveNewLoadModelsWhichShareParameterDefinitionsAndVariableDefinitions() throws Exception { + String newLoadAlphaBetaModelJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta.json"); + String newLoadPQModelJson = readFileAsString("src/test/resources/data/model/load/loadPQ.json"); + + cleanDB(); + + + // *** LOAD ALPHA BETA *** // + // --- Put data first time with initial parameter/variable definitions --- // + MvcResult mvcResult = mvc.perform(post("/models/") + .content(newLoadAlphaBetaModelJson) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - // Get initial variable definitions - VariablesSet variablesSet2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); - List variableDefinitions2 = variablesSet2.getVariableDefinitions(); + String loadAlphaBetaModelName = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getModelName(); - // Check result - assertEquals(3, variableDefinitions2.size()); + // *** LOAD PQ *** // + // --- Put data first time with initial parameter/variable definitions --- // + mvcResult = mvc.perform(post("/models/") + .content(newLoadPQModelJson) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + String loadPQModelName = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getModelName(); + + // --- 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()); + + // --- 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()); + + // --- 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()); + + // --- 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()); + + // cross-check variable definitions between two models + Sets.SetView intersectionVariableDefinitions = Sets.intersection(new HashSet<>(loadAlphaBetaVariableDefinitions), new HashSet<>(loadPQVariableDefinitions)); + assertEquals(3, intersectionVariableDefinitions.size()); + + // cross-check parameter definitions between two models + Sets.SetView intersectionParameterDefinitions = Sets.intersection(new HashSet<>(loadAlphaBetaParameterDefinitions), new HashSet<>(loadPQParameterDefinitions)); + assertEquals(4, intersectionParameterDefinitions.size()); - // cross-check between two variables set - variableDefinitions2.containsAll(variableDefinitions); } @Test diff --git a/src/test/resources/data/model/load/loadPQ.json b/src/test/resources/data/model/load/loadPQ.json new file mode 100644 index 00000000..fe1b286d --- /dev/null +++ b/src/test/resources/data/model/load/loadPQ.json @@ -0,0 +1,52 @@ +{ + "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_PPu", + "type": "DOUBLE", + "unit": "MW", + "factor": 100 + }, + { + "name": "load_QPu", + "type": "DOUBLE", + "unit": "MW", + "factor": 100 + }, + { + "name": "load_QRefPu", + "type": "DOUBLE", + "unit": "MW", + "factor": 100 + } + ], + "variablesSets": [] +} \ No newline at end of file From f7f1e658f49891bfc507fdbe205dd6213451ac37 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 8 Jun 2023 13:47:56 +0200 Subject: [PATCH 10/16] ESlint --- .../java/org/gridsuite/mapping/server/ModelControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index 9df68450..7ff1ce3f 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -611,7 +611,6 @@ public void testSaveNewLoadModelsWhichShareParameterDefinitionsAndVariableDefini cleanDB(); - // *** LOAD ALPHA BETA *** // // --- Put data first time with initial parameter/variable definitions --- // MvcResult mvcResult = mvc.perform(post("/models/") From c2f15fd8e77177f751be74f85d3978c37fc166f9 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 8 Jun 2023 14:25:17 +0200 Subject: [PATCH 11/16] Correct clean DB order --- .../java/org/gridsuite/mapping/server/ScriptControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index d979ade2..d8fbbd2f 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -58,8 +58,8 @@ public class ScriptControllerTest { private void cleanDB() { scriptRepository.deleteAll(); - modelParameterDefinitionRepository.deleteAll(); modelRepository.deleteAll(); + modelParameterDefinitionRepository.deleteAll(); } private ModelParameterDefinitionEntity createDefinitionEntity(String name, ParameterType type, ParameterOrigin origin, String originName, ModelEntity model) { From 37b3f55e7a8569d06813d01d46be5636214caaac Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 8 Jun 2023 15:46:13 +0200 Subject: [PATCH 12/16] First merge from branch parameter definition --- .../server/controller/ModelController.java | 26 +- .../mapping/server/model/ModelEntity.java | 22 +- .../model/ModelParameterDefinitionEntity.java | 8 +- .../server/model/ModelParameterSetEntity.java | 3 +- .../model/ModelVariableDefinitionEntity.java | 18 +- .../server/model/ModelVariableSetEntity.java | 6 +- .../mapping/server/service/ModelService.java | 6 + .../implementation/ModelServiceImpl.java | 235 +++++--- src/main/resources/IEEE14Models.sql | 562 ++++++++++-------- .../mapping/server/ModelControllerTest.java | 225 +++++-- .../mapping/server/ScriptControllerTest.java | 12 +- 11 files changed, 691 insertions(+), 432 deletions(-) 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 5ca42c9f..e1f3acca 100644 --- a/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java +++ b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java @@ -60,7 +60,6 @@ public ResponseEntity saveSimpleParametersSet(@PathVariable return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveParametersSetsGroup(modelName, setsGroup, false)); } - @PostMapping(value = "/") @Operation(summary = "Post a model") @ApiResponses(value = { @@ -77,7 +76,6 @@ public ResponseEntity deleteSet(@PathVariable("modelName") return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.deleteSet(modelName, groupName, groupType, setName)); } - @GetMapping(value = "/") @Operation(summary = "get models names") @ApiResponses(value = { @@ -145,6 +143,14 @@ public ResponseEntity> deleteParameterDefinitions(@RequestBody List // --- END parameter definition-related endpoints --- // // --- BEGIN variable-related endpoints --- // + @GetMapping(value = "/{modelName}/variables") + @Operation(summary = "get variable definitions for a given model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "variable definitions of the model")}) + public ResponseEntity> getVariablesFromModel(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getVariableDefinitionsFromModel(modelName)); + } + @PostMapping(value = "/{modelName}/variables") @Operation(summary = "Add new variable definitions to model") @ApiResponses(value = { @@ -177,6 +183,14 @@ public ResponseEntity removeAllVariablesOnModel(@PathVariable("modelName" return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeAllVariableDefinitionsOnModel(modelName)); } + @GetMapping(value = "/variables-sets/{variableSetName}/variables") + @Operation(summary = "Add variable definitions from variables set") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "variable definitions of variables set")}) + public ResponseEntity> getVariablesFromVariablesSet(@PathVariable("variableSetName") String variableSetName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getVariableDefinitionsFromVariablesSet(variableSetName)); + } + @PostMapping(value = "/variables-sets/{variableSetName}/variables") @Operation(summary = "Add new variable definitions to variables set") @ApiResponses(value = { @@ -201,6 +215,14 @@ public ResponseEntity removeAllVariableDefinitionOnVariablesSet(@P return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.removeAllVariableDefinitionOnVariablesSet(variableSetName)); } + @GetMapping(value = "/{modelName}/variables-sets") + @Operation(summary = "get variable sets for a given model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "variable sets of the model")}) + public ResponseEntity> getVariablesSetsFromModel(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getVariablesSetsFromModel(modelName)); + } + @PostMapping(value = "/{modelName}/variables-sets") @Operation(summary = "Add new variables set to model") @ApiResponses(value = { 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 8c0af5f1..f7ee5716 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -30,7 +30,7 @@ @Setter @Entity @Table(name = "models") -public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity implements Serializable { +public class ModelEntity implements Serializable { // Could be replaced with UUID, but we lose the ease of use of names @Id @@ -41,23 +41,29 @@ public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity parameterDefinitions = new LinkedHashSet<>(0); @OneToMany(targetEntity = ModelSetsGroupEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) private List setsGroups = new ArrayList<>(0); - @ManyToMany(targetEntity = ModelVariableDefinitionEntity.class, mappedBy = "models", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + // 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_name")}, + inverseJoinColumns = {@JoinColumn(name = "variable_definition_name")} + ) private Set variableDefinitions = new LinkedHashSet<>(0); @ManyToMany(targetEntity = ModelVariableSetEntity.class, mappedBy = "models", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) private Set variableSets = new LinkedHashSet<>(0); - @Override - public String getId() { - return modelName; - } - public ModelEntity(Model modelToConvert) { modelName = modelToConvert.getModelName(); equipmentType = modelToConvert.getEquipmentType(); 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 c08e7e9e..538923d9 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -53,11 +53,9 @@ public class ModelParameterDefinitionEntity implements Serializable { @Column(name = "fixed_value") private String fixedValue; - @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinTable( - name = "models_model_parameter_definitions", - joinColumns = {@JoinColumn(name = "parameter_definition_name", referencedColumnName = "name")}, - inverseJoinColumns = {@JoinColumn(name = "model_name")} + @ManyToMany( + mappedBy = "parameterDefinitions", + cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH} ) private Set models; 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 edca16b8..313637e8 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -46,8 +46,7 @@ public class ModelParameterSetEntity implements Serializable { private ModelSetsGroupEntity group; public ModelParameterSetEntity(ModelSetsGroupEntity group, ParametersSet set) { - this(set.getName(), null, group, - null, null); + this(set.getName(), null, group, null, null); 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/ModelVariableDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java index 9bddbc79..5ec3dba1 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableDefinitionEntity.java @@ -45,19 +45,15 @@ public class ModelVariableDefinitionEntity implements Serializable { @Column(name = "factor") private Double factor; - // 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 = "variable_definition_name")}, - inverseJoinColumns = {@JoinColumn(name = "model_name")} - ) + @ManyToMany( + mappedBy = "variableDefinitions", + cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) private Set models; - @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinTable(name = "model_variable_sets_model_variable_definitions", - joinColumns = {@JoinColumn(name = "variable_definition_name")}, - inverseJoinColumns = {@JoinColumn(name = "variable_set_name")}) + @ManyToMany( + mappedBy = "variableDefinitions", + cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH} + ) private Set variablesSets; public ModelVariableDefinitionEntity(ModelEntity model, ModelVariableSetEntity variablesSet, ModelVariableDefinition variableDefinition) { 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 9a524148..3091849a 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelVariableSetEntity.java @@ -35,7 +35,11 @@ public class ModelVariableSetEntity implements Serializable { @Column(name = "variable_set_name") private String name; - @ManyToMany(targetEntity = ModelVariableDefinitionEntity.class, mappedBy = "variablesSets", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) + @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")} + ) private Set variableDefinitions = new LinkedHashSet<>(0); @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) diff --git a/src/main/java/org/gridsuite/mapping/server/service/ModelService.java b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java index 12b22e9a..655a6b56 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/ModelService.java +++ b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java @@ -44,6 +44,8 @@ public interface ModelService { // --- END parameter definition-related service methods --- // // --- BEGIN variable-related service methods --- // + List getVariableDefinitionsFromModel(String modelName); + Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitions); Model addExistingVariableDefinitionsToModel(String modelName, List variableDefinitionNames); @@ -54,8 +56,12 @@ public interface ModelService { Model removeAllVariableDefinitionsOnModel(String modelName); + List getVariablesSetsFromModel(String modelName); + VariablesSet saveNewVariablesSet(VariablesSet variableSet); + List getVariableDefinitionsFromVariablesSet(String variableSetName); + VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetName, List variableDefinitions); VariablesSet removeExistingVariableDefinitionFromVariablesSet(String variableSetName, List variableDefinitionNames); 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 045a35a8..f27b3eb0 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 @@ -18,6 +18,7 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.server.ResponseStatusException; @@ -51,6 +52,14 @@ public ModelServiceImpl( this.modelVariablesSetRepository = modelVariablesSetRepository; } + private ModelEntity getModelFromOptional(String modelName, Optional foundModelOpt) { + return foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + } + + private ModelVariableSetEntity getVariableSetFromOptional(String variableSetName, Optional foundVariableSetOpt) { + return foundVariableSetOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + } + @Override public List getModels() { return modelRepository.findAll().stream().map(modelEntity -> new SimpleModel(new Model(modelEntity))).collect(Collectors.toList()); @@ -127,48 +136,48 @@ public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGrou // --- BEGIN parameter definition-related service methods --- // @Override public List getParameterDefinitionsFromModel(String modelName) { - Optional foundModel = modelRepository.findById(modelName); - if (foundModel.isPresent()) { - Model modelToSend = new Model(foundModel.get()); - return modelToSend.getParameterDefinitions(); - } else { - throw new HttpClientErrorException(HttpStatus.NOT_FOUND); - } + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); + + Model modelToSend = new Model(modelEntity); + return modelToSend.getParameterDefinitions(); } @Override + @Transactional public Model addNewParameterDefinitionsToModel(String modelName, List parameterDefinitions) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of parameter definitions - if (parameterDefinitions != null && !parameterDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitions)) { // do merge with existing list List parameterDefinitionEntities = parameterDefinitions.stream() .map(parameterDefinition -> new ModelParameterDefinitionEntity(modelToUpdate, parameterDefinition)) .collect(Collectors.toList()); modelToUpdate.addParameterDefinitions(parameterDefinitionEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); } @Override + @Transactional public Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of parameter definitions - if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { // find existing parameter definitions List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); - // check whether found all + // check whether found all, fail fast if (foundParameterDefinitionEntities.size() != parameterDefinitionNames.size()) { List foundNames = foundParameterDefinitionEntities.stream().map(ModelParameterDefinitionEntity::getName).collect(Collectors.toList()); List notFoundNames = parameterDefinitionNames.stream().filter(name -> !foundNames.contains(name)).collect(Collectors.toList()); @@ -179,21 +188,22 @@ public Model addExistingParameterDefinitionsToModel(String modelName, List parameterDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do remove in the list of parameter definitions - if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { // find existing variable definitions List foundParameterDefinitionEntities = modelParameterDefinitionRepository.findAllById(parameterDefinitionNames); @@ -201,44 +211,59 @@ public Model removeExistingParameterDefinitionsFromModel(String modelName, List< modelToUpdate.removeParameterDefinitions(foundParameterDefinitionEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); + } @Override + @Transactional public Model removeAllParameterDefinitionsOnModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // clear the existing list modelToUpdate.removeParameterDefinitions(modelToUpdate.getParameterDefinitions()); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); + modelRepository.save(modelToUpdate); + + return new Model(modelToUpdate); } @Override + @Transactional public List saveNewParameterDefinitions(List parameterDefinitions) { - if (parameterDefinitions != null && !parameterDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitions)) { Set parameterDefinitionEntities = parameterDefinitions.stream().map(variableDefinition -> new ModelParameterDefinitionEntity(null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)); List savedParameterDefinitionEntities = modelParameterDefinitionRepository.saveAll(parameterDefinitionEntities); return savedParameterDefinitionEntities.stream().map(ModelParameterDefinition::new).collect(Collectors.toList()); } + return Collections.emptyList(); } @Override + @Transactional public List deleteParameterDefinitions(List parameterDefinitionNames) { - if (parameterDefinitionNames != null && !parameterDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(parameterDefinitionNames)) { modelParameterDefinitionRepository.deleteAllById(parameterDefinitionNames); } return parameterDefinitionNames; } + + @Override + public List getVariableDefinitionsFromModel(String modelName) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); + + Model modelToSend = new Model(modelEntity); + return modelToSend.getVariableDefinitions(); + } // --- END parameter definition-related service methods --- // // --- BEGIN variable-related service methods --- // @@ -247,21 +272,21 @@ public List deleteParameterDefinitions(List parameterDefinitionN public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitions) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variable definitions - if (variableDefinitions != null && !variableDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitions)) { // do merge with existing list List variableDefinitionEntities = variableDefinitions.stream() .map(variableDefinition -> new ModelVariableDefinitionEntity(modelToUpdate, null, variableDefinition)) .collect(Collectors.toList()); modelToUpdate.addVariableDefinitions(variableDefinitionEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); + } @Override @@ -269,14 +294,14 @@ public Model addNewVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variable definitions - if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); - // check whether found all + // check whether found all, fail fast if (foundVariableDefinitionEntities.size() != variableDefinitionNames.size()) { List foundNames = foundVariableDefinitionEntities.stream().map(ModelVariableDefinitionEntity::getName).collect(Collectors.toList()); List notFoundNames = variableDefinitionNames.stream().filter(name -> !foundNames.contains(name)).collect(Collectors.toList()); @@ -287,11 +312,10 @@ public Model addExistingVariableDefinitionsToModel(String modelName, List variableDefinitionNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do remove in the list of variable definitions - if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); @@ -310,17 +334,16 @@ public Model removeExistingVariableDefinitionsFromModel(String modelName, List saveNewVariableDefinitions(List variableDefinitions) { - if (variableDefinitions != null && !variableDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitions)) { Set variableDefinitionEntities = variableDefinitions.stream().map(variableDefinition -> new ModelVariableDefinitionEntity(null, null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)); List savedVariableDefinitionEntities = modelVariableRepository.saveAll(variableDefinitionEntities); return savedVariableDefinitionEntities.stream().map(ModelVariableDefinition::new).collect(Collectors.toList()); @@ -333,14 +356,25 @@ public List saveNewVariableDefinitions(List foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // clear the existing list modelToUpdate.removeVariableDefinitions(modelToUpdate.getVariableDefinitions()); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); + modelRepository.save(modelToUpdate); + + return new Model(modelToUpdate); + } + + @Override + public List getVariablesSetsFromModel(String modelName) { + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelEntity = getModelFromOptional(modelName, foundModelOpt); + + Model modelToSend = new Model(modelEntity); + return modelToSend.getVariablesSets(); } @Override @@ -351,34 +385,42 @@ public VariablesSet saveNewVariablesSet(VariablesSet variableSet) { return new VariablesSet(savedVariableSetEntity); } + @Override + public List getVariableDefinitionsFromVariablesSet(String variableSetName) { + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); + + ModelVariableSetEntity variableSetEntity = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); + + VariablesSet variablesSet = new VariablesSet(variableSetEntity); + return variablesSet.getVariableDefinitions(); + } + @Override @Transactional public VariablesSet addNewVariableDefinitionToVariablesSet(String variableSetName, List variableDefinitions) { - Optional foundModelOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); - ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); - if (variableDefinitions != null && !variableDefinitions.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitions)) { // do merge with existing list List variableDefinitionEntities = variableDefinitions.stream().map(variableDefinition -> new ModelVariableDefinitionEntity(null, variableSetToUpdate, variableDefinition)).collect(Collectors.toList()); variableSetToUpdate.addVariableDefinitions(variableDefinitionEntities); // save modified existing variables set entity - ModelVariableSetEntity savedVariablesSetEntity = modelVariablesSetRepository.save(variableSetToUpdate); - return new VariablesSet(savedVariablesSetEntity); - - } else { - return new VariablesSet(variableSetToUpdate); + modelVariablesSetRepository.save(variableSetToUpdate); } + + return new VariablesSet(variableSetToUpdate); } @Override @Transactional public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String variableSetName, List variableDefinitionNames) { - Optional foundModelOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); - ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); - if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitionNames)) { // find existing variable definitions List foundVariableDefinitionEntities = modelVariableRepository.findAllById(variableDefinitionNames); @@ -387,28 +429,26 @@ public VariablesSet removeExistingVariableDefinitionFromVariablesSet(String vari // save modified existing variables set entity // variable definitions are systematically deleted via orphanRemoval = true - ModelVariableSetEntity savedVariablesSetEntity = modelVariablesSetRepository.save(variableSetToUpdate); - - return new VariablesSet(savedVariablesSetEntity); - } else { - return new VariablesSet(variableSetToUpdate); + modelVariablesSetRepository.save(variableSetToUpdate); } + + return new VariablesSet(variableSetToUpdate); } @Override @Transactional public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSetName) { - Optional foundModelOpt = modelVariablesSetRepository.findById(variableSetName); + Optional foundVariableSetOpt = modelVariablesSetRepository.findById(variableSetName); - ModelVariableSetEntity variableSetToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, VARIABLES_SET_NOT_FOUND + variableSetName)); + ModelVariableSetEntity variableSetToUpdate = getVariableSetFromOptional(variableSetName, foundVariableSetOpt); // clear the existing list variableSetToUpdate.removeVariableDefinitions(variableSetToUpdate.getVariableDefinitions()); // save modified existing variables set entity // variable definitions are systematically deleted via orphanRemoval = true - ModelVariableSetEntity savedVariablesSetEntity = modelVariablesSetRepository.save(variableSetToUpdate); - return new VariablesSet(savedVariablesSetEntity); + modelVariablesSetRepository.save(variableSetToUpdate); + return new VariablesSet(variableSetToUpdate); } @Override @@ -416,19 +456,18 @@ public VariablesSet removeAllVariableDefinitionOnVariablesSet(String variableSet public Model addNewVariablesSetsToModel(String modelName, List variableSets) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set - if (variableSets != null && !variableSets.isEmpty()) { + if (!CollectionUtils.isEmpty(variableSets)) { // do merge with existing list List variablesSetEntities = variableSets.stream().map(variablesSet -> new ModelVariableSetEntity(modelToUpdate, variablesSet)).collect(Collectors.toList()); modelToUpdate.addVariablesSets(variablesSetEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); } @Override @@ -436,10 +475,10 @@ public Model addNewVariablesSetsToModel(String modelName, List var public Model addExistingVariablesSetsToModel(String modelName, List variablesSetNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set - if (variablesSetNames != null && !variablesSetNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variablesSetNames)) { // do merge with existing list List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); @@ -452,11 +491,10 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari modelToUpdate.addVariablesSets(foundVariablesSetEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); } @Override @@ -464,41 +502,42 @@ public Model addExistingVariablesSetsToModel(String modelName, List vari public Model removeExistingVariablesSetsFromModel(String modelName, List variablesSetNames) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); // do merge with the list of variables set - if (variablesSetNames != null && !variablesSetNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variablesSetNames)) { // remove from existing list List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); modelToUpdate.removeVariablesSets(foundVariablesSetEntities); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); - } else { - return new Model(modelToUpdate); + modelRepository.save(modelToUpdate); } + + return new Model(modelToUpdate); } @Override public Model removeAllExistingVariablesSetsFromModel(String modelName) { Optional foundModelOpt = modelRepository.findById(modelName); - ModelEntity modelToUpdate = foundModelOpt.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, MODEL_NOT_FOUND + modelName)); + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); modelToUpdate.removeVariablesSets(modelToUpdate.getVariableSets()); // save modified existing model entity - ModelEntity savedModelEntity = modelRepository.save(modelToUpdate); - return new Model(savedModelEntity); + modelRepository.save(modelToUpdate); + + return new Model(modelToUpdate); } @Override @Transactional public List deleteVariableDefinitions(List variableDefinitionNames) { - if (variableDefinitionNames != null && !variableDefinitionNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variableDefinitionNames)) { modelVariableRepository.deleteAllById(variableDefinitionNames); } + return variableDefinitionNames; } @@ -506,7 +545,7 @@ public List deleteVariableDefinitions(List variableDefinitionNam @Transactional public List deleteVariablesSets(List variablesSetNames) { - if (variablesSetNames != null && !variablesSetNames.isEmpty()) { + if (!CollectionUtils.isEmpty(variablesSetNames)) { // cleanup associations List foundVariablesSetEntities = modelVariablesSetRepository.findAllById(variablesSetNames); @@ -521,7 +560,7 @@ public List deleteVariablesSets(List variablesSetNames) { return foundVariablesSetNames; } - return List.of(); + return variablesSetNames; } // --- END variable-related service methods --- // diff --git a/src/main/resources/IEEE14Models.sql b/src/main/resources/IEEE14Models.sql index 55f798b1..627ccc6e 100644 --- a/src/main/resources/IEEE14Models.sql +++ b/src/main/resources/IEEE14Models.sql @@ -1,15 +1,15 @@ -- Temporary models values while no user interface for them is provided. -INSERT INTO models (model_name, equipment_type) -VALUES ('GeneratorSynchronousThreeWindings', 0), - ('GeneratorSynchronousFourWindings', 0), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 0), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 0), - ('GeneratorPQ', 0), - ('GeneratorPV', 0), - ('LoadAlphaBeta', 1), - ('LoadPQ', 1), - ('CurrentLimitAutomaton', 2); +INSERT INTO models (model_name, equipment_type, created_date) +VALUES ('GeneratorSynchronousThreeWindings', 0, now()::timestamp), + ('GeneratorSynchronousFourWindings', 0, now()::timestamp), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 0, now()::timestamp), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 0, now()::timestamp), + ('GeneratorPQ', 0, now()::timestamp), + ('GeneratorPV', 0, now()::timestamp), + ('LoadAlphaBeta', 1, now()::timestamp), + ('LoadPQ', 1, now()::timestamp), + ('CurrentLimitAutomaton', 2, now()::timestamp); INSERT INTO model_sets_group (model_name, name, type) VALUES ('GeneratorSynchronousThreeWindings', 'GSTW', 0), @@ -37,223 +37,295 @@ VALUES ('GSTW', 0, 'GeneratorSynchronousThreeWindings', 'GSTW'), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'CLA_2_4'), ('CLA_2_5', 0, 'CurrentLimitAutomaton', 'CLA_2_5'); -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousThreeWindings', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousThreeWindings', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindings', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindings', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindings', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousThreeWindings', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousFourWindings', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousFourWindings', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_XpqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Tpq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindings', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindings', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindings', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousFourWindings', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_KGover', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_Gain', 2, NULL, 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type, fixed_value) -VALUES ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomTurb', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomAlt', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_ExcitationPu', 1, NULL, 0, 1), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_MdPuEfd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_H', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_DPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SnTfo', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseHV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseLV', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XTfPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RaPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XlPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppdPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppd0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_md', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_mq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nd', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nq', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpqPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpq0', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_KGover', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PNom', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_Gain', 2, NULL, 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'URef_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'Pm_ValueIn', 1, NULL, 2, 0), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_P0Pu', 0, 'p_pu', 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Q0Pu', 0, 'q_pu', 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UPhase0', 0, 'angle_pu', 2, NULL), - ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_U0Pu', 0, 'v_pu', 2, NULL); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('GeneratorPQ', 'generator_AlphaPuPNom', 2, NULL, 2), - ('GeneratorPQ', 'generator_PNom', 0, 'pMax', 2), - ('GeneratorPQ', 'generator_PMin', 0, 'pMin', 2), - ('GeneratorPQ', 'generator_PMax', 0, 'pMax', 2), - ('GeneratorPQ', 'generator_P0Pu', 0, 'p_pu', 2), - ('GeneratorPQ', 'generator_Q0Pu', 0, 'q_pu', 2), - ('GeneratorPQ', 'generator_U0Pu', 0, 'v_pu', 2), - ('GeneratorPQ', 'generator_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('GeneratorPV', 'generator_AlphaPuPNom', 2, NULL, 2), - ('GeneratorPV', 'generator_LambdaPuSNom', 2, NULL, 2), - ('GeneratorPV', 'generator_QMax', 2, NULL, 2), - ('GeneratorPV', 'generator_QMin', 2, NULL, 2), - ('GeneratorPV', 'generator_PNom', 0, 'pMax', 2), - ('GeneratorPV', 'generator_SNom', 0, 'pMax', 2), - ('GeneratorPV', 'generator_PMin', 0, 'pMin', 2), - ('GeneratorPV', 'generator_PMax', 0, 'pMax', 2), - ('GeneratorPV', 'generator_P0Pu', 0, 'p_pu', 2), - ('GeneratorPV', 'generator_Q0Pu', 0, 'q_pu', 2), - ('GeneratorPV', 'generator_U0Pu', 0, 'v_pu', 2), - ('GeneratorPV', 'generator_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('LoadAlphaBeta', 'load_alpha', 2, NULL, 2), - ('LoadAlphaBeta', 'load_beta', 2, NULL, 2), - ('LoadAlphaBeta', 'load_P0Pu', 0, 'p_pu', 2), - ('LoadAlphaBeta', 'load_Q0Pu', 0, 'q_pu', 2), - ('LoadAlphaBeta', 'load_U0Pu', 0, 'v_pu', 2), - ('LoadAlphaBeta', 'load_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('LoadPQ', 'load_P0Pu', 0, 'p_pu', 2), - ('LoadPQ', 'load_Q0Pu', 0, 'q_pu', 2), - ('LoadPQ', 'load_U0Pu', 0, 'v_pu', 2), - ('LoadPQ', 'load_UPhase0', 0, 'angle_pu', 2); - -INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) -VALUES ('CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', 2, NULL, 0), - ('CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 2, NULL, 1), - ('CurrentLimitAutomaton', 'currentLimitAutomaton_IMax', 2, NULL, 2), - ('CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing', 2, NULL, 2); +INSERT INTO model_parameter_definitions (name, origin, origin_name, type, fixed_value, created_date) +VALUES ('generator_UNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_SNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_PNomTurb', 2, NULL, 2, NULL, now()::timestamp), + ('generator_PNomAlt', 2, NULL, 2, NULL, now()::timestamp), + ('generator_ExcitationPu', 1, NULL, 0, 1, now()::timestamp), + ('generator_MdPuEfd', 2, NULL, 2, NULL, now()::timestamp), + ('generator_H', 2, NULL, 2, NULL, now()::timestamp), + ('generator_DPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_SnTfo', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UNomHV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UNomLV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UBaseHV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_UBaseLV', 2, NULL, 2, NULL, now()::timestamp), + ('generator_RTfPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XTfPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_RaPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XlPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XdPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XpdPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XppdPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tpd0', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tppd0', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XqPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_XppqPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tppq0', 2, NULL, 2, NULL, now()::timestamp), + ('generator_md', 2, NULL, 2, NULL, now()::timestamp), + ('generator_mq', 2, NULL, 2, NULL, now()::timestamp), + ('generator_nd', 2, NULL, 2, NULL, now()::timestamp), + ('generator_nq', 2, NULL, 2, NULL, now()::timestamp), + ('URef_ValueIn', 1, NULL, 2, 0, now()::timestamp), + ('Pm_ValueIn', 1, NULL, 2, 0, now()::timestamp), + ('generator_P0Pu', 0, 'p_pu', 2, NULL, now()::timestamp), + ('generator_Q0Pu', 0, 'q_pu', 2, NULL, now()::timestamp), + ('generator_UPhase0', 0, 'angle_pu', 2, NULL, now()::timestamp), + ('generator_U0Pu', 0, 'v_pu', 2, NULL, now()::timestamp), + ('generator_XpqPu', 2, NULL, 2, NULL, now()::timestamp), + ('generator_Tpq0', 2, NULL, 2, NULL, now()::timestamp), + ('governor_KGover', 2, NULL, 2, NULL, now()::timestamp), + ('governor_PMin', 2, NULL, 2, NULL, now()::timestamp), + ('governor_PMax', 2, NULL, 2, NULL, now()::timestamp), + ('governor_PNom', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_LagEfdMin', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_LagEfdMax', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_EfdMinPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_EfdMaxPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_UsRefMinPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_UsRefMaxPu', 2, NULL, 2, NULL, now()::timestamp), + ('voltageRegulator_Gain', 2, NULL, 2, NULL, now()::timestamp), + ('generator_AlphaPuPNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_PNom', 0, 'pMax', 2, NULL, now()::timestamp), + ('generator_PMin', 0, 'pMin', 2, NULL, now()::timestamp), + ('generator_PMax', 0, 'pMax', 2, NULL, now()::timestamp), + ('generator_LambdaPuSNom', 2, NULL, 2, NULL, now()::timestamp), + ('generator_QMax', 2, NULL, 2, NULL, now()::timestamp), + ('generator_QMin', 2, NULL, 2, NULL, now()::timestamp); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousThreeWindings', 'generator_UNom'), + ('GeneratorSynchronousThreeWindings', 'generator_SNom'), + ('GeneratorSynchronousThreeWindings', 'generator_PNomTurb'), + ('GeneratorSynchronousThreeWindings', 'generator_PNomAlt'), + ('GeneratorSynchronousThreeWindings', 'generator_ExcitationPu'), + ('GeneratorSynchronousThreeWindings', 'generator_MdPuEfd'), + ('GeneratorSynchronousThreeWindings', 'generator_H'), + ('GeneratorSynchronousThreeWindings', 'generator_DPu'), + ('GeneratorSynchronousThreeWindings', 'generator_SnTfo'), + ('GeneratorSynchronousThreeWindings', 'generator_UNomHV'), + ('GeneratorSynchronousThreeWindings', 'generator_UNomLV'), + ('GeneratorSynchronousThreeWindings', 'generator_UBaseHV'), + ('GeneratorSynchronousThreeWindings', 'generator_UBaseLV'), + ('GeneratorSynchronousThreeWindings', 'generator_RTfPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XTfPu'), + ('GeneratorSynchronousThreeWindings', 'generator_RaPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XlPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XdPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XpdPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XppdPu'), + ('GeneratorSynchronousThreeWindings', 'generator_Tpd0'), + ('GeneratorSynchronousThreeWindings', 'generator_Tppd0'), + ('GeneratorSynchronousThreeWindings', 'generator_XqPu'), + ('GeneratorSynchronousThreeWindings', 'generator_XppqPu'), + ('GeneratorSynchronousThreeWindings', 'generator_Tppq0'), + ('GeneratorSynchronousThreeWindings', 'generator_md'), + ('GeneratorSynchronousThreeWindings', 'generator_mq'), + ('GeneratorSynchronousThreeWindings', 'generator_nd'), + ('GeneratorSynchronousThreeWindings', 'generator_nq'), + ('GeneratorSynchronousThreeWindings', 'URef_ValueIn'), + ('GeneratorSynchronousThreeWindings', 'Pm_ValueIn'), + ('GeneratorSynchronousThreeWindings', 'generator_P0Pu'), + ('GeneratorSynchronousThreeWindings', 'generator_Q0Pu'), + ('GeneratorSynchronousThreeWindings', 'generator_UPhase0'), + ('GeneratorSynchronousThreeWindings', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousFourWindings', 'generator_UNom'), + ('GeneratorSynchronousFourWindings', 'generator_SNom'), + ('GeneratorSynchronousFourWindings', 'generator_PNomTurb'), + ('GeneratorSynchronousFourWindings', 'generator_PNomAlt'), + ('GeneratorSynchronousFourWindings', 'generator_ExcitationPu'), + ('GeneratorSynchronousFourWindings', 'generator_MdPuEfd'), + ('GeneratorSynchronousFourWindings', 'generator_H'), + ('GeneratorSynchronousFourWindings', 'generator_DPu'), + ('GeneratorSynchronousFourWindings', 'generator_SnTfo'), + ('GeneratorSynchronousFourWindings', 'generator_UNomHV'), + ('GeneratorSynchronousFourWindings', 'generator_UNomLV'), + ('GeneratorSynchronousFourWindings', 'generator_UBaseHV'), + ('GeneratorSynchronousFourWindings', 'generator_UBaseLV'), + ('GeneratorSynchronousFourWindings', 'generator_RTfPu'), + ('GeneratorSynchronousFourWindings', 'generator_XTfPu'), + ('GeneratorSynchronousFourWindings', 'generator_RaPu'), + ('GeneratorSynchronousFourWindings', 'generator_XlPu'), + ('GeneratorSynchronousFourWindings', 'generator_XdPu'), + ('GeneratorSynchronousFourWindings', 'generator_XpdPu'), + ('GeneratorSynchronousFourWindings', 'generator_XppdPu'), + ('GeneratorSynchronousFourWindings', 'generator_Tpd0'), + ('GeneratorSynchronousFourWindings', 'generator_Tppd0'), + ('GeneratorSynchronousFourWindings', 'generator_XqPu'), + ('GeneratorSynchronousFourWindings', 'generator_XppqPu'), + ('GeneratorSynchronousFourWindings', 'generator_Tppq0'), + ('GeneratorSynchronousFourWindings', 'generator_md'), + ('GeneratorSynchronousFourWindings', 'generator_mq'), + ('GeneratorSynchronousFourWindings', 'generator_nd'), + ('GeneratorSynchronousFourWindings', 'generator_nq'), + ('GeneratorSynchronousFourWindings', 'generator_XpqPu'), + ('GeneratorSynchronousFourWindings', 'generator_Tpq0'), + ('GeneratorSynchronousFourWindings', 'URef_ValueIn'), + ('GeneratorSynchronousFourWindings', 'Pm_ValueIn'), + ('GeneratorSynchronousFourWindings', 'generator_P0Pu'), + ('GeneratorSynchronousFourWindings', 'generator_Q0Pu'), + ('GeneratorSynchronousFourWindings', 'generator_UPhase0'), + ('GeneratorSynchronousFourWindings', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNom'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SNom'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomTurb'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_PNomAlt'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_ExcitationPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_MdPuEfd'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_H'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_DPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_SnTfo'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomHV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UNomLV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseHV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UBaseLV'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RTfPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XTfPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_RaPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XlPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XdPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XpdPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppdPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tpd0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppd0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XqPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_XppqPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Tppq0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_md'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_mq'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nd'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_nq'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_KGover'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMin'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PMax'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'governor_PNom'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'voltageRegulator_Gain'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'URef_ValueIn'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'Pm_ValueIn'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_P0Pu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Q0Pu'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UPhase0'), + ('GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNom'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SNom'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomTurb'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_PNomAlt'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_ExcitationPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_MdPuEfd'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_H'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_DPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_SnTfo'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomHV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UNomLV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseHV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UBaseLV'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RTfPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XTfPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_RaPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XlPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XdPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpdPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppdPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpd0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppd0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XqPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XppqPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tppq0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_md'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_mq'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nd'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_nq'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_XpqPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Tpq0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_KGover'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMin'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PMax'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'governor_PNom'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMin'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_LagEfdMax'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMinPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_EfdMaxPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMinPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_UsRefMaxPu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'voltageRegulator_Gain'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'URef_ValueIn'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'Pm_ValueIn'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_P0Pu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_Q0Pu'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_UPhase0'), + ('GeneratorSynchronousFourWindingsProportionalRegulations', 'generator_U0Pu'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorPQ', 'generator_AlphaPuPNom'), + ('GeneratorPQ', 'generator_PNom'), + ('GeneratorPQ', 'generator_PMin'), + ('GeneratorPQ', 'generator_PMax'), + ('GeneratorPQ', 'generator_P0Pu'), + ('GeneratorPQ', 'generator_Q0Pu'), + ('GeneratorPQ', 'generator_U0Pu'), + ('GeneratorPQ', 'generator_UPhase0'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('GeneratorPV', 'generator_AlphaPuPNom'), + ('GeneratorPV', 'generator_LambdaPuSNom'), + ('GeneratorPV', 'generator_QMax'), + ('GeneratorPV', 'generator_QMin'), + ('GeneratorPV', 'generator_PNom'), + ('GeneratorPV', 'generator_SNom'), + ('GeneratorPV', 'generator_PMin'), + ('GeneratorPV', 'generator_PMax'), + ('GeneratorPV', 'generator_P0Pu'), + ('GeneratorPV', 'generator_Q0Pu'), + ('GeneratorPV', 'generator_U0Pu'), + ('GeneratorPV', 'generator_UPhase0'); + +INSERT INTO model_parameter_definitions (name, origin, origin_name, type, created_date) +VALUES ('load_alpha', 2, NULL, 2, now()::timestamp), + ('load_beta', 2, NULL, 2, now()::timestamp), + ('load_P0Pu', 0, 'p_pu', 2, now()::timestamp), + ('load_Q0Pu', 0, 'q_pu', 2, now()::timestamp), + ('load_U0Pu', 0, 'v_pu', 2, now()::timestamp), + ('load_UPhase0', 0, 'angle_pu', 2, now()::timestamp); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('LoadAlphaBeta', 'load_alpha'), + ('LoadAlphaBeta', 'load_beta'), + ('LoadAlphaBeta', 'load_P0Pu'), + ('LoadAlphaBeta', 'load_Q0Pu'), + ('LoadAlphaBeta', 'load_U0Pu'), + ('LoadAlphaBeta', 'load_UPhase0'); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('LoadPQ', 'load_P0Pu'), + ('LoadPQ', 'load_Q0Pu'), + ('LoadPQ', 'load_U0Pu'), + ('LoadPQ', 'load_UPhase0'); + +INSERT INTO model_parameter_definitions (name, origin, origin_name, type, created_date) +VALUES + ('currentLimitAutomaton_OrderToEmit', 2, NULL, 0, now()::timestamp), + ('currentLimitAutomaton_Running', 2, NULL, 1, now()::timestamp), + ('currentLimitAutomaton_IMax', 2, NULL, 2, now()::timestamp), + ('currentLimitAutomaton_tLagBeforeActing', 2, NULL, 2, now()::timestamp); + +INSERT INTO models_model_parameter_definitions (model_name, parameter_definition_name) +VALUES ('CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit'), + ('CurrentLimitAutomaton', 'currentLimitAutomaton_Running'), + ('CurrentLimitAutomaton', 'currentLimitAutomaton_IMax'), + ('CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing'); INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) VALUES ('GSTW', 0, 'GeneratorSynchronousThreeWindings', 'generator_ExcitationPu', 'GSTW', 1.), @@ -486,13 +558,13 @@ VALUES ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 'CLA', true), ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_IMax', 'CLA', 1000.), ('CLA', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing', 'CLA', 10.); - + INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) VALUES ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', 'CLA_2_4', 3), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 'CLA_2_4', true), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_IMax', 'CLA_2_4', 1000.), ('CLA_2_4', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_tLagBeforeActing', 'CLA_2_4', 10.); - + INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) VALUES ('CLA_2_5', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_OrderToEmit', 'CLA_2_5', 1), ('CLA_2_5', 0, 'CurrentLimitAutomaton', 'currentLimitAutomaton_Running', 'CLA_2_5', true), @@ -779,12 +851,12 @@ VALUES ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UPhase0', 'IEEE14_GEN____8_SM'); -- variables for LoadAlphaBeta model -INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date, updated_date) -VALUES ('load_PPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_PRefPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_QPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_QRefPu', 2, 'MW', 100, now()::timestamp, now()::timestamp), - ('load_running_value', 1, NULL, NULL, now()::timestamp, now()::timestamp); +INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date) +VALUES ('load_PPu', 2, 'MW', 100, now()::timestamp), + ('load_PRefPu', 2, 'MW', 100, now()::timestamp), + ('load_QPu', 2, 'MW', 100, now()::timestamp), + ('load_QRefPu', 2, 'MW', 100, now()::timestamp), + ('load_running_value', 1, NULL, NULL, now()::timestamp); INSERT INTO models_model_variable_definitions (model_name, variable_definition_name) VALUES ('LoadAlphaBeta', 'load_PPu'), @@ -793,16 +865,16 @@ VALUES ('LoadAlphaBeta', 'load_PPu'), ('LoadAlphaBeta', 'load_QRefPu'), ('LoadAlphaBeta', 'load_running_value'); -INSERT INTO model_variable_sets (variable_set_name, created_date, updated_date) -VALUES ('Generator', now()::timestamp, now()::timestamp), - ('VoltageRegulator', now()::timestamp, now()::timestamp); +INSERT INTO model_variable_sets (variable_set_name, created_date) +VALUES ('Generator', now()::timestamp), + ('VoltageRegulator', now()::timestamp); -- variables grouped in sets used in generator models -INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date, updated_date) -VALUES ('generator_omegaPu', 2, 'pu', NULL, now()::timestamp, now()::timestamp), - ('generator_PGen', 2, 'MW', NULL, now()::timestamp, now()::timestamp), - ('generator_QGen', 2, 'MW', NULL, now()::timestamp, now()::timestamp), - ('generator_UStatorPu', 2, 'pu', NULL, now()::timestamp, now()::timestamp); +INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date) +VALUES ('generator_omegaPu', 2, 'pu', NULL, now()::timestamp), + ('generator_PGen', 2, 'MW', NULL, now()::timestamp), + ('generator_QGen', 2, 'MW', NULL, now()::timestamp), + ('generator_UStatorPu', 2, 'pu', NULL, now()::timestamp); INSERT INTO model_variable_sets_model_variable_definitions (variable_definition_name, variable_set_name) VALUES ('generator_omegaPu', 'Generator'), @@ -810,8 +882,8 @@ VALUES ('generator_omegaPu', 'Generator'), ('generator_QGen', 'Generator'), ('generator_UStatorPu', 'Generator'); -INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date, updated_date) -VALUES ('voltageRegulator_EfdPu', 2, 'pu', NULL, now()::timestamp, now()::timestamp); +INSERT INTO model_variable_definitions (variable_definition_name, type, unit, factor, created_date) +VALUES ('voltageRegulator_EfdPu', 2, 'pu', NULL, now()::timestamp); INSERT INTO model_variable_sets_model_variable_definitions (variable_definition_name, variable_set_name) VALUES ('voltageRegulator_EfdPu', 'VoltageRegulator'); diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index a0e54796..747c0e91 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; import org.gridsuite.mapping.server.dto.models.Model; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ModelVariableDefinition; @@ -76,10 +77,11 @@ public class ModelControllerTest { ObjectMapper objectMapper; public void cleanDB() { - modelVariableRepository.deleteAll(); + // delete from parent to child + modelRepository.deleteAll(); modelVariablesSetRepository.deleteAll(); + modelVariableRepository.deleteAll(); modelParameterDefinitionRepository.deleteAll(); - modelRepository.deleteAll(); } private ModelParameterDefinitionEntity createDefinitionEntity(String name, ParameterType type, ParameterOrigin origin, String originName, ModelEntity model) { @@ -252,9 +254,8 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { String newModelJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta.json"); String newParameterDefinitionsJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta_parameter_definitions.json"); - cleanDB(); - // Put data first time with initial parameter definitions + // --- Put data first time with initial parameter definitions --- // MvcResult mvcResult = mvc.perform(post("/models/") .content(newModelJson) .contentType(APPLICATION_JSON)) @@ -264,14 +265,24 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { List parameterDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); assertEquals(6, parameterDefinitions.size()); - // Put data second time which add only a parameter definition - MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/parameters/definitions") + // --- 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()); + + // --- Try to get parameter definitions from unknown model --- // + mvc.perform(get("/models/" + modelName + "_unknown" + "/parameters/definitions")) + .andExpect(status().isNotFound()); + + // --- Put data second time which add only a parameter definition --- // + mvcResult = mvc.perform(post("/models/" + modelName + "/parameters/definitions") .content(newParameterDefinitionsJson) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current parameter definitions - List parameterDefinitions2 = objectMapper.readValue(mvcResult2.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Initial parameter definitions = " + parameterDefinitions); LOGGER.info("Updated parameter definitions = " + parameterDefinitions2); @@ -280,14 +291,14 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { assertEquals(1, parameterDefinitions2.size() - parameterDefinitions.size()); assertTrue(parameterDefinitions2.containsAll(parameterDefinitions)); - // Remove an existing variable definition - MvcResult mvcResult3 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove") + // --- Remove an existing variable definition --- // + mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove") .content(objectMapper.writeValueAsString(List.of(parameterDefinitions2.get(5).getName()))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current parameter definitions - List parameterDefinitions3 = objectMapper.readValue(mvcResult3.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions3 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Updated parameter definitions = " + parameterDefinitions2); LOGGER.info("Removed parameter definitions = " + parameterDefinitions3); @@ -296,44 +307,50 @@ public void testSaveLoadModelThenModifyParameterDefinitions() throws Exception { assertEquals(1, parameterDefinitions2.size() - parameterDefinitions3.size()); assertTrue(parameterDefinitions2.containsAll(parameterDefinitions3)); - // remove all parameter definitions - MvcResult mvcResult4 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove-all") + // --- Remove all parameter definitions --- // + mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List parameterDefinitions4 = objectMapper.readValue(mvcResult4.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions4 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Unset parameter definitions = " + parameterDefinitions4); // check result // must have no parameter definition assertEquals(0, parameterDefinitions4.size()); - // save new parameter definition + // --- Save new parameter definition --- // List parameterDefinitionList = objectMapper.readValue(newParameterDefinitionsJson, new TypeReference>() { }); parameterDefinitionList.get(0).setName("load_UPhase0_3"); - MvcResult mvcResult5 = mvc.perform(post("/models/parameters/definitions") + mvcResult = mvc.perform(post("/models/parameters/definitions") .content(objectMapper.writeValueAsString(parameterDefinitionList)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List savedParameterDefinitionList = objectMapper.readValue(mvcResult5.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()); - // add existing parameter definition to model - MvcResult mvcResult6 = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") + // --- Add existing parameter definition to model --- // + mvcResult = mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") .content(objectMapper.writeValueAsString(savedParameterDefinitionList.stream().map(ModelParameterDefinition::getName))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current parameter definitions in the model - List parameterDefinitions6 = objectMapper.readValue(mvcResult6.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); + List parameterDefinitions6 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getParameterDefinitions(); LOGGER.info("Updated parameter definitions = " + parameterDefinitions6); // must have the same number of above input parameter definitions assertEquals(savedParameterDefinitionList.size(), parameterDefinitions6.size()); - // --- delete definitively a parameter definition --- // + // --- Add unknown existing parameter definition to model => must fail fast --- // + mvc.perform(patch("/models/" + modelName + "/parameters/definitions/add") + .content(objectMapper.writeValueAsString(List.of("parameter_definition_unknown"))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isNotFound()); + + // --- Delete definitively a parameter definition --- // mvcResult = mvc.perform(delete("/models/parameters/definitions") .content(objectMapper.writeValueAsString(List.of(parameterDefinitions.get(4).getName()))) .contentType(APPLICATION_JSON)) @@ -355,7 +372,7 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { cleanDB(); - // Put data first time with initial variable definitions + // --- Put data first time with initial variable definitions --- // MvcResult mvcResult = mvc.perform(post("/models/") .content(newModelJson) .contentType(APPLICATION_JSON)) @@ -365,14 +382,24 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { List variableDefinitions = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); assertEquals(5, variableDefinitions.size()); - // Put data second time which add only a variable definition - MvcResult mvcResult2 = mvc.perform(post("/models/" + modelName + "/variables") + // --- 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()); + + // --- Try to get variable definitions from unknown model --- // + mvc.perform(get("/models/" + modelName + "_unknown" + "/variables")) + .andExpect(status().isNotFound()); + + // --- Put data second time which add only a variable definition --- // + mvcResult = mvc.perform(post("/models/" + modelName + "/variables") .content(newVariableDefinitionsJson) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current variable definitions - List variableDefinitions2 = objectMapper.readValue(mvcResult2.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + List variableDefinitions2 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); LOGGER.info("Initial variable definitions = " + variableDefinitions); LOGGER.info("Updated variable definitions = " + variableDefinitions2); @@ -381,60 +408,66 @@ public void testSaveLoadModelThenModifyVariableDefinitions() throws Exception { assertEquals(1, variableDefinitions2.size() - variableDefinitions.size()); assertTrue(variableDefinitions2.containsAll(variableDefinitions)); - // Remove an existing variable definition - MvcResult mvcResult3 = mvc.perform(patch("/models/" + modelName + "/variables/remove") + // --- Remove an existing variable definition --- // + mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/remove") .content(objectMapper.writeValueAsString(List.of(variableDefinitions2.get(5).getName()))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current variable definitions - List variableDefinitions3 = objectMapper.readValue(mvcResult3.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + List variableDefinitions3 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); LOGGER.info("Updated variable definitions = " + variableDefinitions2); LOGGER.info("Removed variable definitions = " + variableDefinitions3); // check result - // final model's variable definition must contains all ones of model + // final model's variable definition must contain all ones of model assertEquals(1, variableDefinitions2.size() - variableDefinitions3.size()); assertTrue(variableDefinitions2.containsAll(variableDefinitions3)); - // remove all variable definitions - MvcResult mvcResult4 = mvc.perform(patch("/models/" + modelName + "/variables/remove-all") + // --- Remove all variable definitions --- // + mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List variableDefinitions4 = objectMapper.readValue(mvcResult4.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + List variableDefinitions4 = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); LOGGER.info("Unset variable definitions = " + variableDefinitions4); // check result // must have no variable definition assertEquals(0, variableDefinitions4.size()); - // save new variable definition + // --- Save new variable definition --- // List variableDefinitionList = objectMapper.readValue(newVariableDefinitionsJson, new TypeReference>() { }); variableDefinitionList.get(0).setName("load_running_value_3"); - MvcResult mvcResult5 = mvc.perform(post("/models/variables") + mvcResult = mvc.perform(post("/models/variables") .content(objectMapper.writeValueAsString(variableDefinitionList)) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); - List savedVariableDefinitionList = objectMapper.readValue(mvcResult5.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()); - // add existing variable definition to model - MvcResult mvcResult6 = mvc.perform(patch("/models/" + modelName + "/variables/add") + // --- Add existing variable definition to model --- // + mvcResult = mvc.perform(patch("/models/" + modelName + "/variables/add") .content(objectMapper.writeValueAsString(savedVariableDefinitionList.stream().map(ModelVariableDefinition::getName))) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get current variable definitions in the model - List variableDefinitions6 = objectMapper.readValue(mvcResult6.getResponse().getContentAsString(), Model.class).getVariableDefinitions(); + 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()); - // --- delete definitively a variable definition --- // + // --- add unknown existing variable definition to model => must fail fast --- // + mvc.perform(patch("/models/" + modelName + "/variables/add") + .content(objectMapper.writeValueAsString(List.of("variable_definition_unknown"))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isNotFound()); + + // --- Delete definitively a variable definition --- // mvcResult = mvc.perform(delete("/models/variables") .content(objectMapper.writeValueAsString(List.of(variableDefinitions.get(4).getName()))) .contentType(APPLICATION_JSON)) @@ -518,7 +551,6 @@ public void testSaveNewVariablesSetThenModifyVariableDefinitions() throws Except } @Test - @Transactional public void testSaveNewVariablesSetsWhichShareVariableDefinitions() throws Exception { String newVariablesSetJson = readFileAsString("src/test/resources/data/model/generator/variablesSet_ThreeWindingsSynchronousGenerator.json"); String newVariablesSet2Json = readFileAsString("src/test/resources/data/model/generator/variablesSet_FourWindingsSynchronousGenerator.json"); @@ -532,27 +564,96 @@ public void testSaveNewVariablesSetsWhichShareVariableDefinitions() throws Excep .andExpect(status().isOk()).andReturn(); // Get initial variable definitions - VariablesSet variablesSet = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); - List variableDefinitions = variablesSet.getVariableDefinitions(); - - // Check result - assertEquals(2, variableDefinitions.size()); + VariablesSet threeWindingVariablesSet = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); // --- Put the second variables set with 3 variable definitions in which 2 ones are identical to first variables set --- // - MvcResult mvcResult2 = mvc.perform(post("/models/variables-sets") + mvcResult = mvc.perform(post("/models/variables-sets") .content(newVariablesSet2Json) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); // Get initial variable definitions - VariablesSet variablesSet2 = objectMapper.readValue(mvcResult2.getResponse().getContentAsString(), VariablesSet.class); - List variableDefinitions2 = variablesSet2.getVariableDefinitions(); + VariablesSet fourWindingVariablesSet = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), VariablesSet.class); - // Check result - assertEquals(3, variableDefinitions2.size()); + // --- 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()); + + // --- Try to get variable definition from unknown variables set --- // + mvc.perform(get("/models/variables-sets/" + "variable_set_unknown" + "/variables")) + .andExpect(status().isNotFound()); + + // --- Get initial variable definition from GET endpoint --- // + 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()); // cross-check between two variables set - variableDefinitions2.containsAll(variableDefinitions); + Sets.SetView intersectionVariableDefinitions = Sets.intersection(new HashSet<>(fourWindingVariableDefinitions), new HashSet<>(threeWindingVariableDefinitions)); + assertEquals(2, intersectionVariableDefinitions.size()); + } + + @Test + public void testSaveNewLoadModelsWhichShareParameterDefinitionsAndVariableDefinitions() throws Exception { + String newLoadAlphaBetaModelJson = readFileAsString("src/test/resources/data/model/load/loadAlphaBeta.json"); + String newLoadPQModelJson = readFileAsString("src/test/resources/data/model/load/loadPQ.json"); + + cleanDB(); + + // *** LOAD ALPHA BETA *** // + // --- Put data first time with initial parameter/variable definitions --- // + MvcResult mvcResult = mvc.perform(post("/models/") + .content(newLoadAlphaBetaModelJson) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + String loadAlphaBetaModelName = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getModelName(); + + // *** LOAD PQ *** // + // --- Put data first time with initial parameter/variable definitions --- // + mvcResult = mvc.perform(post("/models/") + .content(newLoadPQModelJson) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + String loadPQModelName = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Model.class).getModelName(); + + // --- 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()); + + // --- 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()); + + // --- 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()); + + // --- 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()); + + // cross-check variable definitions between two models + Sets.SetView intersectionVariableDefinitions = Sets.intersection(new HashSet<>(loadAlphaBetaVariableDefinitions), new HashSet<>(loadPQVariableDefinitions)); + assertEquals(3, intersectionVariableDefinitions.size()); + + // cross-check parameter definitions between two models + Sets.SetView intersectionParameterDefinitions = Sets.intersection(new HashSet<>(loadAlphaBetaParameterDefinitions), new HashSet<>(loadPQParameterDefinitions)); + assertEquals(4, intersectionParameterDefinitions.size()); + } @Test @@ -603,6 +704,16 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { assertEquals(4, variableDefinitionsOfGeneratorSet.size()); assertEquals(1, variableDefinitionsOfVoltageRegulatorSet.size()); + // --- 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()); + + // --- Try to get variable sets from unknown model --- // + mvc.perform(get("/models/" + model.getModelName() + "_unknown" + "/variables")) + .andExpect(status().isNotFound()); + // --- Put second time which add only a variables sets --- // mvcResult = mvc.perform(post("/models/" + model.getModelName() + "/variables-sets") .content("[\n" + newVariablesSetJson + "\n]") @@ -623,7 +734,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { assertEquals(1, variableDefinitionsOfVoltageRegulatorSet.size()); assertEquals(2, variableDefinitionsOfRegulator2Set.size()); - // --- remove an existing variables set --- // + // --- Remove an existing variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/remove") .content(objectMapper.writeValueAsString(List.of(variablesSet2.get(2).getName()))) .contentType(APPLICATION_JSON)) @@ -638,7 +749,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { // must contains all variables sets after removing assertTrue(variablesSet2.containsAll(variablesSet3)); - // --- remove all variables set --- // + // --- Remove all variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/remove-all") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); @@ -650,7 +761,7 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { // Check result assertEquals(0, variablesSet4.size()); - // --- add an existing variables set --- // + // --- Add an existing variables set --- // mvcResult = mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/add") .content(objectMapper.writeValueAsString(List.of(variablesSet2.get(2).getName()))) .contentType(APPLICATION_JSON)) @@ -663,7 +774,13 @@ public void testSaveGeneratorModelThenModifyVariablesSets() throws Exception { // Check result assertEquals(1, variablesSet5.size()); - // --- delete definitively a variables set --- // + // --- Add an unknown existing variables set => must fail fast --- // + mvc.perform(patch("/models/" + model.getModelName() + "/variables-sets/add") + .content(objectMapper.writeValueAsString(List.of("variable_set_unknown"))) + .contentType(APPLICATION_JSON)) + .andExpect(status().isNotFound()); + + // --- Delete definitively a variables set --- // mvcResult = mvc.perform(delete("/models/variables-sets") .content(objectMapper.writeValueAsString(List.of(variablesSet2.get(2).getName()))) .contentType(APPLICATION_JSON)) diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index a9755f66..02325094 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -57,8 +57,8 @@ public class ScriptControllerTest { private void cleanDB() { scriptRepository.deleteAll(); - modelParameterDefinitionRepository.deleteAll(); modelRepository.deleteAll(); + modelParameterDefinitionRepository.deleteAll(); } private ModelParameterDefinitionEntity createDefinitionEntity(String name, ParameterType type, ParameterOrigin origin, String originName, ModelEntity model) { @@ -84,7 +84,7 @@ public void setUp() { loadGroups.add(loadGroup); loadModel.setSetsGroups(loadGroups); - ArrayList definitions = new ArrayList<>(); + Set definitions = new LinkedHashSet<>(); definitions.add(createDefinitionEntity("load_alpha", ParameterType.DOUBLE, ParameterOrigin.USER, null, loadModel)); definitions.add(createDefinitionEntity("load_beta", ParameterType.DOUBLE, ParameterOrigin.USER, null, loadModel)); definitions.add(createDefinitionEntity("load_P0Pu", ParameterType.DOUBLE, ParameterOrigin.NETWORK, "p_pu", loadModel)); @@ -383,12 +383,12 @@ public void parTest() throws Exception { String parFile = "\n" + "\n" + " \n" + - " \n" + - " \n" + - " \n" + - " \n" + " \n" + + " \n" + " \n" + + " \n" + + " \n" + + " \n" + " \n" + ""; From c6185fe8da870c48f21229756f51274bcbcd5f2d Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 8 Jun 2023 23:04:50 +0200 Subject: [PATCH 13/16] Regenerate liquibase --- .../mapping/server/model/ModelEntity.java | 4 +- .../implementation/ModelServiceImpl.java | 50 ++++++------ .../changesets/changelog_20230608T205630Z.xml | 78 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 4 + .../mapping/server/ModelControllerTest.java | 8 +- .../mapping/server/ScriptControllerTest.java | 6 +- 6 files changed, 119 insertions(+), 31 deletions(-) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20230608T205630Z.xml 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 f7ee5716..7caa7ac1 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -50,7 +50,7 @@ public class ModelEntity implements Serializable { private Set parameterDefinitions = new LinkedHashSet<>(0); @OneToMany(targetEntity = ModelSetsGroupEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) - private List setsGroups = new ArrayList<>(0); + private Set setsGroups = new LinkedHashSet<>(0); // must exclude CascadeType.REMOVE to avoid unexpected cascade on delete a ModelVariableDefinitionEntity @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @@ -68,7 +68,7 @@ public ModelEntity(Model modelToConvert) { modelName = modelToConvert.getModelName(); equipmentType = modelToConvert.getEquipmentType(); parameterDefinitions = modelToConvert.getParameterDefinitions() != null ? modelToConvert.getParameterDefinitions().stream().map(parameterDefinition -> new ModelParameterDefinitionEntity(this, parameterDefinition)).collect(Collectors.toSet()) : null; - setsGroups = modelToConvert.getSetsGroups() != null ? modelToConvert.getSetsGroups().stream().map(group -> new ModelSetsGroupEntity(this, group)).collect(Collectors.toList()) : null; + setsGroups = modelToConvert.getSetsGroups() != null ? modelToConvert.getSetsGroups().stream().map(group -> new ModelSetsGroupEntity(this, group)).collect(Collectors.toCollection(LinkedHashSet::new)) : null; variableDefinitions = modelToConvert.getVariableDefinitions() != null ? modelToConvert.getVariableDefinitions().stream().map(variableDefinition -> new ModelVariableDefinitionEntity(this, null, variableDefinition)).collect(Collectors.toCollection(LinkedHashSet::new)) : null; variableSets = modelToConvert.getVariablesSets() != null ? modelToConvert.getVariablesSets().stream().map(variablesSet -> new ModelVariableSetEntity(this, variablesSet)).collect(Collectors.toCollection(LinkedHashSet::new)) : null; } 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 f27b3eb0..00811dc1 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 @@ -81,30 +81,34 @@ public List getSetsFromGroup(String modelName, String groupName, @Override public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersSetsGroup setsGroup, Boolean strict) { - Optional foundModel = modelRepository.findById(modelName); - if (foundModel.isPresent()) { - ModelEntity modelToUpdate = foundModel.get(); - List savedGroups = modelToUpdate.getSetsGroups(); - ModelSetsGroupEntity previousGroup = savedGroups.stream().filter(savedGroup -> savedGroup.getName().equals(setsGroup.getName())).findAny().orElse(null); - ModelSetsGroupEntity groupToAdd = new ModelSetsGroupEntity(modelToUpdate, setsGroup); - groupToAdd.getSets().forEach(set -> set.setUpdatedDate(new Date())); - - 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(set -> - previousGroup.getSets().add(set) - ); - } - if (new Model(modelToUpdate).isParameterSetGroupValid(setsGroup.getName(), strict)) { - modelRepository.save(modelToUpdate); - return setsGroup; - } else { - throw new HttpClientErrorException(HttpStatus.BAD_REQUEST); - } + Optional foundModelOpt = modelRepository.findById(modelName); + + ModelEntity modelToUpdate = getModelFromOptional(modelName, foundModelOpt); + + /* + List savedGroups = modelToUpdate.getSetsGroups(); + ModelSetsGroupEntity previousGroup = savedGroups.stream().filter(savedGroup -> savedGroup.getName().equals(setsGroup.getName())).findAny().orElse(null); + ModelSetsGroupEntity groupToAdd = new ModelSetsGroupEntity(modelToUpdate, setsGroup); + groupToAdd.getSets().forEach(set -> set.setUpdatedDate(new Date())); + + 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(set -> + previousGroup.getSets().add(set) + ); + }*/ + + // do merge with the list of set group + ModelSetsGroupEntity newSetsGroupEntity = new ModelSetsGroupEntity(modelToUpdate, setsGroup); + modelToUpdate.addSetsGroup(List.of(newSetsGroupEntity)); + + if (new Model(modelToUpdate).isParameterSetGroupValid(setsGroup.getName(), strict)) { + modelRepository.save(modelToUpdate); + return setsGroup; } else { - throw new HttpClientErrorException(HttpStatus.NOT_FOUND); + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST); } } diff --git a/src/main/resources/db/changelog/changesets/changelog_20230608T205630Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230608T205630Z.xml new file mode 100644 index 00000000..84184d5e --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20230608T205630Z.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 18455bdd..33770df1 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -19,3 +19,7 @@ databaseChangeLog: - include: file: changesets/changelog_20230605T173446Z.xml relativeToChangelogFile: true + + - include: + file: changesets/changelog_20230608T205630Z.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 747c0e91..20e6ea61 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -94,7 +94,7 @@ public void setUp() { // prepare token model ModelEntity modelToSave = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, - new LinkedHashSet<>(), new ArrayList<>(), Set.of(), Set.of(), null, null); + new LinkedHashSet<>(), new LinkedHashSet<>(), Set.of(), Set.of(), null, null); ArrayList definitions = new ArrayList<>(); definitions.add(createDefinitionEntity("load_alpha", ParameterType.DOUBLE, ParameterOrigin.USER, null, modelToSave)); definitions.add(createDefinitionEntity("load_beta", ParameterType.DOUBLE, ParameterOrigin.USER, null, modelToSave)); @@ -150,7 +150,8 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isNotFound()); - Date createdDate = new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets()).get(0).getCreatedDate(); + Date createdDate = new ArrayList<>(new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups()).get(0) + .getSets()).get(0).getCreatedDate(); // Update data mvc.perform(post("/models/" + modelName + "/parameters/sets/strict") @@ -158,7 +159,8 @@ public void test() throws Exception { .contentType(APPLICATION_JSON)) .andExpect(status().isOk()); - Date updatedDate = new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups().get(0).getSets()).get(0).getUpdatedDate(); + Date updatedDate = new ArrayList<>(new ArrayList<>(modelRepository.findById(modelName).get().getSetsGroups()).get(0) + .getSets()).get(0).getUpdatedDate(); assertThat(createdDate.compareTo(updatedDate) < 0); } diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index 02325094..28d48dea 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -71,7 +71,7 @@ public void setUp() { // Prepare models ModelEntity loadModel = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, new LinkedHashSet<>(), null, Set.of(), Set.of(), null, null); - ArrayList loadGroups = new ArrayList<>(); + Set loadGroups = new LinkedHashSet<>(); ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, null, loadModel, null, null); Set groupSets = new LinkedHashSet<>(); ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", null, loadGroup, null, null); @@ -95,13 +95,13 @@ public void setUp() { modelRepository.save(loadModel); ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, null, null, null, null, null, null); - ArrayList generatorThreeGroups = new ArrayList<>(); + Set generatorThreeGroups = new LinkedHashSet<>(); generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", SetGroupType.PREFIX, null, generatorThreeModel, null, null)); generatorThreeModel.setSetsGroups(generatorThreeGroups); modelRepository.save(generatorThreeModel); ModelEntity generatorFourModel = new ModelEntity("GeneratorFourWindings", EquipmentType.GENERATOR, null, null, null, null, null, null); - ArrayList generatorFourGroups = new ArrayList<>(); + Set generatorFourGroups = new LinkedHashSet<>(); generatorFourGroups.add(new ModelSetsGroupEntity("GSFWPR", SetGroupType.PREFIX, null, generatorFourModel, null, null)); generatorFourModel.setSetsGroups(generatorFourGroups); modelRepository.save(generatorFourModel); From d4611dc23c00b7a148e7c3097452727d33d79c37 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 9 Jun 2023 12:30:57 +0200 Subject: [PATCH 14/16] Truncate related tabled to rerun script SQL IEEE14 --- .../changesets/changelog_20230605T173446Z.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml index 84aa0858..05c62685 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml @@ -1,5 +1,19 @@ + + Clear any existing legacy data in tables + + TRUNCATE TABLE model_parameters; + TRUNCATE TABLE model_parameter_sets; + TRUNCATE TABLE model_sets_group; + TRUNCATE TABLE model_parameter_definitions; + TRUNCATE TABLE models_model_variable_sets + TRUNCATE TABLE models_model_variable_definitions; + TRUNCATE TABLE model_variable_sets; + TRUNCATE TABLE model_variable_definitions; + TRUNCATE TABLE models; + + From 60f44cce476505639d8742049eb433d99f9300c9 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 9 Jun 2023 14:04:47 +0200 Subject: [PATCH 15/16] Replace truncate by delete to avoid foreign key check problem --- .../changesets/changelog_20230605T173446Z.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml index 05c62685..0005cd33 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20230605T173446Z.xml @@ -3,15 +3,15 @@ Clear any existing legacy data in tables - TRUNCATE TABLE model_parameters; - TRUNCATE TABLE model_parameter_sets; - TRUNCATE TABLE model_sets_group; - TRUNCATE TABLE model_parameter_definitions; - TRUNCATE TABLE models_model_variable_sets - TRUNCATE TABLE models_model_variable_definitions; - TRUNCATE TABLE model_variable_sets; - TRUNCATE TABLE model_variable_definitions; - TRUNCATE TABLE models; + DELETE FROM model_parameters; + DELETE FROM model_parameter_sets; + DELETE FROM model_sets_group; + DELETE FROM model_parameter_definitions; + DELETE FROM models_model_variable_sets; + DELETE FROM models_model_variable_definitions; + DELETE FROM model_variable_sets; + DELETE FROM model_variable_definitions; + DELETE FROM models; From 937ff0be0e8a83762ef82e1726e511f6ea2ca510 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 12 Jun 2023 09:21:29 +0200 Subject: [PATCH 16/16] Revert ModelEntity to implement AbstractManuallyAssignedIdentifierEntity --- .../mapping/server/model/ModelEntity.java | 7 ++++- .../server/model/ModelParameterSetEntity.java | 4 +-- .../mapping/server/ModelControllerTest.java | 2 +- .../mapping/server/ScriptControllerTest.java | 29 +++++++------------ 4 files changed, 20 insertions(+), 22 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 7caa7ac1..33afe923 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -30,7 +30,7 @@ @Setter @Entity @Table(name = "models") -public class ModelEntity implements Serializable { +public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity implements Serializable { // Could be replaced with UUID, but we lose the ease of use of names @Id @@ -64,6 +64,11 @@ public class ModelEntity implements Serializable { @ManyToMany(targetEntity = ModelVariableSetEntity.class, mappedBy = "models", cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) private Set variableSets = new LinkedHashSet<>(0); + @Override + public String getId() { + return modelName; + } + public ModelEntity(Model modelToConvert) { modelName = modelToConvert.getModelName(); equipmentType = modelToConvert.getEquipmentType(); 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 313637e8..1fb0aa20 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -36,7 +36,7 @@ public class ModelParameterSetEntity implements Serializable { private String name; @OneToMany(mappedBy = "parameterSet", cascade = {CascadeType.ALL}, orphanRemoval = true) - private List parameters; + private Set parameters; @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) @JoinColumns(foreignKey = @ForeignKey(name = "model_parameter_sets_fk"), value = { @@ -48,7 +48,7 @@ public class ModelParameterSetEntity implements Serializable { public ModelParameterSetEntity(ModelSetsGroupEntity group, ParametersSet set) { this(set.getName(), null, group, null, null); this.parameters = set.getParameters().stream().map(parameter -> new ModelParameterEntity(this, parameter)) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); } @CreatedDate diff --git a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java index 20e6ea61..687b75f3 100644 --- a/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java @@ -221,7 +221,7 @@ public void getTest() throws Exception { // Prepare models ModelEntity loadModel = modelRepository.findById("LoadAlphaBeta").get(); ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, new LinkedHashSet<>(), loadModel, null, null); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", new ArrayList<>(), loadGroup, null, null); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", new LinkedHashSet<>(), loadGroup, null, null); List setParameters = new ArrayList<>(); setParameters.add(new ModelParameterEntity("load_alpha", "1.5", setToSave, null, null)); setParameters.add(new ModelParameterEntity("load_beta", "2.5", setToSave, null, null)); diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index 28d48dea..8c221b15 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import static org.springframework.http.MediaType.APPLICATION_JSON; @@ -70,19 +71,15 @@ public void setUp() { cleanDB(); // Prepare models - ModelEntity loadModel = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, new LinkedHashSet<>(), null, Set.of(), Set.of(), null, null); - Set loadGroups = new LinkedHashSet<>(); - ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, null, loadModel, null, null); - Set groupSets = new LinkedHashSet<>(); - ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", null, loadGroup, null, null); + ModelEntity loadModel = new ModelEntity("LoadAlphaBeta", EquipmentType.LOAD, new LinkedHashSet<>(), new LinkedHashSet<>(), new LinkedHashSet<>(), new LinkedHashSet<>(), null, null); + ModelSetsGroupEntity loadGroup = new ModelSetsGroupEntity("LAB", SetGroupType.FIXED, new LinkedHashSet<>(), loadModel, null, null); + ModelParameterSetEntity setToSave = new ModelParameterSetEntity("LAB", new LinkedHashSet<>(), loadGroup, null, null); ArrayList setParameters = new ArrayList<>(); setParameters.add(new ModelParameterEntity("load_alpha", "1.5", setToSave, null, null)); setParameters.add(new ModelParameterEntity("load_beta", "2.5", setToSave, null, null)); - setToSave.setParameters(setParameters); - groupSets.add(setToSave); - loadGroup.setSets(groupSets); - loadGroups.add(loadGroup); - loadModel.setSetsGroups(loadGroups); + setToSave.addParameters(setParameters); + //loadGroup.addSets(List.of(setToSave)); + loadModel.addSetsGroup(List.of(loadGroup)); Set definitions = new LinkedHashSet<>(); definitions.add(createDefinitionEntity("load_alpha", ParameterType.DOUBLE, ParameterOrigin.USER, null, loadModel)); @@ -94,16 +91,12 @@ public void setUp() { loadModel.addParameterDefinitions(definitions); modelRepository.save(loadModel); - ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, null, null, null, null, null, null); - Set generatorThreeGroups = new LinkedHashSet<>(); - generatorThreeGroups.add(new ModelSetsGroupEntity("GSTWPR", SetGroupType.PREFIX, null, generatorThreeModel, null, null)); - generatorThreeModel.setSetsGroups(generatorThreeGroups); + ModelEntity generatorThreeModel = new ModelEntity("GeneratorThreeWindings", EquipmentType.GENERATOR, new LinkedHashSet<>(), new LinkedHashSet<>(), new LinkedHashSet<>(), new LinkedHashSet<>(), null, null); + generatorThreeModel.addSetsGroup(List.of(new ModelSetsGroupEntity("GSTWPR", SetGroupType.PREFIX, new LinkedHashSet<>(), generatorThreeModel, null, null))); modelRepository.save(generatorThreeModel); - ModelEntity generatorFourModel = new ModelEntity("GeneratorFourWindings", EquipmentType.GENERATOR, null, null, null, null, null, null); - Set generatorFourGroups = new LinkedHashSet<>(); - generatorFourGroups.add(new ModelSetsGroupEntity("GSFWPR", SetGroupType.PREFIX, null, generatorFourModel, null, null)); - generatorFourModel.setSetsGroups(generatorFourGroups); + ModelEntity generatorFourModel = new ModelEntity("GeneratorFourWindings", EquipmentType.GENERATOR, new LinkedHashSet<>(), new LinkedHashSet<>(), new LinkedHashSet<>(), new LinkedHashSet<>(), null, null); + generatorFourModel.addSetsGroup(List.of(new ModelSetsGroupEntity("GSFWPR", SetGroupType.PREFIX, new LinkedHashSet<>(), generatorFourModel, null, null))); modelRepository.save(generatorFourModel); }