From 8060f5805f02968b4da519c79300c6b87591932c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Manelphe?= Date: Fri, 27 Oct 2023 16:09:25 +0200 Subject: [PATCH 01/13] fileIdCard refactor normage --- .../core/service/global/bo/FileIdCard.java | 69 ++- .../service/global/dao/RulesOperations.java | 54 ++- .../p2chargement/dao/ChargeurCsvDao.java | 4 +- .../p2chargement/dao/ChargeurXMLDao.java | 2 +- .../p2chargement/dao/HandlerXMLDao.java | 2 +- .../operation/ChargementBrut.java | 8 +- .../operation/ChargementRulesOperation.java | 2 +- .../p2chargement/operation/ChargeurCSV.java | 4 +- .../p2chargement/operation/ChargeurXml.java | 2 +- .../operation/ChargeurXmlComplexe.java | 2 +- .../service/p3normage/bo/IdCardNormage.java | 58 +++ .../service/p3normage/bo/RegleNormage.java | 40 ++ .../service/p3normage/bo/TypeNormage.java | 28 ++ .../p3normage/operation/NormageOperation.java | 154 +++---- .../operation/NormageRulesOperation.java | 52 +++ .../DuplicationRulesRegleQueryBuilder.java | 298 +++++++------ .../querybuilder/EngineRulesQueryBuilder.java | 18 +- .../IndependanceRulesQueryBuilder.java | 73 ++-- .../RelationRulesQueryBuilder.java | 67 +-- .../SuppressionRulesQueryBuilder.java | 72 ++-- .../thread/ThreadNormageService.java | 406 +++++++++--------- .../p4controle/bo/ControleTypeCode.java | 23 + .../service/p4controle/bo/IdCardControle.java | 34 ++ .../service/p4controle/bo/RegleControle.java | 136 ++++++ .../operation/ControleRulesOperation.java | 58 +++ .../service/p5mapping/bo/IdCardMapping.java | 22 + .../service/p5mapping/bo/RegleMapping.java | 30 ++ .../operation/MappingRulesOperation.java | 47 ++ .../ChargementRulesOperationTest.java | 67 +++ .../operation/NormageRulesOperationTest.java | 73 ++++ .../operation/ControleRulesOperationTest.java | 86 ++++ .../operation/MappingRulesOperationTest.java | 64 +++ .../ExecuteEngineChargementOperation.java | 2 +- .../ExecuteEngineNormageOperation.java | 26 +- 34 files changed, 1454 insertions(+), 629 deletions(-) create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/IdCardNormage.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/RegleNormage.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/IdCardControle.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/IdCardMapping.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/RegleMapping.java create mode 100644 arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/operation/ChargementRulesOperationTest.java create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperationTest.java create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperationTest.java diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/global/bo/FileIdCard.java b/arc-core/src/main/java/fr/insee/arc/core/service/global/bo/FileIdCard.java index 544c93c14..053245055 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/global/bo/FileIdCard.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/global/bo/FileIdCard.java @@ -4,42 +4,86 @@ import fr.insee.arc.core.service.global.dao.DateConversion; import fr.insee.arc.core.service.p2chargement.bo.IdCardChargement; +import fr.insee.arc.core.service.p3normage.bo.IdCardNormage; +import fr.insee.arc.core.service.p4controle.bo.IdCardControle; +import fr.insee.arc.core.service.p5mapping.bo.IdCardMapping; public class FileIdCard { + private final String integrationDate = DateConversion.queryDateConversion(new Date()); - private String fileName; + private String idSource; private String idNorme; private String validite; private String periodicite; - private final String integrationDate = DateConversion.queryDateConversion(new Date()); + private String jointure; private IdCardChargement idCardChargement; + public IdCardChargement getIdCardChargement() { return idCardChargement; } + public void setIdCardChargement(IdCardChargement regleChargement) { this.idCardChargement = regleChargement; } + + private IdCardNormage idCardNormage; + + public IdCardNormage getIdCardNormage() { + return idCardNormage; + } + + public void setIdCardNormage(IdCardNormage idCardNormage) { + this.idCardNormage = idCardNormage; + } + + private IdCardControle idCardControle; + + public IdCardControle getIdCardControle() { + return idCardControle; + } + + public void setIdCardControle(IdCardControle idCardControle) { + this.idCardControle = idCardControle; + } + + private IdCardMapping idCardMapping; + + public IdCardMapping getIdCardMapping() { + return idCardMapping; + } + + public void setIdCardMapping(IdCardMapping idCardMapping) { + this.idCardMapping = idCardMapping; + } public FileIdCard(String idSource) { - this.fileName = idSource; + this.idSource = idSource; } - public void setFileIdCard(String idNorme, String validite, String periodicite) { + /** + * Set the pilotage values for a file + * @param idNorme + * @param validite + * @param periodicite + * @param jointure + */ + public void setFileIdCard(String idNorme, String validite, String periodicite, String jointure) { this.idNorme = idNorme; this.validite = validite; this.periodicite = periodicite; + this.jointure = jointure; } - public String getFileName() { - return fileName; + public String getIdSource() { + return idSource; } - public void setFileName(String fileName) { - this.fileName = fileName; + public void setIdSource(String idSource) { + this.idSource = idSource; } @@ -78,6 +122,13 @@ public void setPeriodicite(String periodicite) { } - + + public String getJointure() { + return jointure; + } + + public void setJointure(String jointure) { + this.jointure = jointure; + } } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/global/dao/RulesOperations.java b/arc-core/src/main/java/fr/insee/arc/core/service/global/dao/RulesOperations.java index b9d092324..88bce760c 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/global/dao/RulesOperations.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/global/dao/RulesOperations.java @@ -105,8 +105,10 @@ private static String conditionRegle(String tablePilotage) { requete.append("EXISTS ( SELECT * FROM " + tablePilotage + " b "); requete.append("WHERE a.id_norme=b.id_norme "); requete.append("AND a.periodicite=b.periodicite "); - requete.append("AND a.validite_inf<=to_date(b.validite,'"+ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat()+"') "); - requete.append("AND a.validite_sup>=to_date(b.validite,'"+ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat()+"') "); + requete.append("AND a.validite_inf<=to_date(b.validite,'" + + ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat() + "') "); + requete.append("AND a.validite_sup>=to_date(b.validite,'" + + ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat() + "') "); requete.append(") "); return requete.toString(); } @@ -116,8 +118,10 @@ private static String conditionRegle(FileIdCard fileIdCard) { requete.append("\n "); requete.append("a.id_norme='" + fileIdCard.getIdNorme() + "' "); requete.append("AND a.periodicite='" + fileIdCard.getPeriodicite() + "' "); - requete.append("AND a.validite_inf<=to_date('" + fileIdCard.getValidite() + "','"+ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat()+"') "); - requete.append("AND a.validite_sup>=to_date('" + fileIdCard.getValidite() + "','"+ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat()+"') "); + requete.append("AND a.validite_inf<=to_date('" + fileIdCard.getValidite() + "','" + + ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat() + "') "); + requete.append("AND a.validite_sup>=to_date('" + fileIdCard.getValidite() + "','" + + ArcDateFormat.DATE_FORMAT_CONVERSION.getDatastoreFormat() + "') "); requete.append(";"); return requete.toString(); } @@ -129,13 +133,13 @@ private static String conditionRegle(FileIdCard fileIdCard) { * @param id_source * @param tableRegle * @return SQL pil.id_source, pil.jointure, pil.id_norme, pil.validite, - * pil.periodicite, pil.validite + * pil.periodicite */ public static String getNormeAttributes(String idSource, String tablePilotage) { StringBuilder requete = new StringBuilder(); requete.append("\n SELECT pil." + ColumnEnum.ID_SOURCE.getColumnName() - + ", pil.jointure, pil.id_norme, pil.validite, pil.periodicite, pil.validite " + "FROM " + tablePilotage - + " pil " + " WHERE " + ColumnEnum.ID_SOURCE.getColumnName() + "='" + idSource + "' "); + + ", pil.jointure, pil.id_norme, pil.validite, pil.periodicite " + "FROM " + tablePilotage + " pil " + + " WHERE " + ColumnEnum.ID_SOURCE.getColumnName() + "='" + idSource + "' "); return requete.toString(); } @@ -148,11 +152,10 @@ public static String getNormeAttributes(String idSource, String tablePilotage) { * @throws ArcException */ public static Map> getBean(Connection c, String req) throws ArcException { - GenericBean gb = new GenericBean( - UtilitaireDao.get(0).executeRequest(c, new ArcPreparedStatementBuilder(req))); + GenericBean gb = new GenericBean(UtilitaireDao.get(0).executeRequest(c, new ArcPreparedStatementBuilder(req))); return gb.mapContent(true); } - + /** * Méthodes pour marquer la table de pilotage temporaire avec le jeu de règle * appliqué @@ -163,7 +166,8 @@ public static String marqueJeuDeRegleApplique(TraitementPhase currentPhase, Stri return marqueJeuDeRegleApplique(currentPhase, envExecution, pilTemp, null); } - public static String marqueJeuDeRegleApplique(TraitementPhase currentPhase, String envExecution, String pilTemp, String defaultEtatTraitement) { + public static String marqueJeuDeRegleApplique(TraitementPhase currentPhase, String envExecution, String pilTemp, + String defaultEtatTraitement) { StringBuilder requete = new StringBuilder(); requete.append("WITH "); requete.append("prep AS (SELECT a." + ColumnEnum.ID_SOURCE.getColumnName() @@ -181,5 +185,31 @@ public static String marqueJeuDeRegleApplique(TraitementPhase currentPhase, Stri requete.append("WHERE a.phase_traitement='" + currentPhase + "'; "); return requete.toString(); } - + + /** + * Set the id card for a file idSource + * + * @param connection + * @param idSource + * @param pilotageTable + * @return + * @throws ArcException + */ + public static FileIdCard fileIdCardFromPilotage(Connection connection, String pilotageTable, String idSource) + throws ArcException { + + FileIdCard fileIdCard = new FileIdCard(idSource); + + Map> fileIds = RulesOperations.getBean(connection, + RulesOperations.getNormeAttributes(idSource, pilotageTable)); + + fileIdCard.setFileIdCard(fileIds.get(ColumnEnum.ID_NORME.getColumnName()).get(0), + fileIds.get(ColumnEnum.VALIDITE.getColumnName()).get(0), + fileIds.get(ColumnEnum.PERIODICITE.getColumnName()).get(0), + fileIds.get(ColumnEnum.JOINTURE.getColumnName()).get(0)); + + return fileIdCard; + + } + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurCsvDao.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurCsvDao.java index 29fb1dd69..adaa52a4a 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurCsvDao.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurCsvDao.java @@ -104,7 +104,7 @@ public void execQueryCreateContainerWithArcMetadata() throws ArcException { req.append("DROP TABLE IF EXISTS " + ViewEnum.TMP_CHARGEMENT_ARC.getFullName() + ";"); req.append("CREATE TEMPORARY TABLE " + ViewEnum.TMP_CHARGEMENT_ARC.getFullName()); req.append(" AS (SELECT "); - req.append("\n '" + fileIdCard.getFileName() + "'::text collate \"C\" as " + req.append("\n '" + fileIdCard.getIdSource() + "'::text collate \"C\" as " + ColumnEnum.ID_SOURCE.getColumnName()); req.append("\n ,id::integer as id"); req.append("\n ," + fileIdCard.getIntegrationDate() + "::text collate \"C\" as date_integration "); @@ -439,7 +439,7 @@ private List execQuerySelectColumnsFromLoadTable() throws ArcException { public void execQueryBilan(String tableChargementPilTemp, TraitementPhase currentPhase) throws ArcException { StringBuilder requeteBilan = new StringBuilder(); - requeteBilan.append(ApiService.pilotageMarkIdsource(tableChargementPilTemp, fileIdCard.getFileName(), + requeteBilan.append(ApiService.pilotageMarkIdsource(tableChargementPilTemp, fileIdCard.getIdSource(), currentPhase, TraitementEtat.OK.toString(), null)); UtilitaireDao.get(0).executeBlock(sandbox.getConnection(), requeteBilan); diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurXMLDao.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurXMLDao.java index e871ce75a..75babf592 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurXMLDao.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/ChargeurXMLDao.java @@ -88,7 +88,7 @@ public void execQueryCreateTemporaryLoadDataTable(String tableTempA) throws ArcE public void execQueryBilan(String tableChargementPilTemp, TraitementPhase currentPhase, String rapport, String jointure) throws ArcException { StringBuilder requeteBilan = new StringBuilder(); - requeteBilan.append(ApiService.pilotageMarkIdsource(tableChargementPilTemp, fileIdCard.getFileName(), + requeteBilan.append(ApiService.pilotageMarkIdsource(tableChargementPilTemp, fileIdCard.getIdSource(), currentPhase, TraitementEtat.OK.toString(), rapport, jointure)); UtilitaireDao.get(0).executeBlock(sandbox.getConnection(), requeteBilan); } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/HandlerXMLDao.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/HandlerXMLDao.java index 739ed5394..223fc9cb8 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/HandlerXMLDao.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/dao/HandlerXMLDao.java @@ -107,7 +107,7 @@ private void buildInsertQuery(List lineCols, List lineIds, Lis .append(",") // .append(XMLColumns.getShort(ColumnEnum.VALIDITE)); // - req2.append("('").append(fileIdCard.getFileName()).append("',").append(this.idLigne).append(",") + req2.append("('").append(fileIdCard.getIdSource()).append("',").append(this.idLigne).append(",") .append(this.fileIdCard.getIntegrationDate()).append(",'").append(this.fileIdCard.getIdNorme()) .append("','").append(this.fileIdCard.getPeriodicite()).append("','") .append(this.fileIdCard.getValidite()).append("'"); diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargementBrut.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargementBrut.java index 67b6ebe10..4abb5b72f 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargementBrut.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargementBrut.java @@ -101,17 +101,17 @@ public void calculeNormeAndValiditeFichiers(InputStream file, FileIdCard normeOk // Gênant si la norme utilise une ligne qui n'est pas dans les xxx premières lignes, mais choix temporaire pour éviter // de charger un fichier entier à la recherche de sa norme while (normeOk.getIdNorme() == null && nbBoucle 1) { - throw new ArcException(ArcExceptionMessage.LOAD_RULES_NOT_FOUND, fileIdCard.getIdNorme()); + throw new ArcException(ArcExceptionMessage.LOAD_RULES_SEVERAL, fileIdCard.getIdNorme()); } fileIdCard.setIdCardChargement( diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurCSV.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurCSV.java index 146a9b0a3..857484da0 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurCSV.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurCSV.java @@ -142,7 +142,7 @@ private void computeHeaders() throws ArcException { } } catch (IOException fileReadException) { throw new ArcException(fileReadException, ArcExceptionMessage.FILE_READ_FAILED, - fileIdCard.getFileName()); + fileIdCard.getIdSource()); } } else { String[] headers = Format.tokenizeAndTrim(userDefinedHeaders, Delimiters.HEADERS_DELIMITER); @@ -172,7 +172,7 @@ private void importCsvDataToTable() throws ArcException { } } catch (IOException fileReadException) { throw new ArcException(fileReadException, ArcExceptionMessage.FILE_READ_FAILED, - this.fileIdCard.getFileName()); + this.fileIdCard.getIdSource()); } } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXml.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXml.java index d22d3fc63..2fe44756c 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXml.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXml.java @@ -102,7 +102,7 @@ public void execution() throws ArcException { saxParser.parse(f, handler); } catch (ParserConfigurationException | SAXException | IOException e) { ArcException businessException = new ArcException(e, ArcExceptionMessage.XML_SAX_PARSING_FAILED, - fileIdCard.getFileName()).logMessageException(); + fileIdCard.getIdSource()).logMessageException(); rapport = FormatSQL.quoteTextWithoutEnclosings(businessException.getMessage()); throw businessException; } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXmlComplexe.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXmlComplexe.java index b03f61e17..a88b75240 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXmlComplexe.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/operation/ChargeurXmlComplexe.java @@ -132,7 +132,7 @@ public void execution() throws ArcException { saxParser.parse(f, handler); } catch (ParserConfigurationException | SAXException | IOException e) { ArcException businessException = new ArcException(e, ArcExceptionMessage.XML_SAX_PARSING_FAILED, - this.fileIdCard.getFileName()).logMessageException(); + this.fileIdCard.getIdSource()).logMessageException(); rapport = FormatSQL.quoteTextWithoutEnclosings(businessException.getMessage()); throw businessException; } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/IdCardNormage.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/IdCardNormage.java new file mode 100644 index 000000000..404586801 --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/IdCardNormage.java @@ -0,0 +1,58 @@ +package fr.insee.arc.core.service.p3normage.bo; + +import java.util.List; +import java.util.stream.Collectors; + +public class IdCardNormage { + + private List reglesNormage; + + public IdCardNormage(List reglesNormage) { + super(); + this.reglesNormage = reglesNormage; + } + + public List getReglesNormage() { + return reglesNormage; + } + + /** + * Renvoie la liste des règles de normage filtrée selon le type de structuration donné + * @param typeNormage + * @return + */ + public List getReglesNormage(TypeNormage typeNormage) { + return reglesNormage.stream() + .filter(r -> r.getTypeNormage().equals(typeNormage)) + .collect(Collectors.toList()); + } + + public void setReglesNormage(List reglesNormage) { + this.reglesNormage = reglesNormage; + } + + public void addRegleNormage(RegleNormage regleNormage) { + this.reglesNormage.add(regleNormage); + } + + /** + * test if provided rubriqueToTest matches any of rubrique in idCardNormage + * @param rubriqueToTest + * @return + */ + public boolean isAnyRubrique(String rubriqueToTest) + { + return this.reglesNormage.stream().anyMatch(t -> t.getRubrique().contains(rubriqueToTest)); + } + + /** + * test if provided rubriqueToTest matches any of rubriqueNmcl in idCardNormage + * @param rubriqueToTest + * @return + */ + public boolean isAnyRubriqueNmcl(String rubriqueToTest) + { + return this.reglesNormage.stream().anyMatch(t -> t.getRubriqueNmcl().contains(rubriqueToTest)); + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/RegleNormage.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/RegleNormage.java new file mode 100644 index 000000000..b27118124 --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/RegleNormage.java @@ -0,0 +1,40 @@ +package fr.insee.arc.core.service.p3normage.bo; + +public class RegleNormage { + + private TypeNormage typeNormage; // aka id_classe, type de structuration + private String rubrique; + private String rubriqueNmcl; // aka rubrique_nmcl + + public RegleNormage(TypeNormage typeNormage, String rubrique, String rubriqueNmcl) { + super(); + this.typeNormage = typeNormage; + this.rubrique = rubrique; + this.rubriqueNmcl = rubriqueNmcl; + } + + public TypeNormage getTypeNormage() { + return typeNormage; + } + + public void setTypeNormage(TypeNormage typeNormage) { + this.typeNormage = typeNormage; + } + + public String getRubrique() { + return rubrique; + } + + public void setRubrique(String rubrique) { + this.rubrique = rubrique; + } + + public String getRubriqueNmcl() { + return rubriqueNmcl; + } + + public void setRubriqueNmcl(String rubriqueNmcl) { + this.rubriqueNmcl = rubriqueNmcl; + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java new file mode 100644 index 000000000..9f7520198 --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java @@ -0,0 +1,28 @@ +package fr.insee.arc.core.service.p3normage.bo; + +public enum TypeNormage { + RELATION("relation"), + CARTESIAN("cartesian"), + UNICITE("unicité"), + PARTITION("partition"), + INDEPENDANCE("independance"), + BLOC_INDEPENDANCE("bloc_independance"), + DELETION("deletion"), + DUPLICATION("duplication") + ; + + private String nom; + + private TypeNormage(String nom) { + this.nom = nom; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java index 9c27b3a5e..8a5561593 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java @@ -1,11 +1,6 @@ package fr.insee.arc.core.service.p3normage.operation; import java.sql.Connection; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -18,8 +13,10 @@ import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder; import fr.insee.arc.core.dataobjects.ColumnEnum; -import fr.insee.arc.core.service.global.bo.ArcDateFormat; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p3normage.bo.JoinParser; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; import fr.insee.arc.core.service.p3normage.dao.NormageDao; import fr.insee.arc.core.service.p3normage.querybuilder.DuplicationRulesRegleQueryBuilder; import fr.insee.arc.core.service.p3normage.querybuilder.EngineRulesQueryBuilder; @@ -31,7 +28,6 @@ import fr.insee.arc.utils.dao.ParameterType; import fr.insee.arc.utils.dao.UtilitaireDao; import fr.insee.arc.utils.exception.ArcException; -import fr.insee.arc.utils.exception.ArcExceptionMessage; import fr.insee.arc.utils.utils.ManipString; //@formatter:off @@ -47,30 +43,10 @@ public class NormageOperation { private static final Logger LOGGER = LogManager.getLogger(NormageOperation.class); - - private SimpleDateFormat formatter = new SimpleDateFormat( - ArcDateFormat.DATE_FORMAT_CONVERSION.getApplicationFormat()); private StringBuilder columnToBeAdded = new StringBuilder(); private Connection connection; - /** - * Caractéristique du fichier (idSource) issu du pilotage de ARC - * - * idSource : nom du fichier jointure : requete de strucutration id_norme : - * identifiant de norme validite : validite periodicite : periodicite - */ - private Map> pilotageIdSource; - - /** - * Les regles relatives au fichier (idSource) - * - * id_norme text, periodicite text, validite_inf date, validite_sup date, - * version text, id_classe text, rubrique text, rubrique_nmcl text, id_regle - * integer, - */ - private Map> regleInitiale; - /** * liste des rubriques présentes dans le fichier idSource et réutilisées dans * les phase en aval Ces rubriques "var" sont à conserver id_norme, @@ -86,16 +62,17 @@ public class NormageOperation { private NormageDao dao; + private FileIdCard fileIdCard; + // deprecated but requires patch in clients database public static final String JOINXML_STRUCTURE_BLOCK = "\n -- structure\n"; - public NormageOperation(Connection connection, Map> pil, Map> regle, + public NormageOperation(Connection connection, FileIdCard fileIdCard, Map> rubriqueUtiliseeDansRegles, String tableSource, String tableDestination, String paramBatch) { super(); this.connection = connection; - this.pilotageIdSource = pil; - this.regleInitiale = regle; + this.fileIdCard = fileIdCard; this.rubriqueUtiliseeDansRegles = rubriqueUtiliseeDansRegles; this.tableSource = tableSource; this.tableDestination = tableDestination; @@ -109,12 +86,12 @@ public void executeEngine() throws ArcException { public void execute() throws ArcException { - String jointure = pilotageIdSource.get("jointure").get(0); + String jointure = fileIdCard.getJointure(); if (jointure == null || jointure.equals("")) { simpleExecutionWithNoJoinDefined(); } else { - complexExecutionWithJoinDefined(jointure); + complexExecutionWithJoinDefined(); } } @@ -185,31 +162,10 @@ private void simpleExecutionWithNoJoinDefined() throws ArcException { * @param jointure * @throws ArcException */ - private void complexExecutionWithJoinDefined(String jointure) throws ArcException { - // variables locales - String idSource = pilotageIdSource.get(ColumnEnum.ID_SOURCE.getColumnName()).get(0); - String norme = pilotageIdSource.get("id_norme").get(0); - Date validite; - try { - validite = this.formatter.parse(pilotageIdSource.get(ColumnEnum.VALIDITE.getColumnName()).get(0)); - } catch (ParseException e) { - throw new ArcException(e, ArcExceptionMessage.NORMAGE_VALIDITE_DATE_PARSE_FAILED, - pilotageIdSource.get("validite").get(0)); - } - String periodicite = pilotageIdSource.get("periodicite").get(0); - String validiteText = pilotageIdSource.get("validite").get(0); + private void complexExecutionWithJoinDefined() throws ArcException { - Map> regle = new HashMap<>(); - - for (String key : regleInitiale.keySet()) { - List al = new ArrayList<>(); - for (String val : regleInitiale.get(key)) { - al.add(val); - } - regle.put(key, al); - } - - String subJoin = jointure.split(JOINXML_STRUCTURE_BLOCK)[0].toLowerCase(); + // rework jointure to keep structure only + this.fileIdCard.setJointure(this.fileIdCard.getJointure().split(JOINXML_STRUCTURE_BLOCK)[0].toLowerCase()); // ORDRE IMPORTANT // on supprime les rubriques inutilisées quand le service est invoqué en batch @@ -217,36 +173,33 @@ private void complexExecutionWithJoinDefined(String jointure) throws ArcExceptio // pour que les gens qui testent en bac à sable puissent utiliser toutes les // rubriques if (paramBatch != null) { - SuppressionRulesQueryBuilder.ajouterRegleSuppression(regle, norme, periodicite, subJoin, - rubriqueUtiliseeDansRegles); + SuppressionRulesQueryBuilder.ajouterRegleSuppression(fileIdCard, rubriqueUtiliseeDansRegles); - subJoin = SuppressionRulesQueryBuilder.appliquerRegleSuppression(regle, norme, validite, periodicite, - subJoin); + this.fileIdCard.setJointure(SuppressionRulesQueryBuilder.appliquerRegleSuppression(fileIdCard)); } - DuplicationRulesRegleQueryBuilder.ajouterRegleDuplication(regle, norme, validite, periodicite, subJoin); + DuplicationRulesRegleQueryBuilder.ajouterRegleDuplication(fileIdCard); - subJoin = DuplicationRulesRegleQueryBuilder.appliquerRegleDuplication(regle, norme, validite, periodicite, - subJoin, columnToBeAdded); + this.fileIdCard + .setJointure(DuplicationRulesRegleQueryBuilder.appliquerRegleDuplication(fileIdCard, columnToBeAdded)); - IndependanceRulesQueryBuilder.ajouterRegleIndependance(regle, norme, validite, periodicite, subJoin); + IndependanceRulesQueryBuilder.ajouterRegleIndependance(fileIdCard); - subJoin = IndependanceRulesQueryBuilder.appliquerRegleIndependance(regle, norme, validite, periodicite, - subJoin); + this.fileIdCard.setJointure(IndependanceRulesQueryBuilder.appliquerRegleIndependance(fileIdCard)); - subJoin = EngineRulesQueryBuilder.appliquerRegleUnicite(regle, subJoin); + this.fileIdCard.setJointure(EngineRulesQueryBuilder.appliquerRegleUnicite(fileIdCard)); - subJoin = RelationRulesQueryBuilder.appliquerRegleRelation(regle, subJoin); + this.fileIdCard.setJointure(RelationRulesQueryBuilder.appliquerRegleRelation(fileIdCard)); - subJoin = optimisation(subJoin); + this.fileIdCard.setJointure(optimisation(fileIdCard)); - executerJointure(regle, norme, validite, periodicite, subJoin, validiteText, idSource); + executerJointure(fileIdCard); } - private String optimisation(String jointure) { + private String optimisation(FileIdCard fileIdCard) { // on enleve l'id - String r = jointure; + String r = fileIdCard.getJointure(); r = " \n " + r; boolean blocInsert = false; @@ -295,7 +248,7 @@ private String optimisation(String jointure) { StringBuilder analyze = new StringBuilder(); Pattern p = Pattern.compile("create temporary table ([^ ]+) as "); - Matcher m = p.matcher(jointure); + Matcher m = p.matcher(fileIdCard.getJointure()); while (m.find()) { analyze.append("\n analyze " + m.group(1) + ";"); } @@ -340,28 +293,26 @@ private ArcPreparedStatementBuilder applyQueryPlanParametersOnJointure(ArcPrepar * @return * @throws ArcException */ - private void executerJointure(Map> regle, String norme, Date validite, String periodicite, - String jointure, String validiteText, String idSource) throws ArcException { - - StaticLoggerDispatcher.info(LOGGER, "Normage avec jointure sans partition sur "+idSource); + private void executerJointure(FileIdCard fileIdCard) throws ArcException { + + StaticLoggerDispatcher.info(LOGGER, "Normage avec jointure sans partition sur " + fileIdCard.getIdSource()); + + List reglesPartition = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.PARTITION); + + // only first partition rule is processed - for (int j = 0; j < regle.get("id_regle").size(); j++) { - String type = regle.get("id_classe").get(j); - if (type.equals("partition")) { - - String element = regle.get("rubrique").get(j); - int minSize = Integer.parseInt(regle.get("rubrique_nmcl").get(j).split(",")[0]); - int chunkSize = Integer.parseInt(regle.get("rubrique_nmcl").get(j).split(",")[1]); - executerJointureWithPartition(regle, norme, validite, periodicite, jointure, validiteText, idSource, - element, minSize, chunkSize); - return; - } + for (int j = 0; j < reglesPartition.size(); j++) { + + String element = reglesPartition.get(j).getRubrique(); + int minSize = Integer.parseInt(reglesPartition.get(j).getRubriqueNmcl().split(",")[0]); + int chunkSize = Integer.parseInt(reglesPartition.get(j).getRubriqueNmcl().split(",")[1]); + executerJointureWithPartition(fileIdCard, element, minSize, chunkSize); } // No partition found; normal execution UtilitaireDao.get(0).executeImmediate(connection, applyQueryPlanParametersOnJointure( - replaceQueryParameters(jointure, norme, validite, periodicite, jointure, validiteText, idSource))); + replaceQueryParameters(fileIdCard.getJointure() ,fileIdCard))); } @@ -382,16 +333,15 @@ private void executerJointure(Map> regle, String norme, Dat * @param chunkSize * @throws ArcException */ - private void executerJointureWithPartition(Map> regle, String norme, Date validite, - String periodicite, String jointure, String validiteText, String idSource, String element, int minSize, + private void executerJointureWithPartition(FileIdCard fileIdCard, String element, int minSize, int chunkSize) throws ArcException { - - StaticLoggerDispatcher.info(LOGGER, "Normage avec jointure et partition "+idSource); - + + StaticLoggerDispatcher.info(LOGGER, "Normage avec jointure et partition " + fileIdCard.getIdSource()); + /* get the query blocks */ - String blocCreate = ManipString.substringBeforeFirst(jointure, "\n insert into {table_destination} "); + String blocCreate = ManipString.substringBeforeFirst(fileIdCard.getJointure(), "\n insert into {table_destination} "); String blocInsert = "\n insert into {table_destination} " - + ManipString.substringAfterFirst(jointure, "\n insert into {table_destination} "); + + ManipString.substringAfterFirst(fileIdCard.getJointure(), "\n insert into {table_destination} "); // rework create block to get the number of record in partition if the rubrique // is found @@ -412,8 +362,8 @@ private void executerJointureWithPartition(Map> regle, Stri blocCreate = blocCreate + "select 0"; } - blocCreate = replaceQueryParameters(blocCreate, norme, validite, periodicite, jointure, validiteText, idSource); - blocInsert = replaceQueryParameters(blocInsert, norme, validite, periodicite, jointure, validiteText, idSource); + blocCreate = replaceQueryParameters(blocCreate, fileIdCard); + blocInsert = replaceQueryParameters(blocInsert, fileIdCard); int total = UtilitaireDao.get(0).getInt(connection, new ArcPreparedStatementBuilder(blocCreate)); @@ -425,7 +375,6 @@ private void executerJointureWithPartition(Map> regle, Stri // rename the table to split dao.execQueryRenamePartitionTable(partitionTableName, partitionTableNameWithAllRecords); - ArcPreparedStatementBuilder query = new ArcPreparedStatementBuilder(); query.append("\n drop table if exists " + partitionTableName + ";"); query.append("\n create temporary table " + partitionTableName + " as "); @@ -460,11 +409,10 @@ private void executerJointureWithPartition(Map> regle, Stri } } - private String replaceQueryParameters(String query, String norme, Date validite, String periodicite, - String jointure, String validiteText, String idSource) { + private String replaceQueryParameters(String query, FileIdCard fileIdCard) { return query.replace("{table_source}", tableSource).replace("{table_destination}", tableDestination) - .replace("{id_norme}", norme).replace("{validite}", validiteText).replace("{periodicite}", periodicite) - .replace("{nom_fichier}", idSource); + .replace("{id_norme}", fileIdCard.getIdNorme()).replace("{validite}", fileIdCard.getValidite()).replace("{periodicite}", fileIdCard.getPeriodicite()) + .replace("{nom_fichier}", fileIdCard.getIdSource()); } } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java new file mode 100644 index 000000000..27dfcf03c --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java @@ -0,0 +1,52 @@ +package fr.insee.arc.core.service.p3normage.operation; + +import java.sql.Connection; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import fr.insee.arc.core.dataobjects.ColumnEnum; +import fr.insee.arc.core.dataobjects.ViewEnum; +import fr.insee.arc.core.service.global.bo.FileIdCard; +import fr.insee.arc.core.service.global.dao.RulesOperations; +import fr.insee.arc.core.service.p3normage.bo.IdCardNormage; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; +import fr.insee.arc.utils.exception.ArcException; + +public class NormageRulesOperation { + + private NormageRulesOperation() { + throw new IllegalStateException("Utility class"); + } + + /** + * Méthode pour savoir retrouver quels sont les normages relatifs à la norme + * fourni dans fileIdCard + * + * @param norme + * @return l'objet Norme avec les règles de normage renseignées + * @throws ArcException + * @throws ArcException si aucune règle n'est trouvée + */ + public static void fillNormageRules(Connection connection, String envExecution, FileIdCard fileIdCard) + throws ArcException { + + Map> regle = RulesOperations.getBean(connection, + RulesOperations.getRegles(ViewEnum.NORMAGE_REGLE.getFullName(envExecution), fileIdCard)); + + List listRegles = new ArrayList<>(); + for(int i = 0; i < regle.get(ColumnEnum.ID_CLASSE.getColumnName()).size(); i++) { + listRegles.add(new RegleNormage( + TypeNormage.valueOf(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(0)), + regle.get(ColumnEnum.RUBRIQUE.getColumnName()).get(0), + regle.get(ColumnEnum.RUBRIQUE_NMCL.getColumnName()).get(0) + )); + } + + + fileIdCard.setIdCardNormage( + new IdCardNormage(listRegles)); + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/DuplicationRulesRegleQueryBuilder.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/DuplicationRulesRegleQueryBuilder.java index 306f2aa26..9cd8f3d36 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/DuplicationRulesRegleQueryBuilder.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/DuplicationRulesRegleQueryBuilder.java @@ -11,7 +11,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p3normage.bo.JoinParser; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.ManipString; @@ -20,7 +23,6 @@ public class DuplicationRulesRegleQueryBuilder { private static final Logger LOGGER = LogManager.getLogger(DuplicationRulesRegleQueryBuilder.class); - /** * Ajouter les règles de duplication si dans une relation, je trouve un "." dans * une rubrique de nomenclature, j'ordonne la duplication et je rectifie la @@ -33,220 +35,210 @@ public class DuplicationRulesRegleQueryBuilder { * @param jointure * @throws ArcException */ - public static void ajouterRegleDuplication(Map> regle, String norme, Date validite, - String periodicite, String jointure) { + public static void ajouterRegleDuplication(FileIdCard fileIdCard) { StaticLoggerDispatcher.info(LOGGER, "ajouterRegleDuplication()"); // pour toutes les règles de relation, - for (int j = 0; j < regle.get("id_regle").size(); j++) { - String type = regle.get("id_classe").get(j); + + List reglesRelation = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.RELATION); + + for (int j = 0; j < reglesRelation.size(); j++) { // en gros on parcours les regles de relation // on va exclure les bloc en relation des blocs à calculer comme indépendants - if (type.equals("relation")) { - String rubrique = regle.get("rubrique").get(j).toLowerCase(); - String rubriqueNmcl = regle.get("rubrique_nmcl").get(j).toLowerCase(); - - String rub = ManipString.substringAfterFirst(rubriqueNmcl, "."); - String alias = ManipString.substringBeforeFirst(rubriqueNmcl, "."); - - // la duplication ne peut se faire que : - // 1- sur une rubrique de nomenclature - // 2- si les rubriques existent dans la requete initiale - // 3- l'alias = la chaine avant le point de la rubrique nomenclature - if (rubriqueNmcl.contains(".") && jointure.contains(" " + rubrique + " ") - && jointure.contains(" " + rub + " ")) { - - // modifier la regle de rubrique_nmcl : alias.rubrique devient rubrique_alias - regle.get("rubrique_nmcl").set(j, rub + "_" + alias); - - // ajout de la règle - regle.get("id_regle").add("G" + System.currentTimeMillis()); - regle.get("id_norme").add(norme); - regle.get("periodicite").add(periodicite); - regle.get("validite_inf").add("1900-01-01"); - regle.get("validite_sup").add("3000-01-01"); - regle.get("id_classe").add("duplication"); - regle.get("rubrique").add(rub); - regle.get("rubrique_nmcl").add(alias); - } + String rubrique = reglesRelation.get(j).getRubrique().toLowerCase(); + String rubriqueNmcl = reglesRelation.get(j).getRubriqueNmcl().toLowerCase(); + + String rub = ManipString.substringAfterFirst(rubriqueNmcl, "."); + String alias = ManipString.substringBeforeFirst(rubriqueNmcl, "."); + // la duplication ne peut se faire que : + // 1- sur une rubrique de nomenclature + // 2- si les rubriques existent dans la requete initiale + // 3- l'alias = la chaine avant le point de la rubrique nomenclature + if (rubriqueNmcl.contains(".") && fileIdCard.getJointure().contains(" " + rubrique + " ") + && fileIdCard.getJointure().contains(" " + rub + " ")) { + + // modifier la regle de rubrique_nmcl : alias.rubrique devient rubrique_alias + + reglesRelation.get(j).setRubriqueNmcl(rub + "_" + alias); + + // ajout de la règle + fileIdCard.getIdCardNormage().addRegleNormage(new RegleNormage(TypeNormage.DUPLICATION, rub, alias)); } + } - if (type.equals("unicité")) { - String rubrique = regle.get("rubrique").get(j).toLowerCase(); + List reglesUnicite = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.UNICITE); - String rub = ManipString.substringAfterFirst(rubrique, "."); - String alias = ManipString.substringBeforeFirst(rubrique, "."); + for (int j = 0; j < reglesUnicite.size(); j++) { - // la duplication ne peut se faire que : - // 1- sur une rubrique de nomenclature - // 2- si les rubriques existent dans la requete initiale - // 3- l'alias = la chaine avant le point de la rubrique nomenclature - if (rubrique.contains(".")) { - // modifier la regle de rubrique : alias.rubrique devient rubrique_alias - regle.get("rubrique").set(j, rub + "_" + alias); + String rubrique = reglesUnicite.get(j).getRubrique().toLowerCase(); - } + String rub = ManipString.substringAfterFirst(rubrique, "."); + String alias = ManipString.substringBeforeFirst(rubrique, "."); + // la duplication ne peut se faire que : + // 1- sur une rubrique de nomenclature + // 2- si les rubriques existent dans la requete initiale + // 3- l'alias = la chaine avant le point de la rubrique nomenclature + if (rubrique.contains(".")) { + // modifier la regle de rubrique : alias.rubrique devient rubrique_alias + reglesUnicite.get(j).setRubrique(rub + "_" + alias); } } } - - public static String appliquerRegleDuplication(Map> regle, String norme, Date validite, - String periodicite, String jointure, StringBuilder columnToBeAdded) { + + public static String appliquerRegleDuplication(FileIdCard fileIdCard, StringBuilder columnToBeAdded) { StaticLoggerDispatcher.info(LOGGER, "appliquerRegleDuplication()"); - String returned = jointure; + String returned = fileIdCard.getJointure(); String blocCreate = ManipString.substringBeforeFirst(returned, "\n insert into {table_destination}"); String blocInsert = " insert into {table_destination} " + ManipString.substringAfterFirst(returned, "insert into {table_destination} "); - for (int j = 0; j < regle.get("id_regle").size(); j++) { + List reglesDuplication = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.DUPLICATION); - String type = regle.get("id_classe").get(j); + for (int j = 0; j < reglesDuplication.size(); j++) { - if (type.equals("duplication")) { - String rubrique = regle.get("rubrique").get(j).toLowerCase(); - String alias = regle.get("rubrique_nmcl").get(j).toLowerCase(); + String rubrique = reglesDuplication.get(j).getRubrique().toLowerCase(); + String alias = reglesDuplication.get(j).getRubriqueNmcl().toLowerCase(); - // retrouver la table qui doit faire l'objet d'une duplication - String rubriqueM = JoinParser.getM(blocCreate, rubrique); + // retrouver la table qui doit faire l'objet d'une duplication + String rubriqueM = JoinParser.getM(blocCreate, rubrique); - // si on trouve une rubrique mère - if (rubriqueM != null) { - List aTraiter = JoinParser.getChildrenTree(blocCreate, rubriqueM); - aTraiter.add(0, rubriqueM); + // si on trouve une rubrique mère + if (rubriqueM != null) { + List aTraiter = JoinParser.getChildrenTree(blocCreate, rubriqueM); + aTraiter.add(0, rubriqueM); - StringBuilder blocCreateNew = new StringBuilder(); - StringBuilder blocInsertNew = new StringBuilder(); - Set colonnesAAjouter = new HashSet<>(); + StringBuilder blocCreateNew = new StringBuilder(); + StringBuilder blocInsertNew = new StringBuilder(); + Set colonnesAAjouter = new HashSet<>(); - String[] lines = blocCreate.split("\n"); - for (int i = 0; i < lines.length; i++) { - String rubriqueLine = JoinParser.getM(lines[i]); - String pereLine = JoinParser.getFather(lines[i]); - String tableLine = JoinParser.getTable(lines[i]); + String[] lines = blocCreate.split("\n"); + for (int i = 0; i < lines.length; i++) { + String rubriqueLine = JoinParser.getM(lines[i]); + String pereLine = JoinParser.getFather(lines[i]); + String tableLine = JoinParser.getTable(lines[i]); - if (aTraiter.contains(rubriqueLine)) { - String pattern = " as ([^ ()]*) "; + if (aTraiter.contains(rubriqueLine)) { + String pattern = " as ([^ ()]*) "; - // on a trouvé et on effectue les remplacements - // on remplace le nom des colonnes (ajout de l'alias) avant le premier from - // on remplace le nom de la table (ajout de l'alias) - String newLine = ManipString.substringBeforeFirst(lines[i], " from ") - .replaceAll(pattern, " as $1_" + alias + " ") - .replace(" " + tableLine + " ", " " + tableLine + "_" + alias + " ") + " from " - + ManipString.substringAfterFirst(lines[i], " from "); - - // - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(ManipString.substringBeforeFirst(lines[i], " from ")); - while (m.find()) { - colonnesAAjouter.add(m.group(1) + "_" + alias); - } + // on a trouvé et on effectue les remplacements + // on remplace le nom des colonnes (ajout de l'alias) avant le premier from + // on remplace le nom de la table (ajout de l'alias) + String newLine = ManipString.substringBeforeFirst(lines[i], " from ") + .replaceAll(pattern, " as $1_" + alias + " ") + .replace(" " + tableLine + " ", " " + tableLine + "_" + alias + " ") + " from " + + ManipString.substringAfterFirst(lines[i], " from "); - // cas particulier : ne pas changer le pere de la table maitre à dupliquer - // on ne change le pere que pour les tables enfants + // + Pattern p = Pattern.compile(pattern); + Matcher m = p.matcher(ManipString.substringBeforeFirst(lines[i], " from ")); + while (m.find()) { + colonnesAAjouter.add(m.group(1) + "_" + alias); + } - if (aTraiter.indexOf(rubriqueLine) == 0) { - newLine = newLine.replace(" as " + pereLine + "_" + alias + " ", - " as " + pereLine + " "); - colonnesAAjouter.remove(pereLine + "_" + alias); - } + // cas particulier : ne pas changer le pere de la table maitre à dupliquer + // on ne change le pere que pour les tables enfants - blocCreateNew.append(newLine + "\n"); - blocCreateNew.append("create temporary table " + tableLine + "_" + alias - + "_null as (select * from " + tableLine + "_" + alias + " where false); " + "\n"); + if (aTraiter.indexOf(rubriqueLine) == 0) { + newLine = newLine.replace(" as " + pereLine + "_" + alias + " ", " as " + pereLine + " "); + colonnesAAjouter.remove(pereLine + "_" + alias); } - blocCreateNew.append(lines[i] + "\n"); + blocCreateNew.append(newLine + "\n"); + blocCreateNew.append("create temporary table " + tableLine + "_" + alias + + "_null as (select * from " + tableLine + "_" + alias + " where false); " + "\n"); + } - for (String c : colonnesAAjouter) { - c = JoinParser.mToI(c); + blocCreateNew.append(lines[i] + "\n"); + + for (String c : colonnesAAjouter) { + c = JoinParser.mToI(c); - if (!blocCreate.contains(" add " + c + " ") - && !blocCreateNew.toString().contains(" add " + c + " ")) { - if (c.startsWith("i_")) { - String addCol = "do $$ begin alter table {table_destination} add " + c - + " integer; exception when others then end; $$;"; - if (!columnToBeAdded.toString().contains(addCol)) { - columnToBeAdded.append(addCol); - } - } else { - String addCol = "do $$ begin alter table {table_destination} add " + c - + " text; exception when others then end; $$;"; - if (!columnToBeAdded.toString().contains(addCol)) { - columnToBeAdded.append(addCol); - } + if (!blocCreate.contains(" add " + c + " ") + && !blocCreateNew.toString().contains(" add " + c + " ")) { + if (c.startsWith("i_")) { + String addCol = "do $$ begin alter table {table_destination} add " + c + + " integer; exception when others then end; $$;"; + if (!columnToBeAdded.toString().contains(addCol)) { + columnToBeAdded.append(addCol); + } + } else { + String addCol = "do $$ begin alter table {table_destination} add " + c + + " text; exception when others then end; $$;"; + if (!columnToBeAdded.toString().contains(addCol)) { + columnToBeAdded.append(addCol); } } } - } - blocCreate = blocCreateNew.toString(); + } - // bloc insert - // faut ajouter les variables et les relations + blocCreate = blocCreateNew.toString(); - lines = blocInsert.split("\n"); - for (int i = 0; i < lines.length; i++) { - // insertion des variables - blocInsertNew.append(lines[i]); + // bloc insert + // faut ajouter les variables et les relations - // ligne des inserts - // la colonne m_ devient i_ - if (i == 0) { - for (String c : colonnesAAjouter) { - c = JoinParser.mToI(c); - if (!lines[i].contains("," + c)) { - blocInsertNew.append("," + c); - } + lines = blocInsert.split("\n"); + for (int i = 0; i < lines.length; i++) { + // insertion des variables + blocInsertNew.append(lines[i]); + + // ligne des inserts + // la colonne m_ devient i_ + if (i == 0) { + for (String c : colonnesAAjouter) { + c = JoinParser.mToI(c); + if (!lines[i].contains("," + c)) { + blocInsertNew.append("," + c); } } + } - // ligne du select - // on ne change pas m_ en i_ - if (i == 3) { - for (String c : colonnesAAjouter) { - if (!lines[i].contains("," + c)) { - blocInsertNew.append("," + c); - } + // ligne du select + // on ne change pas m_ en i_ + if (i == 3) { + for (String c : colonnesAAjouter) { + if (!lines[i].contains("," + c)) { + blocInsertNew.append("," + c); } } + } - blocInsertNew.append("\n"); - - // ajout de la relation - if (i > 3) { - for (int k = 0; k < aTraiter.size(); k++) { - if (lines[i].contains(" t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + " ")) { - // remplacement du nom de la table - String newLine = lines[i] - .replace(" t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + " ", - " t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + "_" + alias + " ") - .replace("=t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + ".", - "=t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + "_" + alias + "."); - // si enfant, on change aussi le nom des variables - if (k > 0) { - newLine = newLine.replace("=", "_" + alias + "=") + "_" + alias; - } - blocInsertNew.append(newLine + "\n"); + blocInsertNew.append("\n"); + + // ajout de la relation + if (i > 3) { + for (int k = 0; k < aTraiter.size(); k++) { + if (lines[i].contains(" t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + " ")) { + // remplacement du nom de la table + String newLine = lines[i] + .replace(" t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + " ", + " t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + "_" + alias + + " ") + .replace("=t_" + JoinParser.getCoreVariableName(aTraiter.get(k)) + ".", "=t_" + + JoinParser.getCoreVariableName(aTraiter.get(k)) + "_" + alias + "."); + // si enfant, on change aussi le nom des variables + if (k > 0) { + newLine = newLine.replace("=", "_" + alias + "=") + "_" + alias; } + blocInsertNew.append(newLine + "\n"); } - } } - blocInsert = blocInsertNew.toString(); } + + blocInsert = blocInsertNew.toString(); } } @@ -254,5 +246,5 @@ public static String appliquerRegleDuplication(Map> regle, return returned; } - + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/EngineRulesQueryBuilder.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/EngineRulesQueryBuilder.java index c5b728ec4..23b4cc47f 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/EngineRulesQueryBuilder.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/EngineRulesQueryBuilder.java @@ -1,12 +1,14 @@ package fr.insee.arc.core.service.p3normage.querybuilder; import java.util.List; -import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p3normage.bo.JoinParser; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.ManipString; @@ -27,10 +29,10 @@ public class EngineRulesQueryBuilder { * @return * @throws ArcException */ - public static String appliquerRegleUnicite(Map> regle, String jointure) { + public static String appliquerRegleUnicite(FileIdCard fileIdCard) { StaticLoggerDispatcher.info(LOGGER, "appliquerRegleUnicite()"); - String returned = jointure; + String returned = fileIdCard.getJointure(); // extraction de la clause select String selectBase = " select " + ManipString.substringAfterLast(returned, " select "); @@ -38,12 +40,12 @@ public static String appliquerRegleUnicite(Map> regle, Stri String[] lines = returned.split("\n"); int max = lines.length - 1; + List reglesNormageUnicite = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.UNICITE); + // on parcourt maintenant les regles d'unicité - for (int j = 0; j < regle.get("id_regle").size(); j++) { - String type = regle.get("id_classe").get(j); - if (type.equals("unicité")) { + for (int j = 0; j < reglesNormageUnicite.size(); j++) { - String rubrique = regle.get("rubrique").get(j).toLowerCase(); + String rubrique = reglesNormageUnicite.get(j).getRubrique().toLowerCase(); // vérifier l'existance des rubriques if (returned.contains(" " + rubrique + " ")) { @@ -85,7 +87,7 @@ public static String appliquerRegleUnicite(Map> regle, Stri k++; } } - } + } String viewAndInsert = ""; diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/IndependanceRulesQueryBuilder.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/IndependanceRulesQueryBuilder.java index 69518282c..d71314dec 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/IndependanceRulesQueryBuilder.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/IndependanceRulesQueryBuilder.java @@ -1,7 +1,6 @@ package fr.insee.arc.core.service.p3normage.querybuilder; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -13,7 +12,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p3normage.bo.JoinParser; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.exception.ArcExceptionMessage; @@ -34,25 +36,27 @@ public class IndependanceRulesQueryBuilder { * @param jointure * @throws ArcException */ - public static void ajouterRegleIndependance(Map> regle, String norme, - Date validite, String periodicite, String jointure) { + public static void ajouterRegleIndependance(FileIdCard fileIdCard) { StaticLoggerDispatcher.info(LOGGER, "ajouterRegleIndependance()"); - String blocCreate = ManipString.substringBeforeFirst(jointure, "insert into {table_destination}"); + String blocCreate = ManipString.substringBeforeFirst(fileIdCard.getJointure(), "insert into {table_destination}"); Set rubriqueExclusion = new HashSet<>(); Map rubriquesAvecRegleDIndependance = new HashMap<>(); // pour toutes les règles de relation, - for (int j = 0; j < regle.get("id_regle").size(); j++) { + + List reglesNormage = fileIdCard.getIdCardNormage().getReglesNormage(); + + for (int j = 0; j < reglesNormage.size(); j++) { - String type = regle.get("id_classe").get(j); + TypeNormage type = reglesNormage.get(j).getTypeNormage(); // cas 1 on met en indépendant les règles en relation // en gros on parcours les regles de relation // on va exclure les bloc en relation des blocs à calculer comme indépendants - if (type.equals("relation")) { - String rubrique = regle.get("rubrique").get(j).toLowerCase(); - String rubriqueNmcl = regle.get("rubrique_nmcl").get(j).toLowerCase(); + if (type.equals(TypeNormage.RELATION)) { + String rubrique = reglesNormage.get(j).getRubrique().toLowerCase(); + String rubriqueNmcl = reglesNormage.get(j).getRubriqueNmcl().toLowerCase(); String rubriqueM = JoinParser.getM(blocCreate, rubrique); String rubriqueNmclM = JoinParser.getM(blocCreate, rubriqueNmcl); @@ -78,15 +82,15 @@ public static void ajouterRegleIndependance(Map> regle, Str // cas 3 : deux rubrique déclarées en cartesian // les rubriques déclarées en cartésian ne peuvent intégrer un groupe de // rubrique indépendante - if (type.equals("cartesian")) { - String rubrique = regle.get("rubrique").get(j).toLowerCase(); + if (type.equals(TypeNormage.CARTESIAN)) { + String rubrique = reglesNormage.get(j).getRubrique().toLowerCase(); String rubriqueM = JoinParser.getM(blocCreate, rubrique); rubriqueExclusion.add(rubriqueM); } - if (type.equals("independance")) { - String rubrique = regle.get("rubrique").get(j).toLowerCase(); - String rubriqueNmcl = regle.get("rubrique_nmcl").get(j).toLowerCase(); + if (type.equals(TypeNormage.INDEPENDANCE)) { + String rubrique = reglesNormage.get(j).getRubrique().toLowerCase(); + String rubriqueNmcl = reglesNormage.get(j).getRubriqueNmcl().toLowerCase(); rubriquesAvecRegleDIndependance.put(JoinParser.anyToM(rubrique), rubriqueNmcl); } @@ -100,8 +104,8 @@ public static void ajouterRegleIndependance(Map> regle, Str // ARC compute which rubriques are independant and set the independance rules List r = new ArrayList<>(); - addIndependanceToChildren(r, blocCreate, JoinParser.getM(blocCreate), regle, - rubriquesAvecRegleDIndependance, norme, periodicite, rubriqueExclusion); + addIndependanceToChildren(r, fileIdCard, blocCreate, JoinParser.getM(blocCreate), + rubriquesAvecRegleDIndependance, rubriqueExclusion); } @@ -116,24 +120,23 @@ public static void ajouterRegleIndependance(Map> regle, Str * @return * @throws ArcException */ - public static String appliquerRegleIndependance(Map> regle, String norme, - Date validite, String periodicite, String jointure) throws ArcException { + public static String appliquerRegleIndependance(FileIdCard fileIdCard) throws ArcException { StaticLoggerDispatcher.info(LOGGER, "appliquerRegleIndependance()"); - String returned = jointure; + String returned = fileIdCard.getJointure(); String blocCreate = ManipString.substringBeforeFirst(returned, "\n insert into {table_destination}"); String blocInsert = " insert into {table_destination} " + ManipString.substringAfterFirst(returned, "insert into {table_destination} "); - for (int j = 0; j < regle.get("id_regle").size(); j++) { - String type = regle.get("id_classe").get(j); + List reglesBlocIndependance = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.BLOC_INDEPENDANCE); + + for (int j = 0; j < reglesBlocIndependance.size(); j++) { - if (type.equals("bloc_independance")) { - String[] rubriqueRegle = regle.get("rubrique").get(j).replace(" ", "").toLowerCase().split(","); - String[] rubriqueNmclRegle = regle.get("rubrique_nmcl").get(j).replace(" ", "").toLowerCase() + String[] rubriqueRegle = reglesBlocIndependance.get(j).getRubrique().replace(" ", "").toLowerCase().split(","); + String[] rubriqueNmclRegle = reglesBlocIndependance.get(j).getRubriqueNmcl().replace(" ", "").toLowerCase() .split(","); List rubrique = new ArrayList<>(); @@ -245,7 +248,6 @@ public static String appliquerRegleIndependance(Map> regle, blocInsert = blocInsertNew.toString(); } - } } @@ -403,11 +405,11 @@ private static boolean calculerTableIndependance(StringBuilder blocRequete, bool * @param periodicite * @param exclusion */ - private static void addIndependanceToChildren(List r, String blocCreate, String mRubrique, - Map> regle, Map rubriquesAvecRegleDIndependance, - String norme, String periodicite, Set exclusion) { + private static void addIndependanceToChildren(List r, FileIdCard fileIdCard, String blocCreate, String mRubrique, Map rubriquesAvecRegleDIndependance, + Set exclusion) { + List s = JoinParser.getChildren(blocCreate, mRubrique); - + if (!s.isEmpty()) { r.addAll(s); @@ -433,20 +435,11 @@ private static void addIndependanceToChildren(List r, String blocCreate, // ne créer une regle que si y'a plus d'une rubrique retenue; sinon pas la peine if (nbRubriqueRetenue > 1) { - regle.get("id_regle").add("G" + System.currentTimeMillis()); - regle.get("id_norme").add(norme); - regle.get("periodicite").add(periodicite); - regle.get("validite_inf").add("1900-01-01"); - regle.get("validite_sup").add("3000-01-01"); - regle.get("id_classe").add("bloc_independance"); - regle.get("rubrique").add(rubriqueContent.toString()); - regle.get("rubrique_nmcl").add(rubriqueNmclContent.toString()); - + fileIdCard.getIdCardNormage().addRegleNormage(new RegleNormage(TypeNormage.BLOC_INDEPENDANCE, rubriqueContent.toString(), rubriqueNmclContent.toString())); } for (String rub : s) { - addIndependanceToChildren(r, blocCreate, rub, regle, rubriquesAvecRegleDIndependance, norme, - periodicite, exclusion); + addIndependanceToChildren(r, fileIdCard, blocCreate, rub, rubriquesAvecRegleDIndependance, exclusion); } } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/RelationRulesQueryBuilder.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/RelationRulesQueryBuilder.java index 9b10e8878..3c3f8e186 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/RelationRulesQueryBuilder.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/RelationRulesQueryBuilder.java @@ -2,12 +2,14 @@ import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p3normage.bo.JoinParser; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.ManipString; @@ -16,7 +18,6 @@ public class RelationRulesQueryBuilder { private static final Logger LOGGER = LogManager.getLogger(RelationRulesQueryBuilder.class); - /** * Modifie la requete pour appliquer les regles de relation * @@ -28,11 +29,12 @@ public class RelationRulesQueryBuilder { * @return * @throws ArcException */ - public static String appliquerRegleRelation(Map> regle, String jointure) { + public static String appliquerRegleRelation(FileIdCard fileIdCard) { StaticLoggerDispatcher.info(LOGGER, "appliquerRegleRelation()"); - String returned = jointure; + String returned = fileIdCard.getJointure(); + // extraction de la clause select String blocCreate = ManipString.substringBeforeFirst(returned, "\n insert into {table_destination}"); @@ -48,37 +50,36 @@ public static String appliquerRegleRelation(Map> regle, Str List listRubriqueNmcl = new ArrayList<>(); List listTableNmcl = new ArrayList<>(); - for (int j = 0; j < regle.get("id_regle").size(); j++) { - String type = regle.get("id_classe").get(j); - if (type.equals("relation")) { + List reglesNormageRelation = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.RELATION); - String rubrique = regle.get("rubrique").get(j).toLowerCase(); - String rubriqueNmcl = regle.get("rubrique_nmcl").get(j).toLowerCase(); + for (int j = 0; j < reglesNormageRelation.size(); j++) { - // cérifier l'existance des rubriques - if (returned.contains(" " + rubriqueNmcl + " ") && returned.contains(" " + rubrique + " ")) { - listRubrique.add(rubrique); - listRubriqueNmcl.add(rubriqueNmcl); + String rubrique = reglesNormageRelation.get(j).getRubrique().toLowerCase(); + String rubriqueNmcl = reglesNormageRelation.get(j).getRubriqueNmcl().toLowerCase(); - // parcourir les ligne pour trouver la table correpondant à la rubriqueNcml - int k = 1; - while (k <= max) { - String line = lines[k]; + // cérifier l'existance des rubriques + if (returned.contains(" " + rubriqueNmcl + " ") && returned.contains(" " + rubrique + " ")) { + listRubrique.add(rubrique); + listRubriqueNmcl.add(rubriqueNmcl); - if (line.startsWith(" ")) { - break; - } + // parcourir les ligne pour trouver la table correpondant à la rubriqueNcml + int k = 1; + while (k <= max) { + String line = lines[k]; - if (!line.startsWith("insert ") && !line.contains("$ as (select ") - && JoinParser.testRubriqueInCreate(line, rubriqueNmcl)) { - // extraction du nom de la table - listTableNmcl.add(JoinParser.getTable(line)); + if (line.startsWith(" ")) { + break; + } - break; - } + if (!line.startsWith("insert ") && !line.contains("$ as (select ") + && JoinParser.testRubriqueInCreate(line, rubriqueNmcl)) { + // extraction du nom de la table + listTableNmcl.add(JoinParser.getTable(line)); - k++; + break; } + + k++; } } } @@ -126,10 +127,13 @@ public static String appliquerRegleRelation(Map> regle, Str select = select.replace(" " + listTableNmcl.get(l) + " ", " " + listTableNmcl.get(l) + "_null ") .replace("=" + listTableNmcl.get(l) + ".", "=" + listTableNmcl.get(l) + "_null."); select = select + "\n AND NOT EXISTS (select 1 from (select distinct " + listRubriqueNmcl.get(l) - + " as g_rub," + JoinParser.getFather(JoinParser.getLine(blocCreate, listRubriqueNmcl.get(l))) - + " as g_pere from " + JoinParser.getTable(blocCreate, listRubriqueNmcl.get(l)) + ") xx where " - + listRubrique.get(l) + "=g_rub and " - + JoinParser.iToM(JoinParser.getFather(JoinParser.getLine(blocCreate, listRubriqueNmcl.get(l)))) + "=g_pere) "; + + " as g_rub," + + JoinParser.getFather(JoinParser.getLine(blocCreate, listRubriqueNmcl.get(l))) + + " as g_pere from " + JoinParser.getTable(blocCreate, listRubriqueNmcl.get(l)) + + ") xx where " + listRubrique.get(l) + "=g_rub and " + + JoinParser + .iToM(JoinParser.getFather(JoinParser.getLine(blocCreate, listRubriqueNmcl.get(l)))) + + "=g_pere) "; } } @@ -160,5 +164,4 @@ public static String appliquerRegleRelation(Map> regle, Str } - } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/SuppressionRulesQueryBuilder.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/SuppressionRulesQueryBuilder.java index 81ceafcf1..bc7489204 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/SuppressionRulesQueryBuilder.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/querybuilder/SuppressionRulesQueryBuilder.java @@ -10,7 +10,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p3normage.bo.JoinParser; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.ManipString; @@ -31,8 +34,7 @@ public class SuppressionRulesQueryBuilder { * @throws ArcException */ - public static void ajouterRegleSuppression(Map> regle, String norme, - String periodicite, String jointure, Map> rubriqueUtiliseeDansRegles) + public static void ajouterRegleSuppression(FileIdCard fileIdCard, Map> rubriqueUtiliseeDansRegles) throws ArcException { // on va jouer au "qui enleve-t-on" ?? // on va parcourir les regles de normage, controle, mapping et voir @@ -47,7 +49,7 @@ public static void ajouterRegleSuppression(Map> regle, Stri listVarUtilisee.add(rubriqueUtiliseeDansRegles.get("var").get(j)); } - String[] lines0 = jointure.split("\n"); + String[] lines0 = fileIdCard.getJointure().split("\n"); int max0 = lines0.length - 1; int k0 = max0; while (k0 >= 1) { @@ -106,19 +108,14 @@ public static void ajouterRegleSuppression(Map> regle, Stri String rubriquePereBloc = JoinParser.getCoreVariableName(rubriquePere); // ajouter le bloc aux regles de suppression si pas dans la table de regle - if (!regle.get("rubrique").contains(rubriquePere) - && !regle.get("rubrique_nmcl").contains(rubriquePere) - && !regle.get("rubrique").contains(rubriquePereBloc) - && !regle.get("rubrique_nmcl").contains(rubriquePereBloc)) { + if (!fileIdCard.getIdCardNormage().isAnyRubrique(rubriquePere) + && !fileIdCard.getIdCardNormage().isAnyRubriqueNmcl(rubriquePere) + && !fileIdCard.getIdCardNormage().isAnyRubrique(rubriquePereBloc) + && !fileIdCard.getIdCardNormage().isAnyRubriqueNmcl(rubriquePereBloc) + ) { lineASupprimer.add(k0); - regle.get("id_regle").add("B"); - regle.get("id_norme").add(norme); - regle.get("periodicite").add(periodicite); - regle.get("validite_inf").add("1900-01-01"); - regle.get("validite_sup").add("3000-01-01"); - regle.get("id_classe").add("deletion"); - regle.get("rubrique").add(rubriquePereBloc); - regle.get("rubrique_nmcl").add(null); + + fileIdCard.getIdCardNormage().addRegleNormage(new RegleNormage(TypeNormage.DELETION, rubriquePereBloc, null)); } } @@ -152,21 +149,18 @@ public static void ajouterRegleSuppression(Map> regle, Stri String rubriqueV = "v_" + rubrique; if (!listVarUtilisee.contains(rubriqueI) && !listVarUtilisee.contains(rubriqueV) - && !regle.get("rubrique").contains(rubriqueI) - && !regle.get("rubrique_nmcl").contains(rubriqueI) - && !regle.get("rubrique").contains(rubriqueV) - && !regle.get("rubrique_nmcl").contains(rubriqueV) - && !regle.get("rubrique").contains(rubrique) - && !regle.get("rubrique_nmcl").contains(rubrique)) { - regle.get("id_regle").add("R"); - regle.get("id_norme").add(norme); - regle.get("periodicite").add(periodicite); - regle.get("validite_inf").add("1900-01-01"); - regle.get("validite_sup").add("3000-01-01"); - regle.get("id_classe").add("deletion"); - regle.get("rubrique").add(rubrique); - regle.get("rubrique_nmcl").add(null); - + + && !fileIdCard.getIdCardNormage().isAnyRubrique(rubriqueI) + && !fileIdCard.getIdCardNormage().isAnyRubrique(rubriqueV) + && !fileIdCard.getIdCardNormage().isAnyRubrique(rubrique) + + && !fileIdCard.getIdCardNormage().isAnyRubriqueNmcl(rubriqueI) + && !fileIdCard.getIdCardNormage().isAnyRubriqueNmcl(rubriqueV) + && !fileIdCard.getIdCardNormage().isAnyRubriqueNmcl(rubrique) + + ) { + + fileIdCard.getIdCardNormage().addRegleNormage(new RegleNormage(TypeNormage.DELETION, rubrique, null)); } } } @@ -189,23 +183,21 @@ public static void ajouterRegleSuppression(Map> regle, Stri * @return * @throws ArcException */ - public static String appliquerRegleSuppression(Map> regle, String norme, - Date validite, String periodicite, String jointure) throws ArcException { + public static String appliquerRegleSuppression(FileIdCard fileIdCard) throws ArcException { StaticLoggerDispatcher.info(LOGGER, "appliquerRegleSuppression()"); - String returned = jointure; + String returned = fileIdCard.getJointure(); // ajout des regles // parcourt des regles : faut parcourir les suppression d'abord - for (int j = 0; j < regle.get("id_regle").size(); j++) { + + List regleNormageDeletion = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.DELETION); + for (int j = 0; j < regleNormageDeletion.size(); j++) { - String type = regle.get("id_classe").get(j); - String rubrique = regle.get("rubrique").get(j).toLowerCase(); + String rubrique = regleNormageDeletion.get(j).getRubrique().toLowerCase(); - if (type.equals("deletion")) { - returned = appliquerRegleSuppressionCore(returned, rubrique); - } + returned = appliquerRegleSuppressionCore(returned, rubrique); } return returned; @@ -223,7 +215,7 @@ private static String appliquerRegleSuppressionCore(String returned, String rubr List grpAEnlever = new ArrayList<>(); List ligneAEnlever = new ArrayList<>(); - List rubriqueAEnlever = new ArrayList(); + List rubriqueAEnlever = new ArrayList<>(); // identifier les groupes a enlever de la requete identifierGroupeAEnlever(lines, rubrique, grpAEnlever, ligneAEnlever); diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java index 5adc9bac1..b5d613041 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java @@ -10,6 +10,7 @@ import fr.insee.arc.core.dataobjects.ColumnEnum; import fr.insee.arc.core.dataobjects.ViewEnum; import fr.insee.arc.core.model.TraitementEtat; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.global.dao.DatabaseConnexionConfiguration; import fr.insee.arc.core.service.global.dao.HashFileNameConversion; import fr.insee.arc.core.service.global.dao.PilotageOperations; @@ -21,239 +22,248 @@ import fr.insee.arc.core.service.global.thread.IThread; import fr.insee.arc.core.service.p3normage.ApiNormageService; import fr.insee.arc.core.service.p3normage.operation.NormageOperation; +import fr.insee.arc.core.service.p3normage.operation.NormageRulesOperation; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.dao.UtilitaireDao; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.FormatSQL; import fr.insee.arc.utils.utils.Sleep; - /** * ThreadNormageService * - * 1- créer la table des données à traiter dans le module
- * 2- calcul de la norme, validité, periodicité sur chaque ligne de la table de donnée
- * 3- déterminer pour chaque fichier si le normage s'est bien déroulé et marquer sa norme, sa validité et sa périodicité
- * 4- créer les tables OK et KO; marquer les info de normage(norme, validité, périodicité) sur chaque ligne de donnée
- * 5- transformation de table de donnée; mise à plat du fichier; suppression et relation
- * 6- mettre à jour le nombre d'enregistrement par fichier après sa transformation
- * 7- sortir les données du module vers l'application
+ * 1- créer la table des données à traiter dans le module
+ * 2- calcul de la norme, validité, periodicité sur chaque ligne de la table de + * donnée
+ * 3- déterminer pour chaque fichier si le normage s'est bien déroulé et marquer + * sa norme, sa validité et sa périodicité
+ * 4- créer les tables OK et KO; marquer les info de normage(norme, validité, + * périodicité) sur chaque ligne de donnée
+ * 5- transformation de table de donnée; mise à plat du fichier; suppression et + * relation
+ * 6- mettre à jour le nombre d'enregistrement par fichier après sa + * transformation
+ * 7- sortir les données du module vers l'application
* * @author Manuel SOULIER * */ public class ThreadNormageService extends ApiNormageService implements Runnable, IThread { - private static final Logger LOGGER = LogManager.getLogger(ThreadNormageService.class); + private static final Logger LOGGER = LogManager.getLogger(ThreadNormageService.class); + + private Thread t; + + private String tableNormageDataTemp; + private String tableNormagePilTemp; - private Thread t; - - private String tableNormageDataTemp; - private String tableNormagePilTemp; + private String tableNormageOKTemp; + private String tableNormageKOTemp; - private String tableNormageOKTemp; - private String tableNormageKOTemp; - - private String tableNormageOK; - private String tableNormageKO; + private String tableNormageOK; + private String tableNormageKO; - private String structure; + private String structure; + + private FileIdCard fileIdCard; private ThreadOperations arcThreadGenericDao; - @Override - public void configThread(ScalableConnection connexion, int currentIndice, ApiNormageService theApi) { - - this.idSource = theApi.getTabIdSource().get(ColumnEnum.ID_SOURCE.getColumnName()).get(currentIndice); - this.connexion = connexion; - - // tables du thread - - this.tableNormageDataTemp = FormatSQL.temporaryTableName("normage_data_temp"); - this.tableNormagePilTemp = FormatSQL.temporaryTableName("normage_pil_Temp"); - - this.tableNormageOKTemp = FormatSQL.temporaryTableName("ok_Temp"); - this.tableNormageKOTemp = FormatSQL.temporaryTableName("ko_Temp"); - - this.tableNormageOK = TableNaming.phaseDataTableName(theApi.getEnvExecution(), theApi.getCurrentPhase(), TraitementEtat.OK); - this.tableNormageKO = TableNaming.phaseDataTableName(theApi.getEnvExecution(), theApi.getCurrentPhase(), TraitementEtat.KO); - - // tables héritées - this.tablePil = theApi.getTablePil(); - this.tablePilTemp = theApi.getTablePilTemp(); - this.currentPhase = theApi.getCurrentPhase(); - this.tablePrevious = theApi.getTablePrevious(); - this.tabIdSource=theApi.getTabIdSource(); - this.envExecution=theApi.getEnvExecution(); - this.paramBatch=theApi.getParamBatch(); - + @Override + public void configThread(ScalableConnection connexion, int currentIndice, ApiNormageService theApi) { + + this.idSource = theApi.getTabIdSource().get(ColumnEnum.ID_SOURCE.getColumnName()).get(currentIndice); + this.connexion = connexion; + + // tables du thread + + this.tableNormageDataTemp = FormatSQL.temporaryTableName("normage_data_temp"); + this.tableNormagePilTemp = FormatSQL.temporaryTableName("normage_pil_Temp"); + + this.tableNormageOKTemp = FormatSQL.temporaryTableName("ok_Temp"); + this.tableNormageKOTemp = FormatSQL.temporaryTableName("ko_Temp"); + + this.tableNormageOK = TableNaming.phaseDataTableName(theApi.getEnvExecution(), theApi.getCurrentPhase(), + TraitementEtat.OK); + this.tableNormageKO = TableNaming.phaseDataTableName(theApi.getEnvExecution(), theApi.getCurrentPhase(), + TraitementEtat.KO); + + // tables héritées + this.tablePil = theApi.getTablePil(); + this.tablePilTemp = theApi.getTablePilTemp(); + this.currentPhase = theApi.getCurrentPhase(); + this.tablePrevious = theApi.getTablePrevious(); + this.tabIdSource = theApi.getTabIdSource(); + this.envExecution = theApi.getEnvExecution(); + this.paramBatch = theApi.getParamBatch(); + // arc thread dao - arcThreadGenericDao=new ThreadOperations(connexion, tablePil, tablePilTemp, tableNormagePilTemp, tablePrevious, paramBatch, idSource); + arcThreadGenericDao = new ThreadOperations(connexion, tablePil, tablePilTemp, tableNormagePilTemp, + tablePrevious, paramBatch, idSource); - } + } - public void start() { + public void start() { StaticLoggerDispatcher.debug(LOGGER, "Starting ThreadNormageService"); - t = new Thread(this); - t.start(); - } - - @Override - public void run() { - try { - - // créer la table des données à traiter dans le module - creerTableTravail(); - - // transformation de table de donnée; mise à plat du fichier; suppression et relation - jointureBlocXML(); - - // sortir les données du module vers l'application - insertionFinale(); - - } catch (ArcException e) { - StaticLoggerDispatcher.error(LOGGER, e); - try { - PilotageOperations.traitementSurErreur(this.connexion.getCoordinatorConnection(), this.getCurrentPhase(), this.tablePil, this.idSource, e); - } catch (ArcException e2) { - StaticLoggerDispatcher.error(LOGGER, e2); - } - Sleep.sleep(PREVENT_ERROR_SPAM_DELAY); - } - } - - - /** - * Créer la table de travail du normage Contient les donnée d'un seul id source. Cela est du au fait que le type composite varie d'un id - * source à l'autre, - * - * @throws ArcException - */ - private void creerTableTravail() throws ArcException { - StaticLoggerDispatcher.info(LOGGER, "Créer les tables images"); - ArcPreparedStatementBuilder query= arcThreadGenericDao.preparationDefaultDao(); - - // Créer la table image de la phase précédente (ajouter les colonnes qu'il faut) - // création des tables temporaires de données - query.append(TableOperations.createTableTravailIdSource(this.getTablePrevious(),this.tableNormageDataTemp, this.idSource)); - - //On indique que le normage s'est bien passé par défaut - query.append("\n UPDATE "+this.tableNormagePilTemp); - query.append("\n SET etat_traitement = '{"+TraitementEtat.OK+"}'"); - query.append("\n , phase_traitement = '"+this.currentPhase+"'"); - query.append("\n WHERE "+ColumnEnum.ID_SOURCE.getColumnName()+"='"+this.idSource+"';"); - - query.append(TableOperations.creationTableResultat(this.tableNormageDataTemp, this.tableNormageKOTemp)); - - UtilitaireDao.get(0).executeBlock(this.getConnexion().getExecutorConnection(), query.getQueryWithParameters()); - - } - - /** - * Réaliser la jointure entre les blocs XML pour mettre les fichier à plat - * Pour chaque fichier, on retravaille la requete de jointure obtenue en phase de chargement : - * 1- en supprimant les blocs définis "à supprimer" par les regles utilisateurs du normage - * 2- en ajoutant des conditions de jointures relationnelles entre 2 rubriques défini par les règle utilisateur de type "relation" dans les regles de normage - * - * Fait sur une maintenance urgente après réception des fichiers lot2 en moins de 2j ... - * La méthode devrait etre refactor (pour séparer "deletion" et "relation") - * La réécriture de la requete selon les règles utilisateurs devrait être moins adhérente à la structure de la requete issu du chargement - * (trop dépendant des mot clés ou saut de ligne pour l'instant) - * @throws ArcException - * - */ - private void jointureBlocXML() throws ArcException { - - StaticLoggerDispatcher.info(LOGGER, "jointureBlocXML()"); - - // on parcours les fichiers pour effectuer la requete de jointure avec les regles de normage - // c'est une des requete la plus couteuse de l'application (reconstitution de la structure plate à partir du modele xml) - // pour chaque fichier, on va executer sa requete - - - // récupérer les caractéristiques du fichier - Map> pil = RulesOperations.getBean(this.connexion.getExecutorConnection(),RulesOperations.getNormeAttributes(this.idSource, tableNormagePilTemp)); - - // récupéreration des règles relative au fichier pour la phase courante - Map> regle = RulesOperations.getBean(this.connexion.getExecutorConnection(),RulesOperations.getRegles(ViewEnum.NORMAGE_REGLE.getFullName(envExecution), this.tableNormagePilTemp)); - - - // récupéreration des rubriques utilisées dans règles relative au fichier pour l'ensemble des phases - - Map> rubriqueUtiliseeDansRegles=null; - - if (paramBatch!=null) - { - String tableTmpRubriqueDansregles="TMP_RUBRIQUE_DANS_REGLES"; - - StringBuilder query=new StringBuilder(); - query.append("\n DROP TABLE IF EXISTS "+tableTmpRubriqueDansregles+";"); - query.append("\n CREATE TEMPORARY TABLE "+tableTmpRubriqueDansregles+" AS "); - query.append(RulesOperations.getAllRubriquesInRegles(this.tableNormagePilTemp, ViewEnum.NORMAGE_REGLE.getFullName(envExecution), ViewEnum.CONTROLE_REGLE.getFullName(envExecution), ViewEnum.MAPPING_REGLE.getFullName(envExecution))); - UtilitaireDao.get(0).executeImmediate( - this.connexion.getExecutorConnection(), - query - ); - - rubriqueUtiliseeDansRegles = RulesOperations.getBean(this.connexion.getExecutorConnection(),RulesOperations.getRegles(tableTmpRubriqueDansregles, this.tableNormagePilTemp)); - } - - NormageOperation n=new NormageOperation(this.connexion.getExecutorConnection() , pil, regle, rubriqueUtiliseeDansRegles, this.tableNormageDataTemp, this.tableNormageOKTemp, this.paramBatch); - n.execute(); - } - - - + t = new Thread(this); + t.start(); + } + + @Override + public void run() { + try { + + // créer la table des données à traiter dans le module + creerTableTravail(); + + // transformation de table de donnée; mise à plat du fichier; suppression et + // relation + jointureBlocXML(); + + // sortir les données du module vers l'application + insertionFinale(); + + } catch (ArcException e) { + StaticLoggerDispatcher.error(LOGGER, e); + try { + PilotageOperations.traitementSurErreur(this.connexion.getCoordinatorConnection(), + this.getCurrentPhase(), this.tablePil, this.idSource, e); + } catch (ArcException e2) { + StaticLoggerDispatcher.error(LOGGER, e2); + } + Sleep.sleep(PREVENT_ERROR_SPAM_DELAY); + } + } + + /** + * Créer la table de travail du normage Contient les donnée d'un seul id source. + * Cela est du au fait que le type composite varie d'un id source à l'autre, + * + * @throws ArcException + */ + private void creerTableTravail() throws ArcException { + StaticLoggerDispatcher.info(LOGGER, "Créer les tables images"); + ArcPreparedStatementBuilder query = arcThreadGenericDao.preparationDefaultDao(); + + // Créer la table image de la phase précédente (ajouter les colonnes qu'il faut) + // création des tables temporaires de données + query.append(TableOperations.createTableTravailIdSource(this.getTablePrevious(), this.tableNormageDataTemp, + this.idSource)); + + // On indique que le normage s'est bien passé par défaut + query.append("\n UPDATE " + this.tableNormagePilTemp); + query.append("\n SET etat_traitement = '{" + TraitementEtat.OK + "}'"); + query.append("\n , phase_traitement = '" + this.currentPhase + "'"); + query.append("\n WHERE " + ColumnEnum.ID_SOURCE.getColumnName() + "='" + this.idSource + "';"); + + query.append(TableOperations.creationTableResultat(this.tableNormageDataTemp, this.tableNormageKOTemp)); + + UtilitaireDao.get(0).executeBlock(this.getConnexion().getExecutorConnection(), query.getQueryWithParameters()); + + + this.fileIdCard = RulesOperations.fileIdCardFromPilotage(this.connexion.getExecutorConnection(), + tableNormageDataTemp, this.idSource); + + NormageRulesOperation.fillNormageRules(this.connexion.getExecutorConnection(), this.envExecution, fileIdCard); + + } + + /** + * Réaliser la jointure entre les blocs XML pour mettre les fichier à plat Pour + * chaque fichier, on retravaille la requete de jointure obtenue en phase de + * chargement : 1- en supprimant les blocs définis "à supprimer" par les regles + * utilisateurs du normage 2- en ajoutant des conditions de jointures + * relationnelles entre 2 rubriques défini par les règle utilisateur de type + * "relation" dans les regles de normage + * + * Fait sur une maintenance urgente après réception des fichiers lot2 en moins + * de 2j ... La méthode devrait etre refactor (pour séparer "deletion" et + * "relation") La réécriture de la requete selon les règles utilisateurs devrait + * être moins adhérente à la structure de la requete issu du chargement (trop + * dépendant des mot clés ou saut de ligne pour l'instant) + * + * @throws ArcException + * + */ + private void jointureBlocXML() throws ArcException { + + StaticLoggerDispatcher.info(LOGGER, "jointureBlocXML()"); + + + // récupéreration des rubriques utilisées dans règles relative au fichier pour + // l'ensemble des phases + + Map> rubriqueUtiliseeDansRegles = null; + + if (paramBatch != null) { + String tableTmpRubriqueDansregles = "TMP_RUBRIQUE_DANS_REGLES"; + + StringBuilder query = new StringBuilder(); + query.append("\n DROP TABLE IF EXISTS " + tableTmpRubriqueDansregles + ";"); + query.append("\n CREATE TEMPORARY TABLE " + tableTmpRubriqueDansregles + " AS "); + query.append(RulesOperations.getAllRubriquesInRegles(this.tableNormagePilTemp, + ViewEnum.NORMAGE_REGLE.getFullName(envExecution), ViewEnum.CONTROLE_REGLE.getFullName(envExecution), + ViewEnum.MAPPING_REGLE.getFullName(envExecution))); + UtilitaireDao.get(0).executeImmediate(this.connexion.getExecutorConnection(), query); + + rubriqueUtiliseeDansRegles = RulesOperations.getBean(this.connexion.getExecutorConnection(), + RulesOperations.getRegles(tableTmpRubriqueDansregles, this.tableNormagePilTemp)); + } + + NormageOperation n = new NormageOperation(this.connexion.getExecutorConnection(), fileIdCard, + rubriqueUtiliseeDansRegles, this.tableNormageDataTemp, this.tableNormageOKTemp, this.paramBatch); + n.execute(); + } /** * Remplace les UNION ALL par des inserts + * * @param jointure * @return */ - /** - * On sort les données des tables temporaires du module vers : - les tables définitives du normage (normage_ok et normage_ko) de - * l'application - la vraie table de pilotage - la table buffer - * - * IMPORTANT : les ajouts ou mise à jours de données sur les tables de l'application doivent avoir lieu dans un même bloc de transaction - * (ACID) - * - * @throws ArcException - * - */ - private void insertionFinale() throws ArcException { - - ArcPreparedStatementBuilder query=new ArcPreparedStatementBuilder(); - - // update the number of record ans structure in the pilotage table - query.append(PilotageOperations.queryUpdateNbEnr(this.tableNormagePilTemp, this.tableNormageOKTemp, this.structure)); - - // promote the application user account to full right - query.append(DatabaseConnexionConfiguration.switchToFullRightRole()); - - String tableIdSourceOK=HashFileNameConversion.tableOfIdSource(this.tableNormageOK ,this.idSource); - query.append(TableOperations.createTableInherit(this.tableNormageOKTemp, tableIdSourceOK)); - String tableIdSourceKO=HashFileNameConversion.tableOfIdSource(this.tableNormageKO ,this.idSource); - query.append(TableOperations.createTableInherit(this.tableNormageKOTemp, tableIdSourceKO)); - - // mark file as done into global pilotage table - arcThreadGenericDao.marquageFinalDefaultDao(query); - - } + /** + * On sort les données des tables temporaires du module vers : - les tables + * définitives du normage (normage_ok et normage_ko) de l'application - la vraie + * table de pilotage - la table buffer + * + * IMPORTANT : les ajouts ou mise à jours de données sur les tables de + * l'application doivent avoir lieu dans un même bloc de transaction (ACID) + * + * @throws ArcException + * + */ + private void insertionFinale() throws ArcException { - public ScalableConnection getConnexion() { - return connexion; - } + ArcPreparedStatementBuilder query = new ArcPreparedStatementBuilder(); - public void setConnexion(ScalableConnection connexion) { - this.connexion = connexion; - } + // update the number of record ans structure in the pilotage table + query.append( + PilotageOperations.queryUpdateNbEnr(this.tableNormagePilTemp, this.tableNormageOKTemp, this.structure)); - public Thread getT() { - return t; - } - + // promote the application user account to full right + query.append(DatabaseConnexionConfiguration.switchToFullRightRole()); -} + String tableIdSourceOK = HashFileNameConversion.tableOfIdSource(this.tableNormageOK, this.idSource); + query.append(TableOperations.createTableInherit(this.tableNormageOKTemp, tableIdSourceOK)); + String tableIdSourceKO = HashFileNameConversion.tableOfIdSource(this.tableNormageKO, this.idSource); + query.append(TableOperations.createTableInherit(this.tableNormageKOTemp, tableIdSourceKO)); + // mark file as done into global pilotage table + arcThreadGenericDao.marquageFinalDefaultDao(query); + } + + public ScalableConnection getConnexion() { + return connexion; + } + + public void setConnexion(ScalableConnection connexion) { + this.connexion = connexion; + } + + public Thread getT() { + return t; + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java index 1e4605620..4f48f44e0 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java @@ -8,4 +8,27 @@ public enum ControleTypeCode { NUM, DATE, ALPHANUM, CARDINALITE, CONDITION, REGEXP, ENUM_BRUTE, ENUM_TABLE; + public static ControleTypeCode getEnum(String code) { + switch (code) { + case "NUM": + return NUM; + case "DATE": + return DATE; + case "ALPHANUM": + return ALPHANUM; + case "CARDINALITE": + return CARDINALITE; + case "CONDITION": + return CONDITION; + case "REGEXP": + return REGEXP; + case "ENUM_BRUTE": + return ENUM_BRUTE; + case "ENUM_TABLE": + return ENUM_TABLE; + default: + return null; + } + } + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/IdCardControle.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/IdCardControle.java new file mode 100644 index 000000000..119bade87 --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/IdCardControle.java @@ -0,0 +1,34 @@ +package fr.insee.arc.core.service.p4controle.bo; + +import java.util.List; +import java.util.stream.Collectors; + +public class IdCardControle { + + private List reglesControle; + + public IdCardControle(List reglesControle) { + super(); + this.reglesControle = reglesControle; + } + + public List getReglesControle() { + return reglesControle; + } + + /** + * Renvoie la liste des règles de contrôle filtrée selon le type de contrôle donné + * @param typeControle + * @return + */ + public List getReglesControle(ControleTypeCode typeControle) { + return reglesControle.stream() + .filter(r -> r.getTypeControle().equals(typeControle)) + .collect(Collectors.toList()); + } + + public void setReglesControle(List reglesControle) { + this.reglesControle = reglesControle; + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java new file mode 100644 index 000000000..eb030904b --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java @@ -0,0 +1,136 @@ +package fr.insee.arc.core.service.p4controle.bo; + +public class RegleControle { + + private ControleTypeCode typeControle; // aka id_classe + private String rubriquePere; + private String rubriqueFils; + + private String borneInf; + private String borneSup; + private String condition; + + private String preAction; // aka prétraitement SQL + + private int xsdOrdre; + private String xsdLabelFils; + private String xsdRole; + + private String seuilBloquant; // aka blocking_threshold + private String traitementLignesErreur; // aka error_row_processing + + public RegleControle(ControleTypeCode typeControle, String rubriquePere, String rubriqueFils, String borneInf, + String borneSup, String condition, String preAction, int xsdOrdre, String xsdLabelFils, String xsdRole, + String seuilBloquant, String traitementLignesErreur) { + super(); + this.typeControle = typeControle; + this.rubriquePere = rubriquePere; + this.rubriqueFils = rubriqueFils; + this.borneInf = borneInf; + this.borneSup = borneSup; + this.condition = condition; + this.preAction = preAction; + this.xsdOrdre = xsdOrdre; + this.xsdLabelFils = xsdLabelFils; + this.xsdRole = xsdRole; + this.seuilBloquant = seuilBloquant; + this.traitementLignesErreur = traitementLignesErreur; + } + + public ControleTypeCode getTypeControle() { + return typeControle; + } + + public void setTypeControle(ControleTypeCode typeControle) { + this.typeControle = typeControle; + } + + public String getRubriquePere() { + return rubriquePere; + } + + public void setRubriquePere(String rubriquePere) { + this.rubriquePere = rubriquePere; + } + + public String getRubriqueFils() { + return rubriqueFils; + } + + public void setRubriqueFils(String rubriqueFils) { + this.rubriqueFils = rubriqueFils; + } + + public String getBorneInf() { + return borneInf; + } + + public void setBorneInf(String borneInf) { + this.borneInf = borneInf; + } + + public String getBorneSup() { + return borneSup; + } + + public void setBorneSup(String borneSup) { + this.borneSup = borneSup; + } + + public String getCondition() { + return condition; + } + + public void setCondition(String condition) { + this.condition = condition; + } + + public String getPreAction() { + return preAction; + } + + public void setPreAction(String preAction) { + this.preAction = preAction; + } + + public int getXsdOrdre() { + return xsdOrdre; + } + + public void setXsdOrdre(int xsdOrdre) { + this.xsdOrdre = xsdOrdre; + } + + public String getXsdLabelFils() { + return xsdLabelFils; + } + + public void setXsdLabelFils(String xsdLabelFils) { + this.xsdLabelFils = xsdLabelFils; + } + + public String getXsdRole() { + return xsdRole; + } + + public void setXsdRole(String xsdRole) { + this.xsdRole = xsdRole; + } + + public String getSeuilBloquant() { + return seuilBloquant; + } + + public void setSeuilBloquant(String seuilBloquant) { + this.seuilBloquant = seuilBloquant; + } + + public String getTraitementLignesErreur() { + return traitementLignesErreur; + } + + public void setTraitementLignesErreur(String traitementLignesErreur) { + this.traitementLignesErreur = traitementLignesErreur; + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java new file mode 100644 index 000000000..02d26af0f --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java @@ -0,0 +1,58 @@ +package fr.insee.arc.core.service.p4controle.operation; + +import java.sql.Connection; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import fr.insee.arc.core.dataobjects.ColumnEnum; +import fr.insee.arc.core.dataobjects.ViewEnum; +import fr.insee.arc.core.service.global.bo.FileIdCard; +import fr.insee.arc.core.service.global.dao.RulesOperations; +import fr.insee.arc.core.service.p4controle.bo.ControleTypeCode; +import fr.insee.arc.core.service.p4controle.bo.IdCardControle; +import fr.insee.arc.core.service.p4controle.bo.RegleControle; +import fr.insee.arc.utils.exception.ArcException; + +public class ControleRulesOperation { + + private ControleRulesOperation() { + throw new IllegalStateException("Utility class"); + } + + /** + * Méthode pour savoir retrouver quels sont les contrôles relatifs à la norme + * fourni dans fileIdCard + * + * @param norme + * @return l'objet Norme avec les règles de contrôle renseignées + * @throws ArcException + * @throws ArcException si aucune règle n'est trouvée + */ + public static void fillControleRules(Connection connection, String envExecution, FileIdCard fileIdCard) + throws ArcException { + Map> regle = RulesOperations.getBean(connection, + RulesOperations.getRegles(ViewEnum.CONTROLE_REGLE.getFullName(envExecution), fileIdCard)); + + List listRegles = new ArrayList<>(); + for(int i = 0; i < regle.get(ColumnEnum.ID_CLASSE.getColumnName()).size(); i++) { + listRegles.add(new RegleControle( + ControleTypeCode.getEnum(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(0)), + regle.get(ColumnEnum.RUBRIQUE_PERE.getColumnName()).get(0), + regle.get(ColumnEnum.RUBRIQUE_FILS.getColumnName()).get(0), + regle.get(ColumnEnum.BORNE_INF.getColumnName()).get(0), + regle.get(ColumnEnum.BORNE_SUP.getColumnName()).get(0), + regle.get(ColumnEnum.CONDITION.getColumnName()).get(0), + regle.get(ColumnEnum.PRE_ACTION.getColumnName()).get(0), + Integer.parseInt(regle.get(ColumnEnum.XSD_ORDRE.getColumnName()).get(0)), + regle.get(ColumnEnum.XSD_LABEL_FILS.getColumnName()).get(0), + regle.get(ColumnEnum.XSD_ROLE.getColumnName()).get(0), + regle.get(ColumnEnum.BLOCKING_THRESHOLD.getColumnName()).get(0), + regle.get(ColumnEnum.ERROR_ROW_PROCESSING.getColumnName()).get(0) + )); + } + fileIdCard.setIdCardControle( + new IdCardControle(listRegles)); + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/IdCardMapping.java b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/IdCardMapping.java new file mode 100644 index 000000000..f3a838a55 --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/IdCardMapping.java @@ -0,0 +1,22 @@ +package fr.insee.arc.core.service.p5mapping.bo; + +import java.util.List; + +public class IdCardMapping { + + private List reglesMapping; + + public IdCardMapping(List reglesMapping) { + super(); + this.reglesMapping = reglesMapping; + } + + public List getReglesMapping() { + return reglesMapping; + } + + public void setReglesMapping(List reglesMapping) { + this.reglesMapping = reglesMapping; + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/RegleMapping.java b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/RegleMapping.java new file mode 100644 index 000000000..c3fda07f7 --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/bo/RegleMapping.java @@ -0,0 +1,30 @@ +package fr.insee.arc.core.service.p5mapping.bo; + +public class RegleMapping { + + private String variableSortie; + private String exprRegleCol; // aka expression SQL + + public RegleMapping(String variableSortie, String exprRegleCol) { + super(); + this.variableSortie = variableSortie; + this.exprRegleCol = exprRegleCol; + } + + public String getVariableSortie() { + return variableSortie; + } + + public void setVariableSortie(String variableSortie) { + this.variableSortie = variableSortie; + } + + public String getExprRegleCol() { + return exprRegleCol; + } + + public void setExprRegleCol(String exprRegleCol) { + this.exprRegleCol = exprRegleCol; + } + +} diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java new file mode 100644 index 000000000..40258dbf5 --- /dev/null +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java @@ -0,0 +1,47 @@ +package fr.insee.arc.core.service.p5mapping.operation; + +import java.sql.Connection; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import fr.insee.arc.core.dataobjects.ColumnEnum; +import fr.insee.arc.core.dataobjects.ViewEnum; +import fr.insee.arc.core.service.global.bo.FileIdCard; +import fr.insee.arc.core.service.global.dao.RulesOperations; +import fr.insee.arc.core.service.p5mapping.bo.IdCardMapping; +import fr.insee.arc.core.service.p5mapping.bo.RegleMapping; +import fr.insee.arc.utils.exception.ArcException; + +public class MappingRulesOperation { + + private MappingRulesOperation() { + throw new IllegalStateException("Utility class"); + } + + /** + * Méthode pour savoir retrouver quels sont les mappings relatifs à la norme + * fourni dans fileIdCard + * + * @param norme + * @return l'objet Norme avec les règles de mapping renseignées + * @throws ArcException + * @throws ArcException si aucune règle n'est trouvée + */ + public static void fillMappingRules(Connection connection, String envExecution, FileIdCard fileIdCard) + throws ArcException { + Map> regle = RulesOperations.getBean(connection, + RulesOperations.getRegles(ViewEnum.MAPPING_REGLE.getFullName(envExecution), fileIdCard)); + + List listRegles = new ArrayList<>(); + for(int i = 0; i < regle.get(ColumnEnum.VARIABLE_SORTIE.getColumnName()).size(); i++) { + listRegles.add(new RegleMapping( + regle.get(ColumnEnum.VARIABLE_SORTIE.getColumnName()).get(0), + regle.get(ColumnEnum.EXPR_REGLE_COL.getColumnName()).get(0) + )); + } + fileIdCard.setIdCardMapping( + new IdCardMapping(listRegles)); + } + +} diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/operation/ChargementRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/operation/ChargementRulesOperationTest.java new file mode 100644 index 000000000..e9bc7f78c --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/operation/ChargementRulesOperationTest.java @@ -0,0 +1,67 @@ +package fr.insee.arc.core.service.p2chargement.operation; + +import static org.junit.Assert.assertEquals; + +import java.sql.Connection; + +import org.junit.Test; + +import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder; +import fr.insee.arc.core.service.global.bo.FileIdCard; +import fr.insee.arc.core.service.p2chargement.bo.IdCardChargement; +import fr.insee.arc.core.service.p2chargement.factory.TypeChargement; +import fr.insee.arc.utils.dao.SQL; +import fr.insee.arc.utils.dao.UtilitaireDao; +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.query.TestDatabase; + +public class ChargementRulesOperationTest { + + public static UtilitaireDao u = UtilitaireDao.get(0); + + public static Connection c = new TestDatabase().testConnection; + + @Test + public void fillChargementRulesTest() throws ArcException { + // insert test data + u.executeImmediate(c, "DROP SCHEMA IF EXISTS arc_bas1 CASCADE;"); + u.executeImmediate(c, "CREATE SCHEMA IF NOT EXISTS arc_bas1;"); + ArcPreparedStatementBuilder query = new ArcPreparedStatementBuilder(); + query.build("CREATE TABLE arc_bas1.chargement_regle (\r\n" + + " id_regle int8 NULL,\r\n" + + " id_norme text NULL,\r\n" + + " validite_inf date NULL,\r\n" + + " validite_sup date NULL,\r\n" + + " \"version\" text NULL,\r\n" + + " periodicite text NULL,\r\n" + + " type_fichier text NULL,\r\n" + + " \"delimiter\" text NULL,\r\n" + + " format text NULL,\r\n" + + " commentaire text NULL\r\n" + + ")\r\n" + + "WITH (\r\n" + + " autovacuum_enabled=false\r\n" + + ");"); + query.build(SQL.INSERT_INTO, "arc_bas1.chargement_regle", SQL.VALUES, "(1, 'TEST', '2020-01-01', '2025-01-01', 'v01', 'A', 'plat', 'E''\1''', 'WIN1252', '')", SQL.END_QUERY); + // hors calendrier + query.build(SQL.INSERT_INTO, "arc_bas1.chargement_regle", SQL.VALUES, "(1, 'TEST', '1998-01-01', '2020-01-01', 'v01', 'A', 'plat', 'separator_invalid', 'WIN1252', '')", SQL.END_QUERY); + // norme différente + query.build(SQL.INSERT_INTO, "arc_bas1.chargement_regle", SQL.VALUES, "(1, 'FAKE_NORM', '2020-01-01', '2025-01-01', 'v01', 'A', 'plat', 'separator_invalid', 'WIN1252', '')", SQL.END_QUERY); + // périodicité différente + query.build(SQL.INSERT_INTO, "arc_bas1.chargement_regle", SQL.VALUES, "(1, 'TEST', '2020-01-01', '2025-01-01', 'v01', 'M', 'plat', 'separator_invalid', 'WIN1252', '')", SQL.END_QUERY); + u.executeRequest(c, query); + // prepare fileidcard object + FileIdCard fileIdCard = new FileIdCard("TEST"); + fileIdCard.setIdNorme("TEST"); + fileIdCard.setValidite("2022-01-01"); + fileIdCard.setPeriodicite("A"); + // method to test + ChargementRulesOperation.fillChargementRules(c, "arc_bas1", fileIdCard); + // assertions + IdCardChargement regleChargement = fileIdCard.getIdCardChargement(); + assertEquals(TypeChargement.PLAT, regleChargement.getTypeChargement()); + assertEquals("WIN1252", regleChargement.getFormat()); + assertEquals("E'\1'", regleChargement.getDelimiter()); + } + +} diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperationTest.java new file mode 100644 index 000000000..01073a988 --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperationTest.java @@ -0,0 +1,73 @@ +package fr.insee.arc.core.service.p3normage.operation; + +import static org.junit.Assert.assertEquals; + +import java.sql.Connection; + +import org.junit.Test; + +import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder; +import fr.insee.arc.core.service.global.bo.FileIdCard; +import fr.insee.arc.core.service.p3normage.bo.RegleNormage; +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; +import fr.insee.arc.utils.dao.SQL; +import fr.insee.arc.utils.dao.UtilitaireDao; +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.query.TestDatabase; + +public class NormageRulesOperationTest { + + public static UtilitaireDao u = UtilitaireDao.get(0); + + public static Connection c = new TestDatabase().testConnection; + + @Test + public void fillNormageRulesTest() throws ArcException { + // insert test data + u.executeImmediate(c, "DROP SCHEMA IF EXISTS arc_bas1 CASCADE;"); + u.executeImmediate(c, "CREATE SCHEMA IF NOT EXISTS arc_bas1;"); + + ArcPreparedStatementBuilder query = new ArcPreparedStatementBuilder(); + query.build("CREATE TABLE IF NOT EXISTS arc_bas1.normage_regle (\r\n" + + " id_norme text NULL,\r\n" + + " periodicite text NULL,\r\n" + + " validite_inf date NULL,\r\n" + + " validite_sup date NULL,\r\n" + + " \"version\" text NULL,\r\n" + + " id_classe text NULL,\r\n" + + " rubrique text NULL,\r\n" + + " rubrique_nmcl text NULL,\r\n" + + " id_regle int4 NULL,\r\n" + + " todo text NULL,\r\n" + + " commentaire text NULL\r\n" + + ")\r\n" + + "WITH (\r\n" + + " autovacuum_enabled=false\r\n" + + ");"); + + + query.build(SQL.INSERT_INTO, "arc_bas1.normage_regle" , SQL.VALUES, "('TEST', 'A', '2020-01-01', '2025-01-01', 'v01', 'relation', 'col1', 'col2', 1, '', '')", SQL.END_QUERY); + // hors calendrier + query.build(SQL.INSERT_INTO, "arc_bas1.normage_regle" , SQL.VALUES, "('TEST', 'A', '1998-01-01', '2020-01-01', 'v01', 'relation', 'col_invalid', 'col_invalid', 1, '', '')", SQL.END_QUERY); + // norme différente + query.build(SQL.INSERT_INTO, "arc_bas1.normage_regle" , SQL.VALUES, "('FAKE_NORM', 'A', '2020-01-01', '2025-01-01', 'v01', 'relation', 'col_invalid', 'col_invalid', 1, '', '')", SQL.END_QUERY); + // périodicité différente + query.build(SQL.INSERT_INTO, "arc_bas1.normage_regle" , SQL.VALUES, "('TEST', 'M', '2020-01-01', '2025-01-01', 'v01', 'relation', 'col_invalid', 'col_invalid', 1, '', '')", SQL.END_QUERY); + + + u.executeRequest(c, query); + // prepare fileidcard object + FileIdCard fileIdCard = new FileIdCard("TEST"); + fileIdCard.setIdNorme("TEST"); + fileIdCard.setValidite("2022-01-01"); + fileIdCard.setPeriodicite("A"); + // method to test + NormageRulesOperation.fillNormageRules(c, "arc_bas1", fileIdCard); + // assertions + RegleNormage regleNormage = fileIdCard.getIdCardNormage().getReglesNormage().get(0); + assertEquals(TypeNormage.RELATION, regleNormage.getTypeNormage()); + assertEquals("col1", regleNormage.getRubrique()); + assertEquals("col2", regleNormage.getRubriqueNmcl()); + } + +} diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java new file mode 100644 index 000000000..c5d32a610 --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java @@ -0,0 +1,86 @@ +package fr.insee.arc.core.service.p4controle.operation; + +import static org.junit.Assert.assertEquals; + +import java.sql.Connection; + +import org.junit.Test; + +import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder; +import fr.insee.arc.core.service.global.bo.FileIdCard; +import fr.insee.arc.core.service.p4controle.bo.ControleTypeCode; +import fr.insee.arc.core.service.p4controle.bo.RegleControle; +import fr.insee.arc.utils.dao.SQL; +import fr.insee.arc.utils.dao.UtilitaireDao; +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.query.TestDatabase; + +public class ControleRulesOperationTest { + + public static UtilitaireDao u = UtilitaireDao.get(0); + + public static Connection c = new TestDatabase().testConnection; + + @Test + public void fillControleRulesTest() throws ArcException { + // insert test data + u.executeImmediate(c, "DROP SCHEMA IF EXISTS arc_bas1 CASCADE;"); + u.executeImmediate(c, "CREATE SCHEMA IF NOT EXISTS arc_bas1;"); + ArcPreparedStatementBuilder query = new ArcPreparedStatementBuilder(); + query.build("CREATE TABLE arc_bas1.controle_regle (\r\n" + + " id_norme text NULL,\r\n" + + " periodicite text NULL,\r\n" + + " validite_inf date NULL,\r\n" + + " validite_sup date NULL,\r\n" + + " \"version\" text NULL,\r\n" + + " id_classe text NULL,\r\n" + + " rubrique_pere text NULL,\r\n" + + " rubrique_fils text NULL,\r\n" + + " borne_inf text NULL,\r\n" + + " borne_sup text NULL,\r\n" + + " \"condition\" text NULL,\r\n" + + " pre_action text NULL,\r\n" + + " id_regle int4 NULL,\r\n" + + " todo text NULL,\r\n" + + " commentaire text NULL,\r\n" + + " xsd_ordre int4 NULL,\r\n" + + " xsd_label_fils text NULL,\r\n" + + " xsd_role text NULL,\r\n" + + " blocking_threshold text NULL,\r\n" + + " error_row_processing text NULL\r\n" + + ")\r\n" + + "WITH (\r\n" + + " autovacuum_enabled=false\r\n" + + ");"); + query.build(SQL.INSERT_INTO, "arc_bas1.controle_regle", SQL.VALUES, "('TEST', 'A', '2020-01-01', '2025-01-01', 'v01', 'CARDINALITE', 'col1', 'col2', '2', '3', 'requete', 'pretraitement', 1, '', '', 1, 'xsd1', 'xsd2', '>0u', 'e')", SQL.END_QUERY); + // hors calendrier + query.build(SQL.INSERT_INTO, "arc_bas1.controle_regle", SQL.VALUES, "('TEST', 'A', '1998-01-01', '2020-01-01', 'v01', 'CARDINALITE', 'col_invalid', 'col_invalid', '2', '3', 'requete', 'pretraitement', 1, '', '', 1, 'xsd1', 'xsd2', '>0u', 'e')", SQL.END_QUERY); + // norme différente + query.build(SQL.INSERT_INTO, "arc_bas1.controle_regle", SQL.VALUES, "('FAKE_NORM', 'A', '2020-01-01', '2025-01-01', 'v01', 'CARDINALITE', 'col_invalid', 'col_invalid', '2', '3', 'requete', 'pretraitement', 1, '', '', 1, 'xsd1', 'xsd2', '>0u', 'e')", SQL.END_QUERY); + // périodicité différente + query.build(SQL.INSERT_INTO, "arc_bas1.controle_regle", SQL.VALUES, "('TEST', 'M', '2020-01-01', '2025-01-01', 'v01', 'CARDINALITE', 'col_invalid', 'col_invalid', '2', '3', 'requete', 'pretraitement', 1, '', '', 1, 'xsd1', 'xsd2', '>0u', 'e')", SQL.END_QUERY); + u.executeRequest(c, query); + // prepare fileidcard object + FileIdCard fileIdCard = new FileIdCard("TEST"); + fileIdCard.setIdNorme("TEST"); + fileIdCard.setValidite("2022-01-01"); + fileIdCard.setPeriodicite("A"); + // method to test + ControleRulesOperation.fillControleRules(c, "arc_bas1", fileIdCard); + // assertions + RegleControle regleControle = fileIdCard.getIdCardControle().getReglesControle().get(0); + assertEquals(ControleTypeCode.CARDINALITE, regleControle.getTypeControle()); + assertEquals("col1", regleControle.getRubriquePere()); + assertEquals("col2", regleControle.getRubriqueFils()); + assertEquals("2", regleControle.getBorneInf()); + assertEquals("3", regleControle.getBorneSup()); + assertEquals("requete", regleControle.getCondition()); + assertEquals("pretraitement", regleControle.getPreAction()); + assertEquals(1, regleControle.getXsdOrdre()); + assertEquals("xsd1", regleControle.getXsdLabelFils()); + assertEquals("xsd2", regleControle.getXsdRole()); + assertEquals(">0u", regleControle.getSeuilBloquant()); + assertEquals("e", regleControle.getTraitementLignesErreur()); + } + +} diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperationTest.java new file mode 100644 index 000000000..919f13b2f --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperationTest.java @@ -0,0 +1,64 @@ +package fr.insee.arc.core.service.p5mapping.operation; + +import static org.junit.Assert.assertEquals; + +import java.sql.Connection; + +import org.junit.Test; + +import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder; +import fr.insee.arc.core.service.global.bo.FileIdCard; +import fr.insee.arc.core.service.p5mapping.bo.RegleMapping; +import fr.insee.arc.utils.dao.SQL; +import fr.insee.arc.utils.dao.UtilitaireDao; +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.query.TestDatabase; + +public class MappingRulesOperationTest { + + public static UtilitaireDao u = UtilitaireDao.get(0); + + public static Connection c = new TestDatabase().testConnection; + + @Test + public void fillMappingRulesTest() throws ArcException { + // insert test data + u.executeImmediate(c, "DROP SCHEMA IF EXISTS arc_bas1 CASCADE;"); + u.executeImmediate(c, "CREATE SCHEMA IF NOT EXISTS arc_bas1;"); + ArcPreparedStatementBuilder query = new ArcPreparedStatementBuilder(); + query.build("CREATE TABLE arc_bas1.mapping_regle (\r\n" + + " id_regle int8 NULL,\r\n" + + " id_norme text NULL,\r\n" + + " validite_inf date NULL,\r\n" + + " validite_sup date NULL,\r\n" + + " \"version\" text NULL,\r\n" + + " periodicite text NULL,\r\n" + + " variable_sortie varchar(63) NULL,\r\n" + + " expr_regle_col text NULL,\r\n" + + " commentaire text NULL\r\n" + + ")\r\n" + + "WITH (\r\n" + + " autovacuum_enabled=false\r\n" + + ");"); + query.build(SQL.INSERT_INTO, "arc_bas1.mapping_regle", SQL.VALUES, "(1, 'TEST', '2020-01-01', '2025-01-01', 'v01', 'A', 'col_sortie', 'col1', '')", SQL.END_QUERY); + // hors calendrier + query.build(SQL.INSERT_INTO, "arc_bas1.mapping_regle", SQL.VALUES, "(1, 'TEST', '1998-01-01', '2020-01-01', 'v01', 'A', 'col_invalid', 'col_invalid', '')", SQL.END_QUERY); + // norme différente + query.build(SQL.INSERT_INTO, "arc_bas1.mapping_regle", SQL.VALUES, "(1, 'FAKE_NORM', '2020-01-01', '2025-01-01', 'v01', 'A', 'col_invalid', 'col_invalid', '')", SQL.END_QUERY); + // périodicité différente + query.build(SQL.INSERT_INTO, "arc_bas1.mapping_regle", SQL.VALUES, "(1, 'TEST', '2020-01-01', '2025-01-01', 'v01', 'M', 'col_invalid', 'col_invalid', '')", SQL.END_QUERY); + u.executeRequest(c, query); + // prepare fileidcard object + FileIdCard fileIdCard = new FileIdCard("TEST"); + fileIdCard.setIdNorme("TEST"); + fileIdCard.setValidite("2022-01-01"); + fileIdCard.setPeriodicite("A"); + // method to test + MappingRulesOperation.fillMappingRules(c, "arc_bas1", fileIdCard); + // assertions + RegleMapping regleMapping = fileIdCard.getIdCardMapping().getReglesMapping().get(0); + assertEquals("col_sortie", regleMapping.getVariableSortie()); + assertEquals("col1", regleMapping.getExprRegleCol()); + } + +} diff --git a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineChargementOperation.java b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineChargementOperation.java index 39ab04ede..89fea132f 100644 --- a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineChargementOperation.java +++ b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineChargementOperation.java @@ -41,7 +41,7 @@ public PhaseInterface execute() throws IOException, ArcException bodyPojo.fileContent.getBytes(StandardCharsets.UTF_8));) { FileIdCard fileIdCard = new FileIdCard(bodyPojo.fileName); - fileIdCard.setFileIdCard(bodyPojo.norme, bodyPojo.validite, bodyPojo.periodicite); + fileIdCard.setFileIdCard(bodyPojo.norme, bodyPojo.validite, bodyPojo.periodicite, null); ChargementRulesOperation.fillChargementRules(sandbox.getConnection(), sandbox.getSchema(), fileIdCard); ChargeurXmlComplexe chargeur = new ChargeurXmlComplexe(sandbox.getConnection(), sandbox.getSchema(), fileIdCard, inputStream, phaseInterface.getOutputTable()); diff --git a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineNormageOperation.java b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineNormageOperation.java index 6a600bb94..b9e869ae3 100644 --- a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineNormageOperation.java +++ b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineNormageOperation.java @@ -2,13 +2,13 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import fr.insee.arc.core.dataobjects.ColumnEnum; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.global.bo.Sandbox; +import fr.insee.arc.core.service.p3normage.bo.IdCardNormage; import fr.insee.arc.core.service.p3normage.operation.NormageOperation; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.FormatSQL; @@ -37,28 +37,14 @@ public ExecuteEngineNormageOperation(Sandbox sandbox, ExecuteParameterModel body public PhaseInterface execute() throws IOException, ArcException { - - Map> pil = new HashMap<>(); - pil.put(ColumnEnum.ID_SOURCE.getColumnName(), new ArrayList<>(Arrays.asList(bodyPojo.fileName))); - pil.put("id_norme", new ArrayList<>(Arrays.asList(bodyPojo.norme))); - pil.put("validite", new ArrayList<>(Arrays.asList(bodyPojo.validite))); - pil.put("periodicite", new ArrayList<>(Arrays.asList(bodyPojo.periodicite))); - pil.put("jointure", new ArrayList<>(Arrays.asList(phaseInterface.getStructure()))); - - Map> regle = new HashMap<>(); - regle.put("id_regle", new ArrayList<>()); - regle.put("id_norme", new ArrayList<>()); - regle.put("periodicite", new ArrayList<>()); - regle.put("validite_inf", new ArrayList<>()); - regle.put("validite_sup", new ArrayList<>()); - regle.put("id_classe", new ArrayList<>()); - regle.put("rubrique", new ArrayList<>()); - regle.put("rubrique_nmcl", new ArrayList<>()); + FileIdCard fileIdCard = new FileIdCard(bodyPojo.fileName); + fileIdCard.setFileIdCard(bodyPojo.norme, bodyPojo.validite, bodyPojo.periodicite, phaseInterface.getStructure()); + fileIdCard.setIdCardNormage(new IdCardNormage(new ArrayList<>())); Map> rubriqueUtiliseeDansRegles = new HashMap<>(); rubriqueUtiliseeDansRegles.put("var", new ArrayList<>()); - NormageOperation normage = new NormageOperation(sandbox.getConnection(), pil, regle, rubriqueUtiliseeDansRegles, phaseInterface.getInputTable(), phaseInterface.getOutputTable(), + NormageOperation normage = new NormageOperation(sandbox.getConnection(), fileIdCard, rubriqueUtiliseeDansRegles, phaseInterface.getInputTable(), phaseInterface.getOutputTable(), null); normage.executeEngine(); From cf01506797e918c1063ae65e2f7182545d15583f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Manelphe?= Date: Fri, 27 Oct 2023 16:37:53 +0200 Subject: [PATCH 02/13] fix: return enum class for typeChargement and typeNormage --- .../p2chargement/factory/TypeChargement.java | 70 +++++++++---------- .../service/p3normage/bo/TypeNormage.java | 22 ++++++ .../operation/NormageRulesOperation.java | 2 +- .../factory/TypeChargementTest.java | 24 +++++++ .../service/p3normage/bo/TypeNormageTest.java | 22 ++++++ .../utils/exception/ArcExceptionMessage.java | 6 +- 6 files changed, 108 insertions(+), 38 deletions(-) create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargementTest.java create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p3normage/bo/TypeNormageTest.java diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargement.java b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargement.java index 3c918d6a8..a50469ac9 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargement.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargement.java @@ -1,39 +1,39 @@ package fr.insee.arc.core.service.p2chargement.factory; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.exception.ArcExceptionMessage; + public enum TypeChargement { - CLEF_VALEUR("clef-valeur"), - XML("xml"), - PLAT("plat"), - XML_COMPLEXE("xml-complexe"); - - private String nom; - - private TypeChargement(String nom) { - this.nom = nom; - } - - public String getNom() { - return nom; - } - - public void setNom(String nom) { - this.nom = nom; - } - - public static TypeChargement getEnum(String code) { - - switch (code) { - case "clef-valeur": - return CLEF_VALEUR; - case "xml": - return XML; - case "plat": - return PLAT; - case "xml-complexe": - return XML_COMPLEXE; - default: - return null; - } - } - + CLEF_VALEUR("clef-valeur"), XML("xml"), PLAT("plat"), XML_COMPLEXE("xml-complexe"); + + private String nom; + + private TypeChargement(String nom) { + this.nom = nom; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public static TypeChargement getEnum(String code) throws ArcException { + + List filtered = Arrays.asList(TypeChargement.values()).stream() + .filter(t -> t.getNom().equals(code)).collect(Collectors.toList()); + + if (filtered.isEmpty()) { + throw new ArcException(ArcExceptionMessage.LOAD_TYPE_NOT_FOUND, code); + } + + return filtered.get(0); + } + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java index 9f7520198..9cfb27a88 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java @@ -1,5 +1,12 @@ package fr.insee.arc.core.service.p3normage.bo; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.exception.ArcExceptionMessage; + public enum TypeNormage { RELATION("relation"), CARTESIAN("cartesian"), @@ -25,4 +32,19 @@ public void setNom(String nom) { this.nom = nom; } + + public static TypeNormage getEnum(String code) throws ArcException { + + List filtered = Arrays.asList(TypeNormage.values()).stream().filter(t -> t.getNom().equals(code)).collect(Collectors.toList()); + + if (filtered.isEmpty()) + { + throw new ArcException(ArcExceptionMessage.NORMAGE_TYPE_NOT_FOUND, code); + } + + return filtered.get(0); + } + + + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java index 27dfcf03c..3102b200e 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java @@ -38,7 +38,7 @@ public static void fillNormageRules(Connection connection, String envExecution, List listRegles = new ArrayList<>(); for(int i = 0; i < regle.get(ColumnEnum.ID_CLASSE.getColumnName()).size(); i++) { listRegles.add(new RegleNormage( - TypeNormage.valueOf(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(0)), + TypeNormage.getEnum(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(0)), regle.get(ColumnEnum.RUBRIQUE.getColumnName()).get(0), regle.get(ColumnEnum.RUBRIQUE_NMCL.getColumnName()).get(0) )); diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargementTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargementTest.java new file mode 100644 index 000000000..beba52cdc --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p2chargement/factory/TypeChargementTest.java @@ -0,0 +1,24 @@ +package fr.insee.arc.core.service.p2chargement.factory; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import fr.insee.arc.core.service.p3normage.bo.TypeNormage; +import fr.insee.arc.utils.exception.ArcException; + +public class TypeChargementTest { + + + @Test + public void getEnum_test_ok() throws ArcException { + + assertEquals(TypeChargement.XML_COMPLEXE, TypeChargement.getEnum("xml-complexe")); + } + + @Test(expected = ArcException.class) + public void getEnum_test_ko() throws ArcException { + TypeChargement.getEnum("type de chargement inexistant"); + } + +} diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p3normage/bo/TypeNormageTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p3normage/bo/TypeNormageTest.java new file mode 100644 index 000000000..4db266a97 --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p3normage/bo/TypeNormageTest.java @@ -0,0 +1,22 @@ +package fr.insee.arc.core.service.p3normage.bo; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import fr.insee.arc.utils.exception.ArcException; + +public class TypeNormageTest { + + @Test + public void getEnum_test_ok() throws ArcException { + + assertEquals(TypeNormage.RELATION, TypeNormage.getEnum("relation")); + } + + @Test(expected = ArcException.class) + public void getEnum_test_ko() throws ArcException { + TypeNormage.getEnum("type de norme inexistant"); + } + +} diff --git a/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java b/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java index e6989f89f..fd38603f0 100644 --- a/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java +++ b/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java @@ -39,6 +39,8 @@ public enum ArcExceptionMessage { LOAD_SEVERAL_NORM_FOUND("Plusieurs normes ou validité correspondent à l'expression : %s"), LOAD_NORM_NOT_FOUND("Aucune norme trouvée pour le fichier %s"), LOAD_ZERO_NORM_FOUND("Aucune norme trouvée"), + LOAD_TYPE_NOT_FOUND("Le type de chargement %s n'existe pas"), + MAPPING_PRIMARY_KEY_INVALID_FORMAT("La règle de clé primaire pour la variable %s n'est pas de la forme : \"{\"pk:mapping___ok\"}\""), MAPPING_EXPRESSION_INVALID("L'expression \"%s\" est invalide"), @@ -54,7 +56,7 @@ public enum ArcExceptionMessage { NORMAGE_VALIDITE_DATE_PARSE_FAILED ("Le champ validite %s ne peut être converti en date"), NORMAGE_INDEPENDANCE_BLOC_INVALID_IDENTIFIER("La rubrique %s n'identifie pas un bloc"), NORMAGE_INDEPENDANCE_BLOC_INVALID_FATHER("La rubrique %s n'a pas le même pere que les autres rubriques du bloc"), - + NORMAGE_TYPE_NOT_FOUND("Le type de normage %s n'existe pas"), CONTROLE_XSD_ENUM_EMPTY("L'énumération XSD pour le type de règle de contrôle ENUM_BRUTE ne peut pas être vide"), CONTROLE_XSD_RUBRIQUE_RELATION_ALREADY_DEFINED("La relation entre %s et %s est déjà décrite sous forme de séquence dans les règles XSD"), @@ -101,7 +103,7 @@ public enum ArcExceptionMessage { DATE_PARSE_FAILED_VALIDITE_INF("La validité inf %s n'a pu être parsée"), DATE_PARSE_FAILED_VALIDITE_SUP("La validité sup %s n'a pu être parsée") - + ; private String message; From 13e397ba1c67faf9aa94083edcc616ee29aa039d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Manelphe?= Date: Tue, 7 Nov 2023 14:49:02 +0100 Subject: [PATCH 03/13] wip: fileIdCard refactor controle --- .../service/p3normage/bo/TypeNormage.java | 65 ++++++++--------- .../p4controle/bo/ControleTypeCode.java | 58 +++++++++------ .../service/p4controle/bo/RegleControle.java | 16 ++++- .../p4controle/dao/ControleRegleDao.java | 64 ++++++++--------- .../operation/ControleRulesOperation.java | 1 + .../operation/ServiceJeuDeRegleOperation.java | 72 ++++++++----------- .../thread/ThreadControleService.java | 21 +++--- .../p4controle/bo/ControleTypeCodeTest.java | 23 ++++++ .../operation/ControleRulesOperationTest.java | 1 + .../ExecuteEngineControleOperation.java | 13 ++-- 10 files changed, 182 insertions(+), 152 deletions(-) create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java index 9cfb27a88..4b57060a5 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java @@ -8,43 +8,34 @@ import fr.insee.arc.utils.exception.ArcExceptionMessage; public enum TypeNormage { - RELATION("relation"), - CARTESIAN("cartesian"), - UNICITE("unicité"), - PARTITION("partition"), - INDEPENDANCE("independance"), - BLOC_INDEPENDANCE("bloc_independance"), - DELETION("deletion"), - DUPLICATION("duplication") - ; - + RELATION("relation"), CARTESIAN("cartesian"), UNICITE("unicité"), PARTITION("partition"), + INDEPENDANCE("independance"), BLOC_INDEPENDANCE("bloc_independance"), DELETION("deletion"), + DUPLICATION("duplication"); + private String nom; - private TypeNormage(String nom) { - this.nom = nom; - } - - public String getNom() { - return nom; - } - - public void setNom(String nom) { - this.nom = nom; - } - - - public static TypeNormage getEnum(String code) throws ArcException { - - List filtered = Arrays.asList(TypeNormage.values()).stream().filter(t -> t.getNom().equals(code)).collect(Collectors.toList()); - - if (filtered.isEmpty()) - { - throw new ArcException(ArcExceptionMessage.NORMAGE_TYPE_NOT_FOUND, code); - } - - return filtered.get(0); - } - - - + private TypeNormage(String nom) { + this.nom = nom; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public static TypeNormage getEnum(String code) throws ArcException { + + List filtered = Arrays.asList(TypeNormage.values()).stream().filter(t -> t.getNom().equals(code)) + .collect(Collectors.toList()); + + if (filtered.isEmpty()) { + throw new ArcException(ArcExceptionMessage.NORMAGE_TYPE_NOT_FOUND, code); + } + + return filtered.get(0); + } + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java index 4f48f44e0..cd5189b15 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java @@ -1,34 +1,46 @@ package fr.insee.arc.core.service.p4controle.bo; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.exception.ArcExceptionMessage; + /** - * code des types de controle proposés par ARC + * code des types de controle proposés par ARC + * * @author FY2QEQ * */ public enum ControleTypeCode { - NUM, DATE, ALPHANUM, CARDINALITE, CONDITION, REGEXP, ENUM_BRUTE, ENUM_TABLE; - - public static ControleTypeCode getEnum(String code) { - switch (code) { - case "NUM": - return NUM; - case "DATE": - return DATE; - case "ALPHANUM": - return ALPHANUM; - case "CARDINALITE": - return CARDINALITE; - case "CONDITION": - return CONDITION; - case "REGEXP": - return REGEXP; - case "ENUM_BRUTE": - return ENUM_BRUTE; - case "ENUM_TABLE": - return ENUM_TABLE; - default: - return null; + NUM("NUM"), DATE("DATE"), ALPHANUM("ALPHANUM"), CARDINALITE("CARDINALITE"), CONDITION("CONDITION"), + REGEXP("REGEXP"), ENUM_BRUTE("ENUM_BRUTE"), ENUM_TABLE("ENUM_TABLE"); + + private String nom; + + private ControleTypeCode(String nom) { + this.nom = nom; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public static ControleTypeCode getEnum(String code) throws ArcException { + + List filtered = Arrays.asList(ControleTypeCode.values()).stream() + .filter(t -> t.getNom().equals(code)).collect(Collectors.toList()); + + if (filtered.isEmpty()) { + throw new ArcException(ArcExceptionMessage.CONTROLE_TYPE_NOT_FOUND, code); } + + return filtered.get(0); } } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java index eb030904b..87a5d5e80 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java @@ -11,6 +11,7 @@ public class RegleControle { private String condition; private String preAction; // aka prétraitement SQL + private int idRegle; private int xsdOrdre; private String xsdLabelFils; @@ -20,7 +21,7 @@ public class RegleControle { private String traitementLignesErreur; // aka error_row_processing public RegleControle(ControleTypeCode typeControle, String rubriquePere, String rubriqueFils, String borneInf, - String borneSup, String condition, String preAction, int xsdOrdre, String xsdLabelFils, String xsdRole, + String borneSup, String condition, String preAction, int idRegle, int xsdOrdre, String xsdLabelFils, String xsdRole, String seuilBloquant, String traitementLignesErreur) { super(); this.typeControle = typeControle; @@ -30,6 +31,7 @@ public RegleControle(ControleTypeCode typeControle, String rubriquePere, String this.borneSup = borneSup; this.condition = condition; this.preAction = preAction; + this.idRegle = idRegle; this.xsdOrdre = xsdOrdre; this.xsdLabelFils = xsdLabelFils; this.xsdRole = xsdRole; @@ -37,6 +39,10 @@ public RegleControle(ControleTypeCode typeControle, String rubriquePere, String this.traitementLignesErreur = traitementLignesErreur; } + public RegleControle() { + super(); + } + public ControleTypeCode getTypeControle() { return typeControle; } @@ -93,6 +99,14 @@ public void setPreAction(String preAction) { this.preAction = preAction; } + public int getIdRegle() { + return idRegle; + } + + public void setIdRegle(int idRegle) { + this.idRegle = idRegle; + } + public int getXsdOrdre() { return xsdOrdre; } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java index 2a7ddd407..ce2ffa358 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java @@ -12,9 +12,9 @@ import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Component; -import fr.insee.arc.core.service.global.bo.RegleControleEntity; import fr.insee.arc.core.service.p4controle.bo.ControleMarkCode; import fr.insee.arc.core.service.p4controle.bo.ControleXsdCode; +import fr.insee.arc.core.service.p4controle.bo.RegleControle; import fr.insee.arc.core.service.p4controle.bo.XsdDate; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.utils.FormatSQL; @@ -168,12 +168,12 @@ private String insertBloc(String blockingThreshold, String errorRowProcessing, S * @param reg * @return */ - public String ctlIsNumeric(RegleControleEntity reg) { + public String ctlIsNumeric(RegleControle reg) { String cond = conditionLongueur(reg); String requete = "WITH ctl AS ( SELECT id FROM " + this.tableTempData + " " + " WHERE ({2} ~ '^-?\\d*(\\.\\d+)?$') IS FALSE " + cond + ") " - + insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle()); - requete = getRequete(requete, TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere()); + + insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle())); + requete = getRequete(requete, TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere()); return requete; } @@ -185,7 +185,7 @@ public String ctlIsNumeric(RegleControleEntity reg) { * * @param reg la règle à appliquer */ - public String ctlIsDate(RegleControleEntity reg) { + public String ctlIsDate(RegleControle reg) { StringBuilder reqBuilder = new StringBuilder("WITH ctl AS (SELECT id FROM " + this.tableTempData + " "); String requete = ""; if (reg.getCondition().equalsIgnoreCase(ControleXsdCode.XSD_DATE_NAME) @@ -202,28 +202,28 @@ public String ctlIsDate(RegleControleEntity reg) { reqBuilder.append(") THEN false "); reqBuilder.append("\n WHEN {2} is null THEN false "); reqBuilder.append("\n ELSE true END) "); - reqBuilder.append(insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle())); - requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere()); + reqBuilder.append(insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle()))); + requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere()); } else { reqBuilder.append("\n WHERE CASE WHEN arc.isdate({2},'{3}') THEN false"); reqBuilder.append("\n WHEN {2} is null THEN false "); reqBuilder.append("\n ELSE true END) "); - reqBuilder.append(insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle())); - requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere(), + reqBuilder.append(insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle()))); + requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere(), reg.getCondition()); } return requete; } - public String ctlIsAlphanum(RegleControleEntity reg) { + public String ctlIsAlphanum(RegleControle reg) { String cond = conditionLongueur(reg); String requete = "WITH ctl AS (SELECT id FROM " + this.tableTempData + " WHERE false " + cond + ")" - + insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle()); - requete = getRequete(requete, TABLE_TEMP_MARK, reg.getIdRegle()); + + insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle())); + requete = getRequete(requete, TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle())); return requete; } - public String ctlCardinalite(RegleControleEntity reg, List listRubriqueExpr, + public String ctlCardinalite(RegleControle reg, List listRubriqueExpr, List ListRubriqueTable) { // on retire le pere et le fils de la liste d'expr @@ -306,9 +306,9 @@ public String ctlCardinalite(RegleControleEntity reg, List listRubriqueE requete.append(" SELECT a.id FROM " + this.tableTempData + " a "); requete.append(" INNER JOIN trav ON row(a.{2})::text collate \"C\"=row(trav.{2})::text collate \"C\" "); requete.append(" ) "); - requete.append(insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle())); + requete.append(insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle()))); - return getRequete(requete.toString(), TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere(), + return getRequete(requete.toString(), TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere(), reg.getRubriqueFils()); } @@ -320,14 +320,14 @@ public String ctlCardinalite(RegleControleEntity reg, List listRubriqueE * @param mapRubrique * @return */ - public String ctlCondition(RegleControleEntity reg, Map mapRubrique) { + public String ctlCondition(RegleControle reg, Map mapRubrique) { String filtre = writeFiltre(mapRubrique); String cond = rewriteCondition(mapRubrique, reg.getCondition()); String requete = "WITH ctl AS ( select id from (SELECT id, " + " CASE WHEN " + filtre + " THEN CASE WHEN " + cond + " THEN FALSE ELSE TRUE END ELSE FALSE END as condition_a_tester " + " FROM " + this.tableTempData + " " + ") ww where condition_a_tester ) " - + insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle()); - requete = getRequete(requete, TABLE_TEMP_MARK, reg.getIdRegle()); + + insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle())); + requete = getRequete(requete, TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle())); return requete; } @@ -338,10 +338,10 @@ public String ctlCondition(RegleControleEntity reg, Map mapRubrique, String condition0) { + private String rewriteCondition(Map mapRubrique, String condition0) { StaticLoggerDispatcher.debug(logger, "Je rentre dans la méthode rewriteCondition"); // Passage en MAJUSCULE car la map contient des elements en majuscule // bétonnage du code pour que le .uppercase ne lève pas de null pointerException @@ -419,9 +419,9 @@ private String rewriteCondition(Map mapRubrique, St String type = ""; String rubrique = ""; String format = ""; - for (Entry entry : mapRubrique.entrySet()) { + for (Entry entry : mapRubrique.entrySet()) { StaticLoggerDispatcher.debug(logger, "A l'intérieur de la boucle FOR"); - type = entry.getValue().getIdClasse().trim(); + type = entry.getValue().getTypeControle().getNom().trim(); rubrique = entry.getKey().trim(); StaticLoggerDispatcher.debug(logger, "Mon type : " + type + ", ma rubrique : " + rubrique); switch (type) { @@ -454,7 +454,7 @@ private String rewriteCondition(Map mapRubrique, St * @param mapRubrique * @return */ - private String writeFiltre(Map mapRubrique) { + private String writeFiltre(Map mapRubrique) { String filtre = ""; String type = ""; String rubrique = ""; @@ -462,8 +462,8 @@ private String writeFiltre(Map mapRubrique) { int i = 0; - for (Entry entry : mapRubrique.entrySet()) { - type = entry.getValue().getIdClasse().trim(); + for (Entry entry : mapRubrique.entrySet()) { + type = entry.getValue().getTypeControle().getNom().trim(); rubrique = entry.getKey().trim(); format = entry.getValue().getCondition(); @@ -554,7 +554,7 @@ private String getRequete(String req, String... args) { * @param borneSup * @return */ - private String conditionLongueur(RegleControleEntity reg) { + private String conditionLongueur(RegleControle reg) { String cond = ""; String rubrique = reg.getRubriquePere(); String borneInf = reg.getBorneInf(); diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java index 02d26af0f..34938ab72 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java @@ -44,6 +44,7 @@ public static void fillControleRules(Connection connection, String envExecution, regle.get(ColumnEnum.BORNE_SUP.getColumnName()).get(0), regle.get(ColumnEnum.CONDITION.getColumnName()).get(0), regle.get(ColumnEnum.PRE_ACTION.getColumnName()).get(0), + Integer.parseInt(regle.get(ColumnEnum.ID_REGLE.getColumnName()).get(0)), Integer.parseInt(regle.get(ColumnEnum.XSD_ORDRE.getColumnName()).get(0)), regle.get(ColumnEnum.XSD_LABEL_FILS.getColumnName()).get(0), regle.get(ColumnEnum.XSD_ROLE.getColumnName()).get(0), diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java index b9d9b3508..85a4f0d05 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java @@ -12,10 +12,9 @@ import org.springframework.stereotype.Component; import fr.insee.arc.core.model.XMLConstant; -import fr.insee.arc.core.service.global.bo.JeuDeRegle; -import fr.insee.arc.core.service.global.bo.RegleControleEntity; -import fr.insee.arc.core.service.global.bo.RegleDao; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p4controle.bo.ControleTypeCode; +import fr.insee.arc.core.service.p4controle.bo.RegleControle; import fr.insee.arc.core.service.p4controle.dao.ControleRegleDao; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.dao.UtilitaireDao; @@ -39,21 +38,6 @@ public ServiceJeuDeRegleOperation() { this.dao = new ControleRegleDao(); } - /** - * pour remplir un jeu de règle avec les règles y afférant - * - * @param jdr , le jeu de règle à "complèter" - * @param tableRegle , la table des règles de controle - * @param tableIn , la table à controler - * @throws ArcException - */ - public void fillRegleControle(Connection connexion, JeuDeRegle jdr, String tableRegle, String tableIn) - throws ArcException { - StaticLoggerDispatcher.info(LOGGER, "recherche de regle dans la table : " + tableRegle); - List listRegleC = RegleDao.getRegle(connexion, tableRegle, tableIn); - jdr.setListRegleControle(listRegleC); - } - /** * Executer les règles liées à un jeu de règle sur une table donnée * @@ -63,7 +47,7 @@ public void fillRegleControle(Connection connexion, JeuDeRegle jdr, String table * @param table la table de travail dont les enregistrement seront "marqués" * @throws ArcException */ - public void executeJeuDeRegle(Connection connexion, JeuDeRegle jdr, String table) throws ArcException { + public void executeJeuDeRegle(Connection connexion, FileIdCard fileIdCard, String table) throws ArcException { StaticLoggerDispatcher.debug(LOGGER, "executeJeuDeRegle"); java.util.Date date = new java.util.Date(); @@ -72,10 +56,10 @@ public void executeJeuDeRegle(Connection connexion, JeuDeRegle jdr, String table registerRubriquesFromSourceTable(connexion, table); // execute the correction rules (aka "preAction") before the control step - preAction(connexion, jdr, table); + preAction(connexion, fileIdCard, table); // execute the control rules - executeQueryControl(connexion, jdr, table); + executeQueryControl(connexion, fileIdCard, table); StaticLoggerDispatcher.info(LOGGER, "Temps de controle : " + (new java.util.Date().getTime() - date.getTime())); @@ -103,7 +87,7 @@ private void registerRubriquesFromSourceTable(Connection connexion, String table * @param structure * @throws ArcException */ - private void preAction(Connection connexion, JeuDeRegle jdr, String table) throws ArcException { + private void preAction(Connection connexion, FileIdCard fileIdCard, String table) throws ArcException { // exécuter les préactions StaticLoggerDispatcher.info(LOGGER, "Debut Pré-actions"); @@ -115,7 +99,7 @@ private void preAction(Connection connexion, JeuDeRegle jdr, String table) throw * Attention, on suppose que la preaction ne contient qu'une seule rubrique et * en plus celle de la règle */ - for (RegleControleEntity reg : jdr.getListRegleControle()) { + for (RegleControle reg : fileIdCard.getIdCardControle().getReglesControle()) { if (reg.getPreAction() != null && !StringUtils.isEmpty(reg.getPreAction())) { /** * si la rubrique de la preaction n'est pas dans la table, il ne faut rien @@ -145,21 +129,21 @@ private void preAction(Connection connexion, JeuDeRegle jdr, String table) throw * @param structure * @throws ArcException */ - private void executeQueryControl(Connection connexion, JeuDeRegle jdr, String table) throws ArcException { + private void executeQueryControl(Connection connexion, FileIdCard fileIdCard, String table) throws ArcException { StringBuilder blocRequete = new StringBuilder(); blocRequete.append(this.dao.initTemporaryTable(table)); int nbRegles = 0; - int nbTotalRegles = jdr.getListRegleControle().size(); + int nbTotalRegles = fileIdCard.getIdCardControle().getReglesControle().size(); - for (RegleControleEntity reg : jdr.getListRegleControle()) { + for (RegleControle reg : fileIdCard.getIdCardControle().getReglesControle()) { nbRegles++; - reg.setTable(table); + //reg.setTable(table); //inutile? - StaticLoggerDispatcher.info(LOGGER, "n° " + reg.getIdRegle() + " / classe : " + reg.getIdClasse() - + " / commentaire : " + reg.getCommentaire()); - switch (ControleTypeCode.valueOf(reg.getIdClasse())) { + StaticLoggerDispatcher.info(LOGGER, "n° " + reg.getIdRegle() + " / classe : " + reg.getTypeControle() + /*+ " / commentaire : " + reg.getCommentaire()*/); + switch (reg.getTypeControle()) { case NUM: if (regleEstAAppliquer(this.listRubTable, reg)) { blocRequete.append(this.dao.ctlIsNumeric(reg)); @@ -190,7 +174,7 @@ private void executeQueryControl(Connection connexion, JeuDeRegle jdr, String ta } break; case CONDITION: - blocRequete.append(executeRegleCondition(jdr, reg)); + blocRequete.append(executeRegleCondition(fileIdCard, reg)); blocRequete.append(System.lineSeparator()); break; case REGEXP: @@ -231,7 +215,7 @@ private void executeQueryControl(Connection connexion, JeuDeRegle jdr, String ta } /** Vérifie si la règle est à appliquer pour ces rubriques. */ - private boolean regleEstAAppliquer(List listRubriques, RegleControleEntity reg) { + private boolean regleEstAAppliquer(List listRubriques, RegleControle reg) { if (!listRubriques.contains(reg.getRubriquePere())) { StaticLoggerDispatcher.info(LOGGER, "la rubrique : " + reg.getRubriquePere() + " n'existe pas dans ce fichier"); @@ -250,7 +234,7 @@ private boolean regleEstAAppliquer(List listRubriques, RegleControleEnti * @param table * @throws ArcException */ - private String executeRegleCondition(JeuDeRegle jdr, RegleControleEntity reg) { + private String executeRegleCondition(FileIdCard fileIdCard, RegleControle reg) { StaticLoggerDispatcher.info(LOGGER, "Je lance executeRegleCondition()"); String requete = ""; @@ -258,10 +242,10 @@ private String executeRegleCondition(JeuDeRegle jdr, RegleControleEntity reg) { listRubrique.replaceAll(String::toUpperCase); if (this.listRubTable.containsAll(listRubrique)) { - Map mapRubrique = new HashMap<>(); + Map mapRubrique = new HashMap<>(); for (String rub : listRubrique) { StaticLoggerDispatcher.debug(LOGGER, "Je parcours la liste listRubrique sur l'élément : " + rub); - RegleControleEntity regle = findType(jdr, rub); + RegleControle regle = findType(fileIdCard, rub); mapRubrique.put(rub, regle); } StaticLoggerDispatcher.debug(LOGGER, "MapRubrique contient : " + mapRubrique.toString()); @@ -282,7 +266,7 @@ private String executeRegleCondition(JeuDeRegle jdr, RegleControleEntity reg) { * @param table * @throws ArcException */ - private String executeRegleCardinalite(RegleControleEntity reg) { + private String executeRegleCardinalite(RegleControle reg) { StaticLoggerDispatcher.info(LOGGER, "Je lance executeRegleCardinalite()"); String requete = ""; @@ -301,22 +285,22 @@ private String executeRegleCardinalite(RegleControleEntity reg) { * @param rub * @return */ - private RegleControleEntity findType(JeuDeRegle jdr, String rub) { - RegleControleEntity reg = new RegleControleEntity(); + private RegleControle findType(FileIdCard fileIdCard, String rub) { + RegleControle reg = new RegleControle(); boolean isFind = false; StaticLoggerDispatcher.debug(LOGGER, "La rubrique dont on cherche le type : " + rub); String rubriquePere = ""; - String idClasse = ""; - for (RegleControleEntity regC : jdr.getListRegleControle()) { + ControleTypeCode idClasse; + for (RegleControle regC : fileIdCard.getIdCardControle().getReglesControle()) { rubriquePere = regC.getRubriquePere(); - idClasse = regC.getIdClasse(); + idClasse = regC.getTypeControle(); StaticLoggerDispatcher.debug(LOGGER, "La rubrique de la regle testée : " + rubriquePere + " et le type : " + idClasse); if (rub.equals(rubriquePere) - && (idClasse.equals("NUM") || idClasse.equals("DATE") || idClasse.equals("ALPHANUM"))) { + && (idClasse.equals(ControleTypeCode.NUM) || idClasse.equals(ControleTypeCode.DATE) || idClasse.equals(ControleTypeCode.ALPHANUM))) { StaticLoggerDispatcher.debug(LOGGER, "J'ai trouvé une règle de typage"); reg.setIdRegle(regC.getIdRegle()); - reg.setIdClasse(regC.getIdClasse()); + reg.setTypeControle(regC.getTypeControle()); reg.setRubriquePere(rub); reg.setCondition(regC.getCondition()); isFind = true; @@ -324,7 +308,7 @@ private RegleControleEntity findType(JeuDeRegle jdr, String rub) { } } if (!isFind) {// par défaut le type sera considéré comme numérique - reg.setIdClasse("ALPHANUM"); + reg.setTypeControle(ControleTypeCode.ALPHANUM); reg.setRubriquePere(rub); } return reg; diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java index 20743c85d..d3a052c55 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java @@ -5,9 +5,8 @@ import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder; import fr.insee.arc.core.dataobjects.ColumnEnum; -import fr.insee.arc.core.dataobjects.ViewEnum; import fr.insee.arc.core.model.TraitementEtat; -import fr.insee.arc.core.service.global.bo.JeuDeRegle; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.global.dao.DatabaseConnexionConfiguration; import fr.insee.arc.core.service.global.dao.GenericQueryDao; import fr.insee.arc.core.service.global.dao.HashFileNameConversion; @@ -22,6 +21,7 @@ import fr.insee.arc.core.service.p4controle.bo.ControleMarkCode; import fr.insee.arc.core.service.p4controle.dao.ControleRegleDao; import fr.insee.arc.core.service.p4controle.dao.ThreadControleQueryBuilder; +import fr.insee.arc.core.service.p4controle.operation.ControleRulesOperation; import fr.insee.arc.core.service.p4controle.operation.ServiceJeuDeRegleOperation; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.exception.ArcException; @@ -49,8 +49,8 @@ public class ThreadControleService extends ApiControleService implements Runnabl private String tableOutKo; private ServiceJeuDeRegleOperation sjdr; - - private JeuDeRegle jdr; + + private FileIdCard fileIdCard; private ThreadOperations arcThreadGenericDao; private GenericQueryDao genericExecutorDao; @@ -70,7 +70,6 @@ public void configThread(ScalableConnection connexion, int currentIndice, ApiCon this.paramBatch=theApi.getParamBatch(); this.sjdr = new ServiceJeuDeRegleOperation(); - this.jdr = new JeuDeRegle(); // Nom des tables temporaires this.tableControleDataTemp = FormatSQL.temporaryTableName("controle_data_temp"); @@ -160,12 +159,14 @@ private void preparation() throws ArcException { */ private void execute() throws ArcException { StaticLoggerDispatcher.info(LOGGER, "** execute CONTROLE sur la table : " + this.tableControleDataTemp + " **"); - - // Récupération des Jeux de règles associés - this.sjdr.fillRegleControle(this.connexion.getExecutorConnection(), jdr, ViewEnum.CONTROLE_REGLE.getFullName(envExecution), - this.tableControleDataTemp); - this.sjdr.executeJeuDeRegle(this.connexion.getExecutorConnection(), jdr, this.tableControleDataTemp); + this.fileIdCard = RulesOperations.fileIdCardFromPilotage(this.connexion.getExecutorConnection(), + tableControleDataTemp, this.idSource); + + // Récupération des Jeux de règles associés + ControleRulesOperation.fillControleRules(this.connexion.getExecutorConnection(), tableControleDataTemp, fileIdCard); + + this.sjdr.executeJeuDeRegle(this.connexion.getExecutorConnection(), fileIdCard, this.tableControleDataTemp); } diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java new file mode 100644 index 000000000..a47300f81 --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java @@ -0,0 +1,23 @@ +package fr.insee.arc.core.service.p4controle.bo; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import fr.insee.arc.utils.exception.ArcException; + +public class ControleTypeCodeTest { + + + @Test + public void getEnum_test_ok() throws ArcException { + + assertEquals(ControleTypeCode.NUM, ControleTypeCode.getEnum("NUM")); + } + + @Test(expected = ArcException.class) + public void getEnum_test_ko() throws ArcException { + ControleTypeCode.getEnum("type de chargement inexistant"); + } + +} diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java index c5d32a610..f173b60d9 100644 --- a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java @@ -76,6 +76,7 @@ public void fillControleRulesTest() throws ArcException { assertEquals("3", regleControle.getBorneSup()); assertEquals("requete", regleControle.getCondition()); assertEquals("pretraitement", regleControle.getPreAction()); + assertEquals(1, regleControle.getIdRegle()); assertEquals(1, regleControle.getXsdOrdre()); assertEquals("xsd1", regleControle.getXsdLabelFils()); assertEquals("xsd2", regleControle.getXsdRole()); diff --git a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java index ce9db9df1..25f7ec2ae 100644 --- a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java +++ b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java @@ -2,9 +2,10 @@ import java.io.IOException; -import fr.insee.arc.core.dataobjects.ViewEnum; -import fr.insee.arc.core.service.global.bo.JeuDeRegle; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.global.bo.Sandbox; +import fr.insee.arc.core.service.global.dao.RulesOperations; +import fr.insee.arc.core.service.p4controle.operation.ControleRulesOperation; import fr.insee.arc.core.service.p4controle.operation.ServiceJeuDeRegleOperation; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.FormatSQL; @@ -40,10 +41,12 @@ public PhaseInterface execute() throws IOException, ArcException ServiceJeuDeRegleOperation sjdr = new ServiceJeuDeRegleOperation(); // Récupération des règles de controles associées aux jeux de règle - JeuDeRegle jdr = new JeuDeRegle(); + FileIdCard fileIdCard = RulesOperations.fileIdCardFromPilotage(this.sandbox.getConnection(), + phaseInterface.getOutputTable(), this.bodyPojo.getFileName()); + + ControleRulesOperation.fillControleRules(this.sandbox.getConnection(), phaseInterface.getOutputTable(), fileIdCard); - sjdr.fillRegleControle(this.sandbox.getConnection(), jdr, ViewEnum.CONTROLE_REGLE.getFullName(this.sandbox.getSchema()), phaseInterface.getOutputTable()); - sjdr.executeJeuDeRegle(this.sandbox.getConnection(), jdr, phaseInterface.getOutputTable()); + sjdr.executeJeuDeRegle(this.sandbox.getConnection(), fileIdCard, phaseInterface.getOutputTable()); PhaseInterface returnInterface = new PhaseInterface(); From 1a9a30e144aef6b596bd967abbd81ca6f84382df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Manelphe?= Date: Mon, 13 Nov 2023 17:26:11 +0100 Subject: [PATCH 04/13] fix: exception messages --- .../utils/exception/ArcExceptionMessage.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java b/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java index fd38603f0..bbdff899b 100644 --- a/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java +++ b/arc-utils/src/main/java/fr/insee/arc/utils/exception/ArcExceptionMessage.java @@ -14,7 +14,7 @@ public enum ArcExceptionMessage { FILE_CLOSE_FAILED("Le fichier %s n'a pas pu être fermé"), STREAM_READ_FAILED("Le stream de données n'a pas pu être lu"), STREAM_WRITE_FAILED("Le stream de données n'a pas pu être écrit"), - TGZ_CONVERSION_FAILED("Le fichier %s n'a pu être converti en tgz"), + TGZ_CONVERSION_FAILED("Le fichier %s n'a pas pu être converti en tgz"), INVALID_FILE_FORMAT("Format de fichier non pris en charge"), @@ -22,21 +22,21 @@ public enum ArcExceptionMessage { IMPORTING_JAVA_EXCEPTION_HEADERS_MISSING("ERROR: extra data after last expected column"), IMPORTING_JAVA_EXCEPTION_DATA_MISSING("ERROR: missing data for column"), IMPORTING_COLUMNS_MISSING("Il manque une ou plusieurs colonnes dans le corps du fichier"), - IMPORTING_HEADERS_MISSING("Il manque un ou plusieurs entetes dans le fichier"), + IMPORTING_HEADERS_MISSING("Il manque un ou plusieurs entêtes dans le fichier"), IMPORTING_FAILED("L'import des données a échoué"), - XML_KEYVALUE_CONVERSION_FAILED("Le fichier clé/valeur %s n'a pu être converti en xml"), + XML_KEYVALUE_CONVERSION_FAILED("Le fichier clé/valeur %s n'a pas pu être converti en xml"), XML_SAX_PARSING_FAILED("Le moteur SAX XML n'a pas pu parser le fichier %s"), JSON_PARSING_FAILED("Le moteur JSON n'a pas pu parser l'élément"), - LOAD_PARALLEL_INSERT_THREAD_FAILED("L'insertion en parallele des données a échoué"), - LOAD_KEYVALUE_VAR_NOT_EXISTS_IN_FORMAT_RULES("La rubrique fille %s n'existe pas les règles de formatage"), + LOAD_PARALLEL_INSERT_THREAD_FAILED("L'insertion en parallèle des données a échoué"), + LOAD_KEYVALUE_VAR_NOT_EXISTS_IN_FORMAT_RULES("La rubrique fille %s n'existe pas dans les règles de formatage"), LOAD_RULES_NOT_FOUND("La norme %s n'a pas de règles de chargement"), LOAD_RULES_SEVERAL("La norme %s a plusieurs règles de chargement"), - LOAD_SEVERAL_NORM_FOUND("Plusieurs normes ou validité correspondent à l'expression : %s"), + LOAD_SEVERAL_NORM_FOUND("Plusieurs normes ou validités correspondent à l'expression : %s"), LOAD_NORM_NOT_FOUND("Aucune norme trouvée pour le fichier %s"), LOAD_ZERO_NORM_FOUND("Aucune norme trouvée"), LOAD_TYPE_NOT_FOUND("Le type de chargement %s n'existe pas"), @@ -48,14 +48,14 @@ public enum ArcExceptionMessage { MAPPING_EXPRESSION_GROUP_INVALID("L'expression de groupe %s dans la règle %s est invalide"), MAPPING_EXPRESSION_GROUP_MULTI_REFERENCE("L'expression %s comporte plusieurs références au numéro de groupe %s"), MAPPING_EXPRESSION_GROUP_ILLEGAL_CALL("Cette méthode ne devrait pas être appelée par la classe RegleMappingGroupe"), - MAPPING_RULES_NOT_FOUND("Aucune règle de mapping n'a été trouvé dans le jeu de règle"), - MAPPING_RULES_NON_UNIQUE("Plusieurs règles de mapping ont été trouvé dans le jeu de règle pour le fichier"), + MAPPING_RULES_NOT_FOUND("Aucune règle de mapping n'a été trouvée dans le jeu de règle"), + MAPPING_RULES_NON_UNIQUE("Plusieurs règles de mapping ont été trouvées dans le jeu de règle pour le fichier"), MAPPING_VARIABLE_NOT_FOUND_IN_MODEL("La variable %s n'est pas déclarée dans le modèle de la famille"), - NORMAGE_VALIDITE_DATE_PARSE_FAILED ("Le champ validite %s ne peut être converti en date"), + NORMAGE_VALIDITE_DATE_PARSE_FAILED ("Le champ validité %s ne peut être converti en date"), NORMAGE_INDEPENDANCE_BLOC_INVALID_IDENTIFIER("La rubrique %s n'identifie pas un bloc"), - NORMAGE_INDEPENDANCE_BLOC_INVALID_FATHER("La rubrique %s n'a pas le même pere que les autres rubriques du bloc"), + NORMAGE_INDEPENDANCE_BLOC_INVALID_FATHER("La rubrique %s n'a pas le même père que les autres rubriques du bloc"), NORMAGE_TYPE_NOT_FOUND("Le type de normage %s n'existe pas"), CONTROLE_XSD_ENUM_EMPTY("L'énumération XSD pour le type de règle de contrôle ENUM_BRUTE ne peut pas être vide"), @@ -64,32 +64,33 @@ public enum ArcExceptionMessage { CONTROLE_XSD_INVALID_CHILDREN_POSITION("Au moins un élément parmi les enfants de %s a été écrasé parce que les positions sont mal définies"), CONTROLE_XSD_INFINITE_LOOP("L'élément %s appartient à une relation cyclique : %s"), EXTRACT_XSD_TYPE_UNSOLVED("Le type XSD ne peut pas être determiné : plusieurs types possibles pour le même élémént"), + CONTROLE_TYPE_NOT_FOUND("Le type de contrôle %s n'existe pas"), - MULTITHREADING_CLASS_NOT_USEABLE("Ce type de class n'est pas pris en charge dans le multithreading"), + MULTITHREADING_CLASS_NOT_USEABLE("Ce type de classe n'est pas pris en charge dans le multithreading"), MULTITHREADING_CONNECTIONS_CLOSE_FAILED("Error in closing threads connections"), HASH_FAILED("Le hashage de %s a échoué"), DATABASE_ROLLBACK_FAILED("Le rollback de la base de données a échoué"), - DATABASE_INITIALISATION_SCRIPT_FAILED("Le script de mis a jour de la base de donnée n'a pu être lu"), + DATABASE_INITIALISATION_SCRIPT_FAILED("Le script de mise à jour de la base de données n'a pu être lu"), - DDI_FAMILY_ALREADY_EXISTS("Les familles présentent dans le DDI existe déjà"), - DDI_PARSING_FAILED("Le fichier xml DDI n'a pas pu être parsé correctement"), + DDI_FAMILY_ALREADY_EXISTS("Les familles présentes dans le DDI existent déjà"), + DDI_PARSING_FAILED("Le fichier XML DDI n'a pas pu être parsé correctement"), - DATABASE_CONNECTION_FAILED("La connexion a la base de données a échoué"), - DATABASE_CONNECTION_COORDINATOR_FAILED("La connexion a la base de données coordinator a échoué"), - DATABASE_CONNECTION_EXECUTOR_FAILED("La connexion a une base de données executor a échoué"), + DATABASE_CONNECTION_FAILED("La connexion à la base de données a échoué"), + DATABASE_CONNECTION_COORDINATOR_FAILED("La connexion à la base de données coordinator a échoué"), + DATABASE_CONNECTION_EXECUTOR_FAILED("La connexion à une base de données executor a échoué"), - SQL_DATE_PARSE_FAILED("L'expression %s n'a pas pu être converti au format date java %s"), + SQL_DATE_PARSE_FAILED("L'expression %s n'a pas pu être convertie au format date java %s"), SQL_EXECUTE_FAILED("L'exécution de la requête dans la base de données a échoué"), WS_RETRIEVE_DATA_FAMILY_FORBIDDEN("Vous ne pouvez pas accéder à cette famille de norme"), - WS_RETRIEVE_DATA_FAMILY_CREATION_FAILED("Les tables de la famille de norme n'ont pas pu être crées"), + WS_RETRIEVE_DATA_FAMILY_CREATION_FAILED("Les tables de la famille de norme n'ont pas pu être créées"), IHM_NMCL_COLUMN_IN_FILE_BUT_NOT_IN_SCHEMA("La colonne %s n'est pas déclarée dans le schéma"), IHM_NMCL_COLUMN_IN_SCHEMA_BUT_NOT_IN_FILE("La colonne est déclarée dans le schéma mais absente du fichier"), - IHM_NMCL_IMPORT_FAILED("Le fichier n'a pu être lu. Il doit être au format csv non compressé, le nom des colonnes en première ligne, le type des colonne en 2ieme ligne."), + IHM_NMCL_IMPORT_FAILED("Le fichier n'a pas pu être lu. Il doit être au format csv non compressé, le nom des colonnes en première ligne, le type des colonnes en deuxième ligne."), GENERIC_BEAN_KEY_VALUE_FAILED("GenericBean keyValue : the set hasn't exactly 2 elements and cannot be mapped to key>value format"), GENERIC_BEAN_DUPLICATE_KEY("GenericBean keyValue : duplicate key %s"), @@ -101,8 +102,8 @@ public enum ArcExceptionMessage { GUI_FAMILLENORME_VARIABLE_ALREADY_EXISTS("La variable existe déjà. Pour la modifier, passez par la ligne correspondante du tableau variable*table.\nAucune variable n'a été ajoutée.\n"), GUI_EXPORT_TABLE_NOT_EXISTS("La table n'existe pas"), - DATE_PARSE_FAILED_VALIDITE_INF("La validité inf %s n'a pu être parsée"), - DATE_PARSE_FAILED_VALIDITE_SUP("La validité sup %s n'a pu être parsée") + DATE_PARSE_FAILED_VALIDITE_INF("La validité inf %s n'a pas pu être parsée"), + DATE_PARSE_FAILED_VALIDITE_SUP("La validité sup %s n'a pas pu être parsée") ; From 27bb38885fd893f26b954d2ee74fe845eb9fee64 Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Mon, 13 Nov 2023 19:08:57 +0100 Subject: [PATCH 05/13] fix: retrieve fileIdCard in normage --- .../arc/core/service/p3normage/thread/ThreadNormageService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java index b5d613041..134346e2a 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/thread/ThreadNormageService.java @@ -162,7 +162,7 @@ private void creerTableTravail() throws ArcException { this.fileIdCard = RulesOperations.fileIdCardFromPilotage(this.connexion.getExecutorConnection(), - tableNormageDataTemp, this.idSource); + tableNormagePilTemp, this.idSource); NormageRulesOperation.fillNormageRules(this.connexion.getExecutorConnection(), this.envExecution, fileIdCard); From a6681b473a8ef8045e9259b23e06648d6cc7ef3c Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Tue, 14 Nov 2023 10:30:27 +0100 Subject: [PATCH 06/13] fix: loggers test --- .../java/fr/insee/arc/utils/exception/ArcExceptionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arc-utils/src/test/java/fr/insee/arc/utils/exception/ArcExceptionTest.java b/arc-utils/src/test/java/fr/insee/arc/utils/exception/ArcExceptionTest.java index 0022d8e34..5e9dfe54f 100644 --- a/arc-utils/src/test/java/fr/insee/arc/utils/exception/ArcExceptionTest.java +++ b/arc-utils/src/test/java/fr/insee/arc/utils/exception/ArcExceptionTest.java @@ -26,9 +26,9 @@ public class ArcExceptionTest { private final static String RUBRIQUE_NAME = "ma_rubrique"; private final static String EXPECTED_MESSAGE_BUSINESS_EXCEPTION = String - .format("%s La rubrique fille %s n'existe pas les règles de formatage", Level.ERROR.toString(), RUBRIQUE_NAME); + .format("%s La rubrique fille %s n'existe pas dans les règles de formatage", Level.ERROR.toString(), RUBRIQUE_NAME); private final static String EXPECTED_STACK_BUSINESS_EXCEPTION = String - .format("java.lang.Throwable: La rubrique fille %s n'existe pas les règles de formatage", RUBRIQUE_NAME); + .format("java.lang.Throwable: La rubrique fille %s n'existe pas dans les règles de formatage", RUBRIQUE_NAME); @Test From 33f9e070b75976661884fdc981b3aafa397ff2dd Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Tue, 14 Nov 2023 10:37:09 +0100 Subject: [PATCH 07/13] fix: fileIdCard Controle --- .../service/p4controle/thread/ThreadControleService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java index d3a052c55..eb665c910 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java @@ -49,9 +49,7 @@ public class ThreadControleService extends ApiControleService implements Runnabl private String tableOutKo; private ServiceJeuDeRegleOperation sjdr; - - private FileIdCard fileIdCard; - + private ThreadOperations arcThreadGenericDao; private GenericQueryDao genericExecutorDao; @@ -160,8 +158,8 @@ private void preparation() throws ArcException { private void execute() throws ArcException { StaticLoggerDispatcher.info(LOGGER, "** execute CONTROLE sur la table : " + this.tableControleDataTemp + " **"); - this.fileIdCard = RulesOperations.fileIdCardFromPilotage(this.connexion.getExecutorConnection(), - tableControleDataTemp, this.idSource); + FileIdCard fileIdCard = RulesOperations.fileIdCardFromPilotage(this.connexion.getExecutorConnection(), + tableControlePilTemp, this.idSource); // Récupération des Jeux de règles associés ControleRulesOperation.fillControleRules(this.connexion.getExecutorConnection(), tableControleDataTemp, fileIdCard); From 1a6b43ca993c9522ac703d85d00fa1cc54183eb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Manelphe?= Date: Tue, 14 Nov 2023 17:33:34 +0100 Subject: [PATCH 08/13] fix: envExecution in fillControlRules call --- .../core/service/p4controle/thread/ThreadControleService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java index eb665c910..01ae187de 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java @@ -162,7 +162,7 @@ private void execute() throws ArcException { tableControlePilTemp, this.idSource); // Récupération des Jeux de règles associés - ControleRulesOperation.fillControleRules(this.connexion.getExecutorConnection(), tableControleDataTemp, fileIdCard); + ControleRulesOperation.fillControleRules(this.connexion.getExecutorConnection(), envExecution, fileIdCard); this.sjdr.executeJeuDeRegle(this.connexion.getExecutorConnection(), fileIdCard, this.tableControleDataTemp); From a1d9080d75553e7468b690e57c625d1c65618fc7 Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Thu, 16 Nov 2023 15:26:17 +0100 Subject: [PATCH 09/13] fix: fileIdCard --- .../p3normage/operation/NormageOperation.java | 36 +++++++++---------- .../operation/NormageRulesOperation.java | 6 ++-- .../service/p4controle/bo/RegleControle.java | 34 +----------------- .../operation/ControleRulesOperation.java | 27 +++++++------- .../thread/ThreadControleService.java | 2 +- .../operation/MappingRulesOperation.java | 4 +-- .../operation/ControleRulesOperationTest.java | 3 -- 7 files changed, 37 insertions(+), 75 deletions(-) diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java index 8a5561593..b6ba217a9 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageOperation.java @@ -295,25 +295,21 @@ private ArcPreparedStatementBuilder applyQueryPlanParametersOnJointure(ArcPrepar */ private void executerJointure(FileIdCard fileIdCard) throws ArcException { - StaticLoggerDispatcher.info(LOGGER, "Normage avec jointure sans partition sur " + fileIdCard.getIdSource()); + StaticLoggerDispatcher.info(LOGGER, "Normage avec jointure sur " + fileIdCard.getIdSource()); List reglesPartition = fileIdCard.getIdCardNormage().getReglesNormage(TypeNormage.PARTITION); - - - // only first partition rule is processed - for (int j = 0; j < reglesPartition.size(); j++) { - - String element = reglesPartition.get(j).getRubrique(); - int minSize = Integer.parseInt(reglesPartition.get(j).getRubriqueNmcl().split(",")[0]); - int chunkSize = Integer.parseInt(reglesPartition.get(j).getRubriqueNmcl().split(",")[1]); - executerJointureWithPartition(fileIdCard, element, minSize, chunkSize); + if (!reglesPartition.isEmpty()) { + String element = reglesPartition.get(0).getRubrique(); + int minSize = Integer.parseInt(reglesPartition.get(0).getRubriqueNmcl().split(",")[0]); + int chunkSize = Integer.parseInt(reglesPartition.get(0).getRubriqueNmcl().split(",")[1]); + executerJointureWithPartition(fileIdCard, element, minSize, chunkSize); + } else { + // No partition rules found; normal execution + UtilitaireDao.get(0).executeImmediate(connection, + applyQueryPlanParametersOnJointure(replaceQueryParameters(fileIdCard.getJointure(), fileIdCard))); } - // No partition found; normal execution - UtilitaireDao.get(0).executeImmediate(connection, applyQueryPlanParametersOnJointure( - replaceQueryParameters(fileIdCard.getJointure() ,fileIdCard))); - } /** @@ -333,13 +329,14 @@ private void executerJointure(FileIdCard fileIdCard) throws ArcException { * @param chunkSize * @throws ArcException */ - private void executerJointureWithPartition(FileIdCard fileIdCard, String element, int minSize, - int chunkSize) throws ArcException { + private void executerJointureWithPartition(FileIdCard fileIdCard, String element, int minSize, int chunkSize) + throws ArcException { - StaticLoggerDispatcher.info(LOGGER, "Normage avec jointure et partition " + fileIdCard.getIdSource()); + StaticLoggerDispatcher.info(LOGGER, "Normage avec règle de partition " + fileIdCard.getIdSource()); /* get the query blocks */ - String blocCreate = ManipString.substringBeforeFirst(fileIdCard.getJointure(), "\n insert into {table_destination} "); + String blocCreate = ManipString.substringBeforeFirst(fileIdCard.getJointure(), + "\n insert into {table_destination} "); String blocInsert = "\n insert into {table_destination} " + ManipString.substringAfterFirst(fileIdCard.getJointure(), "\n insert into {table_destination} "); @@ -411,7 +408,8 @@ private void executerJointureWithPartition(FileIdCard fileIdCard, String element private String replaceQueryParameters(String query, FileIdCard fileIdCard) { return query.replace("{table_source}", tableSource).replace("{table_destination}", tableDestination) - .replace("{id_norme}", fileIdCard.getIdNorme()).replace("{validite}", fileIdCard.getValidite()).replace("{periodicite}", fileIdCard.getPeriodicite()) + .replace("{id_norme}", fileIdCard.getIdNorme()).replace("{validite}", fileIdCard.getValidite()) + .replace("{periodicite}", fileIdCard.getPeriodicite()) .replace("{nom_fichier}", fileIdCard.getIdSource()); } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java index 3102b200e..f79f9f1f1 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/operation/NormageRulesOperation.java @@ -38,9 +38,9 @@ public static void fillNormageRules(Connection connection, String envExecution, List listRegles = new ArrayList<>(); for(int i = 0; i < regle.get(ColumnEnum.ID_CLASSE.getColumnName()).size(); i++) { listRegles.add(new RegleNormage( - TypeNormage.getEnum(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(0)), - regle.get(ColumnEnum.RUBRIQUE.getColumnName()).get(0), - regle.get(ColumnEnum.RUBRIQUE_NMCL.getColumnName()).get(0) + TypeNormage.getEnum(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(i)), + regle.get(ColumnEnum.RUBRIQUE.getColumnName()).get(i), + regle.get(ColumnEnum.RUBRIQUE_NMCL.getColumnName()).get(i) )); } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java index 87a5d5e80..18f91a64c 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java @@ -13,16 +13,11 @@ public class RegleControle { private String preAction; // aka prétraitement SQL private int idRegle; - private int xsdOrdre; - private String xsdLabelFils; - private String xsdRole; - private String seuilBloquant; // aka blocking_threshold private String traitementLignesErreur; // aka error_row_processing public RegleControle(ControleTypeCode typeControle, String rubriquePere, String rubriqueFils, String borneInf, - String borneSup, String condition, String preAction, int idRegle, int xsdOrdre, String xsdLabelFils, String xsdRole, - String seuilBloquant, String traitementLignesErreur) { + String borneSup, String condition, String preAction, int idRegle, String seuilBloquant, String traitementLignesErreur) { super(); this.typeControle = typeControle; this.rubriquePere = rubriquePere; @@ -32,9 +27,6 @@ public RegleControle(ControleTypeCode typeControle, String rubriquePere, String this.condition = condition; this.preAction = preAction; this.idRegle = idRegle; - this.xsdOrdre = xsdOrdre; - this.xsdLabelFils = xsdLabelFils; - this.xsdRole = xsdRole; this.seuilBloquant = seuilBloquant; this.traitementLignesErreur = traitementLignesErreur; } @@ -107,30 +99,6 @@ public void setIdRegle(int idRegle) { this.idRegle = idRegle; } - public int getXsdOrdre() { - return xsdOrdre; - } - - public void setXsdOrdre(int xsdOrdre) { - this.xsdOrdre = xsdOrdre; - } - - public String getXsdLabelFils() { - return xsdLabelFils; - } - - public void setXsdLabelFils(String xsdLabelFils) { - this.xsdLabelFils = xsdLabelFils; - } - - public String getXsdRole() { - return xsdRole; - } - - public void setXsdRole(String xsdRole) { - this.xsdRole = xsdRole; - } - public String getSeuilBloquant() { return seuilBloquant; } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java index 34938ab72..2fb87ee32 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java @@ -37,23 +37,22 @@ public static void fillControleRules(Connection connection, String envExecution, List listRegles = new ArrayList<>(); for(int i = 0; i < regle.get(ColumnEnum.ID_CLASSE.getColumnName()).size(); i++) { listRegles.add(new RegleControle( - ControleTypeCode.getEnum(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(0)), - regle.get(ColumnEnum.RUBRIQUE_PERE.getColumnName()).get(0), - regle.get(ColumnEnum.RUBRIQUE_FILS.getColumnName()).get(0), - regle.get(ColumnEnum.BORNE_INF.getColumnName()).get(0), - regle.get(ColumnEnum.BORNE_SUP.getColumnName()).get(0), - regle.get(ColumnEnum.CONDITION.getColumnName()).get(0), - regle.get(ColumnEnum.PRE_ACTION.getColumnName()).get(0), - Integer.parseInt(regle.get(ColumnEnum.ID_REGLE.getColumnName()).get(0)), - Integer.parseInt(regle.get(ColumnEnum.XSD_ORDRE.getColumnName()).get(0)), - regle.get(ColumnEnum.XSD_LABEL_FILS.getColumnName()).get(0), - regle.get(ColumnEnum.XSD_ROLE.getColumnName()).get(0), - regle.get(ColumnEnum.BLOCKING_THRESHOLD.getColumnName()).get(0), - regle.get(ColumnEnum.ERROR_ROW_PROCESSING.getColumnName()).get(0) + ControleTypeCode.getEnum(regle.get(ColumnEnum.ID_CLASSE.getColumnName()).get(i)), + regle.get(ColumnEnum.RUBRIQUE_PERE.getColumnName()).get(i), + regle.get(ColumnEnum.RUBRIQUE_FILS.getColumnName()).get(i), + regle.get(ColumnEnum.BORNE_INF.getColumnName()).get(i), + regle.get(ColumnEnum.BORNE_SUP.getColumnName()).get(i), + regle.get(ColumnEnum.CONDITION.getColumnName()).get(i), + regle.get(ColumnEnum.PRE_ACTION.getColumnName()).get(i), + Integer.parseInt(regle.get(ColumnEnum.ID_REGLE.getColumnName()).get(i)), + regle.get(ColumnEnum.BLOCKING_THRESHOLD.getColumnName()).get(i), + regle.get(ColumnEnum.ERROR_ROW_PROCESSING.getColumnName()).get(i) )); + + } fileIdCard.setIdCardControle( new IdCardControle(listRegles)); } - + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java index eb665c910..de8510ac2 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java @@ -162,7 +162,7 @@ private void execute() throws ArcException { tableControlePilTemp, this.idSource); // Récupération des Jeux de règles associés - ControleRulesOperation.fillControleRules(this.connexion.getExecutorConnection(), tableControleDataTemp, fileIdCard); + ControleRulesOperation.fillControleRules(this.connexion.getExecutorConnection(), this.envExecution, fileIdCard); this.sjdr.executeJeuDeRegle(this.connexion.getExecutorConnection(), fileIdCard, this.tableControleDataTemp); diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java index 40258dbf5..d900b0455 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p5mapping/operation/MappingRulesOperation.java @@ -36,8 +36,8 @@ public static void fillMappingRules(Connection connection, String envExecution, List listRegles = new ArrayList<>(); for(int i = 0; i < regle.get(ColumnEnum.VARIABLE_SORTIE.getColumnName()).size(); i++) { listRegles.add(new RegleMapping( - regle.get(ColumnEnum.VARIABLE_SORTIE.getColumnName()).get(0), - regle.get(ColumnEnum.EXPR_REGLE_COL.getColumnName()).get(0) + regle.get(ColumnEnum.VARIABLE_SORTIE.getColumnName()).get(i), + regle.get(ColumnEnum.EXPR_REGLE_COL.getColumnName()).get(i) )); } fileIdCard.setIdCardMapping( diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java index f173b60d9..847e91598 100644 --- a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java @@ -77,9 +77,6 @@ public void fillControleRulesTest() throws ArcException { assertEquals("requete", regleControle.getCondition()); assertEquals("pretraitement", regleControle.getPreAction()); assertEquals(1, regleControle.getIdRegle()); - assertEquals(1, regleControle.getXsdOrdre()); - assertEquals("xsd1", regleControle.getXsdLabelFils()); - assertEquals("xsd2", regleControle.getXsdRole()); assertEquals(">0u", regleControle.getSeuilBloquant()); assertEquals("e", regleControle.getTraitementLignesErreur()); } From ce9250eb8653d3737592a4fee59b7804188d260b Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Fri, 17 Nov 2023 17:00:18 +0100 Subject: [PATCH 10/13] fix: comparaison case with controle phase rubrique --- .../insee/arc/core/service/p4controle/bo/RegleControle.java | 4 ++-- .../p4controle/operation/ServiceJeuDeRegleOperation.java | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java index 18f91a64c..5879a03f2 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java @@ -44,7 +44,7 @@ public void setTypeControle(ControleTypeCode typeControle) { } public String getRubriquePere() { - return rubriquePere; + return rubriquePere==null?null:rubriquePere.toUpperCase(); } public void setRubriquePere(String rubriquePere) { @@ -52,7 +52,7 @@ public void setRubriquePere(String rubriquePere) { } public String getRubriqueFils() { - return rubriqueFils; + return rubriqueFils==null?null:rubriqueFils.toUpperCase(); } public void setRubriqueFils(String rubriqueFils) { diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java index 85a4f0d05..da0bf691d 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java @@ -101,10 +101,6 @@ private void preAction(Connection connexion, FileIdCard fileIdCard, String table */ for (RegleControle reg : fileIdCard.getIdCardControle().getReglesControle()) { if (reg.getPreAction() != null && !StringUtils.isEmpty(reg.getPreAction())) { - /** - * si la rubrique de la preaction n'est pas dans la table, il ne faut rien - * calculer - */ p.add(ManipString.extractAllRubrique(reg.getPreAction()) + " as " + reg.getRubriquePere()); } } From 3d372794ab5ed368c3ed872d5990418c78ed5048 Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Fri, 17 Nov 2023 17:04:26 +0100 Subject: [PATCH 11/13] fix: fileIdCard controle test --- .../p4controle/operation/ControleRulesOperationTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java index 847e91598..68f1577db 100644 --- a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java @@ -70,8 +70,9 @@ public void fillControleRulesTest() throws ArcException { // assertions RegleControle regleControle = fileIdCard.getIdCardControle().getReglesControle().get(0); assertEquals(ControleTypeCode.CARDINALITE, regleControle.getTypeControle()); - assertEquals("col1", regleControle.getRubriquePere()); - assertEquals("col2", regleControle.getRubriqueFils()); + // rubriques are meant to be set in uppercase + assertEquals("COL1", regleControle.getRubriquePere()); + assertEquals("COL2", regleControle.getRubriqueFils()); assertEquals("2", regleControle.getBorneInf()); assertEquals("3", regleControle.getBorneSup()); assertEquals("requete", regleControle.getCondition()); From 23312f3b7994d92f8bb375cfa527a1dc55ee5d78 Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Fri, 17 Nov 2023 17:16:26 +0100 Subject: [PATCH 12/13] fix: using format.touppercase --- .../insee/arc/core/service/p4controle/bo/RegleControle.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java index 5879a03f2..633be711b 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java @@ -1,5 +1,7 @@ package fr.insee.arc.core.service.p4controle.bo; +import fr.insee.arc.utils.format.Format; + public class RegleControle { private ControleTypeCode typeControle; // aka id_classe @@ -44,7 +46,7 @@ public void setTypeControle(ControleTypeCode typeControle) { } public String getRubriquePere() { - return rubriquePere==null?null:rubriquePere.toUpperCase(); + return Format.toUpperCase(rubriquePere); } public void setRubriquePere(String rubriquePere) { @@ -52,7 +54,7 @@ public void setRubriquePere(String rubriquePere) { } public String getRubriqueFils() { - return rubriqueFils==null?null:rubriqueFils.toUpperCase(); + return Format.toUpperCase(rubriqueFils); } public void setRubriqueFils(String rubriqueFils) { From 2ebfe460c7a1c48d1a5e236b2225f78181ebe4ba Mon Sep 17 00:00:00 2001 From: Manuel Soulier Date: Fri, 17 Nov 2023 18:27:09 +0100 Subject: [PATCH 13/13] fix: use ControleType enum instead of string --- .../p4controle/dao/ControleRegleDao.java | 59 +++++++++---------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java index ce2ffa358..97314c095 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java @@ -224,7 +224,7 @@ public String ctlIsAlphanum(RegleControle reg) { } public String ctlCardinalite(RegleControle reg, List listRubriqueExpr, - List ListRubriqueTable) { + List listRubriqueTable) { // on retire le pere et le fils de la liste d'expr // on pourrait tout traiter pareil (pere, fils et autres...) mais vraiment pas @@ -242,7 +242,7 @@ public String ctlCardinalite(RegleControle reg, List listRubriqueExpr, // cas 1 : présente dans la table // cas 2 : non present dans la table et identifiante // cas 3 : non present dans la table et valeur - if (ListRubriqueTable.contains(reg.getRubriqueFils())) { + if (listRubriqueTable.contains(reg.getRubriqueFils())) { requete.append("," + reg.getRubriqueFils() + " "); } else { if (reg.getRubriqueFils().toLowerCase().startsWith("i_")) { @@ -254,7 +254,7 @@ public String ctlCardinalite(RegleControle reg, List listRubriqueExpr, // rubriques de l'expression for (String s : listRubriqueExpr) { - if (ListRubriqueTable.contains(s)) { + if (listRubriqueTable.contains(s)) { // on refait les identifiants pour que // la valeur -1 corresponde au fait que la rubrique n'existe pas (null sur tout // le groupe ou inexistante) @@ -410,38 +410,37 @@ private String conditionCardinalite(RegleControle reg) { private String rewriteCondition(Map mapRubrique, String condition0) { StaticLoggerDispatcher.debug(logger, "Je rentre dans la méthode rewriteCondition"); // Passage en MAJUSCULE car la map contient des elements en majuscule - // bétonnage du code pour que le .uppercase ne lève pas de null pointerException - String cond; if (condition0 == null) { return condition0; } - cond = condition0.toUpperCase(); - String type = ""; - String rubrique = ""; - String format = ""; + + // uppercase the condition because the map contains uppercase key + String condition = Pattern.compile("\\{[^\\{\\}]*}").matcher(condition0).replaceAll(occ -> occ.group().toUpperCase()); + for (Entry entry : mapRubrique.entrySet()) { StaticLoggerDispatcher.debug(logger, "A l'intérieur de la boucle FOR"); - type = entry.getValue().getTypeControle().getNom().trim(); - rubrique = entry.getKey().trim(); - StaticLoggerDispatcher.debug(logger, "Mon type : " + type + ", ma rubrique : " + rubrique); - switch (type) { - case "NUM": - cond = cond.replace("{" + rubrique + "}", "cast(" + rubrique + " as numeric)"); - StaticLoggerDispatcher.debug(logger, "la nouvelle condition : " + cond); + + String rubrique = entry.getKey().trim(); + StaticLoggerDispatcher.debug(logger, "Ma rubrique : " + rubrique); + + switch (entry.getValue().getTypeControle()) { + case NUM: + condition = condition.replace("{" + rubrique + "}", "cast(" + rubrique + " as numeric)"); + StaticLoggerDispatcher.debug(logger, "la nouvelle condition : " + condition); break; - case "DATE": - - format = entry.getValue().getCondition().trim(); + case DATE: + String format = entry.getValue().getCondition().trim(); + StaticLoggerDispatcher.debug(logger, "format vaut : " + format); - cond = cond.replace("{" + rubrique + "}", "to_date(" + rubrique + ",'" + format + "')"); - StaticLoggerDispatcher.debug(logger, "la nouvelle condition : " + cond); + condition = condition.replace("{" + rubrique + "}", "to_date(" + rubrique + ",'" + format + "')"); + StaticLoggerDispatcher.debug(logger, "la nouvelle condition : " + condition); break; default: - cond = cond.replace("{" + rubrique + "}", rubrique); + condition = condition.replace("{" + rubrique + "}", rubrique); break; } } - return cond; + return condition; } /** @@ -456,28 +455,24 @@ private String rewriteCondition(Map mapRubrique, String c */ private String writeFiltre(Map mapRubrique) { String filtre = ""; - String type = ""; - String rubrique = ""; - String format = ""; int i = 0; for (Entry entry : mapRubrique.entrySet()) { - type = entry.getValue().getTypeControle().getNom().trim(); - rubrique = entry.getKey().trim(); - format = entry.getValue().getCondition(); + String rubrique = entry.getKey().trim(); + String format = entry.getValue().getCondition(); if (i > 0) { filtre = filtre + " AND "; } - switch (type) { - case "NUM": + switch (entry.getValue().getTypeControle()) { + case NUM: filtre = filtre + " (case when {1} IS NULL then true when {0} IS NULL then true else {0} ~ '^-?\\d*(\\.\\d+)?$' end) "; filtre = getRequete(filtre, rubrique, "i_" + ManipString.substringAfterFirst(rubrique, "_")); break; - case "DATE": + case DATE: filtre = filtre + " (case when {1} IS NULL then true when {0} IS NULL then true else arc.isdate({0},'{2}') end )"; filtre = getRequete(filtre, rubrique, "i_" + ManipString.substringAfterFirst(rubrique, "_"), format);