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();