Rev 3303 | Rev 3439 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php
// declare(encoding='UTF-8');
/**
* Classe de nettoyage de la base de données du CEL.
* Suppression des antislash
* Remplacement des chaines vides par des NULL
* Unifier les référentiels : pas de nom de version, majuscule...
* Unifier les certitudes
* Supprimer les INSEE-C: non rempli, les dates 0000-00
*
* Utilisation :
* - <code>/opt/lamp/bin/php cli.php nettoyage -a (voir méthode executer)</code>
*
* @category CEL
* @package Scripts
* @subpackage Nettoyage
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2016 Tela Botanica <accueil@tela-botanica.org>
*/
class Nettoyage extends Script {
protected $bdd;
protected $colonnes;
public function __construct($script_nom, $parametres_cli) {
parent::__construct($script_nom, $parametres_cli);
$this->bdd = new Bdd();
}
public function executer() {
$cmd = $this->getParametre('a');
$requete_colonnes = "SELECT column_name FROM information_schema.columns WHERE table_name = 'tb_nettoye_cel.cel_obs' AND table_schema='tb_cel';";
$this->colonnes = $this->bdd->recupererTous($requete_colonnes);
try {
switch ($cmd) {
case 'tout' :
$this->supprimerRetourLigne();
$this->supprimerAntislash();
$this->supprimerGuillemet();
$this->unifierNull();
$this->unifierNomReferentiel();
$this->unifierCertitude();
$this->supprimerCertitudeAutre();
$this->unifierUtilisateur();
$this->verifierCodeInsee();
$this->verifierGeodatum();
$this->analyserMotsCles();
$this->changerSensible();
$this->supprimerInfosLiesObsInexistante();
$this->unifierNull();
break;
case 'supprimerRetourLigne' :
$this->supprimerRetourLigne();
break;
case 'supprimerAntislash' :
$this->supprimerAntislash();
break;
case 'supprimerGuillemet' :
$this->supprimerGuillemet();
break;
case 'unifierNomReferentiel' :
$this->unifierNomReferentiel();
break;
case 'unifierCertitude' :
$this->unifierCertitude();
break;
case 'supprimerCertitudeAutre' : // après unifier certitude si les autres valeurs sont bien à supprimer
$this->supprimerCertitudeAutre();
break;
case 'analyserMotsCles' : // après unifier certitude si les autres valeurs sont bien à supprimer
$this->analyserMotsCles();
break;
case 'verifierGeodatum' :
$this->verifierGeodatum();
break;
case 'verifierCodeInsee' :
$this->verifierCodeInsee();
break;
case 'sensible' :
$this->changerSensible();
break;
case 'unifierNull' : // lancer en dernier pour bien réussir
$this->unifierNull();
break;
case 'supprimerInfosLiesObsInexistante' :
$this->supprimerInfosLiesObsInexistante();
break;
case 'unifierUtilisateur' :
$this->unifierUtilisateur();
break;
case 'unifierInfosEspece' :
$this->unifierUtilisateur();
break;
default :
$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
"Commandes existantes : regenererMotsClesTexteObs, regenererMotsClesTexteImages"
. ", regenererMotsClesTexteObsTout, regenererMotsClesTexteImagesTout"
. ", viderMotsClesTexteImagesSansMotsCles, viderMotsClesTexteObsSansMotsCles"
. ", regenererChampsTailleImage, reparerLiaisonsOublieesObs, reparerLiaisonsOublieesImages"
. ", reparerLiaisonsObsParMotsClesTexte, reductionMotsClesImages, reductionMotsClesImagesUtil"
. ", reduireEtNormaliserMotsClesImagesUtil, reduireEtNormaliserMotsClesImages"
. ", reductionMotsClesObs, reductionMotsClesObsUtil, reduireEtNormaliserMotsClesObsUtil"
. ", reduireEtNormaliserMotsClesObs";
throw new Exception($msg);
}
} catch (Exception $e) {
$this->traiterErreur($e->getMessage());
}
}
private function supprimerRetourLigne() {
foreach ($this->colonnes as $id=>$colonne) {
echo "Suppression des retour ligne dans la colonne ".$colonne['column_name']." ...";
$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\n", "")';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function supprimerAntislash() {
foreach ($this->colonnes as $id=>$colonne) {
echo "Suppression des antislash dans la colonne ".$colonne['column_name']." ...";
$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\", "")';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function supprimerGuillemet() {
foreach ($this->colonnes as $id=>$colonne) {
echo "Suppression des guillements dans la colonne ".$colonne['column_name']." ...";
$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].',"\"", "")';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function unifierNull() {
$requete_colonnes = "SELECT column_name FROM information_schema.columns WHERE table_name = 'tb_nettoye_cel.cel_obs' AND table_schema='tb_cel';";
$colonnes = $this->bdd->recupererTous($requete_colonnes);
foreach ($colonnes as $colonne) {
echo "Suppression des vides dans la colonne ".$colonne['column_name']." ...";
$dsl = array( 'transmission', 'altitude');
if (isset($dsl[$colonne['column_name']])) {
$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = NULL WHERE ".$colonne['column_name']."= ''";
} else {
$requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = NULL WHERE ".$colonne['column_name']."= '' OR ".$colonne['column_name']." IN ('INSEE-C:', '0000-00-00 00:00:00', '0.00000')";
}
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function unifierCertitude() {
echo "Uniformisation du champ certitude/identification";
$certitude = array("A déterminer" => "à déterminer",
"À déterminer, voir photo" => "à déterminer",
"aDeterminer" => "à déterminer",
"déterminer" => "à déterminer",
"Inconnue" => "à déterminer",
"Ceraine" => "certain",
"certain" => "certain",
"Certainaaua" => "certain",
"Certaine" => "certain",
"Certaine K- rhizines blanche" => "certain",
"Certaine ( mais voir notes)" => "certain",
"Certaine (à 99%)" => "certain",
"Certaine Anett" => "certain",
"Certaine Anette" => "certain",
"Certaine Valériane officinale" => "certain",
"Certaine, Faite et confirmée par JM BERAUD" => "certain",
"Certaine, par Jean Lebail" => "certain",
"Certaine, subsp. minus" => "certain",
"Certainea" => "certain",
"Certaineanno" => "certain",
"Certainearia n" => "certain",
"Certainee" => "certain",
"Certainej" => "certain",
"Certainel" => "certain",
"CertaineNom de travai" => "certain",
"CertaineNom de travail" => "certain",
"Certainesites" => "certain",
"Certainesous-bois de feuillus en versant sud à sud-ouest" => "certain",
"Certaineu" => "certain",
"sure" => "certain",
"validée sur forum Naturalistes de l'ouest" => "certain",
"à confirmer" => "douteux",
"à approfondir" => "douteux",
"à cofirmer" => "douteux",
"À confiermer" => "douteux",
"A confirlmer" => "douteux",
"A confirmer" => "douteux",
"à confirmer vs. pumilum" => "douteux",
"à conirmer" => "douteux",
"à vérifier" => "douteux",
"douteuse" => "douteux",
"Douteuse (canadensis ?)" => "douteux",
"Douteuse ?" => "douteux",
"Douteuse à confirmer" => "douteux",
"Douteuse peut-être cordata" => "douteux",
"Douteuse, fleurs rouges" => "douteux",
"douteux" => "douteux",
"espèce bisannuelle mais non bien déterminée" => "douteux",
"Incertaine" => "douteux",
"Pavot douteux" => "douteux",
"Potentille ansérine, supposé" => "douteux",
"presque certaine" => "douteux",
"Quasi Certaine" => "douteux",
"ssp déterminer" => "douteux",
"subsp à vérifier" => "douteux",
"subsp. microphyllum ?" => "douteux",
"très douteuse" => "douteux",
"Très probable" => "douteux");
foreach ($certitude as $valeur=>$saisie) {
$requete = 'UPDATE tb_nettoye_cel.cel_obs SET commentaire = concat(commentaire, " Certitude : ", certitude), certitude = "'.$saisie.'" WHERE certitude ="'.$valeur.'"';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
$requete_verif = "SELECT certitude FROM tb_nettoye_cel.cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'à déterminer', '') and certitude is not NULL";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
}
private function supprimerCertitudeAutre() {
echo "suppression des valeurs non compréhensible du champ certitude/identification";
$requete = "UPDATE tb_nettoye_cel.cel_obs
SET commentaire = case isnull(commentaire) when 1 THEN certitude ELSE concat(commentaire, ' Certitude : ', certitude) END,
certitude = '' WHERE `certitude` NOT IN ('douteux', 'certain', 'à déterminer', '') and certitude is not NULL";
$this->bdd->requeter($requete);
echo "effectuée \n";
$requete_verif = "SELECT certitude FROM tb_nettoye_cel.cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'aDeterminer', '') and certitude is not NULL";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
}
private function unifierUtilisateur() {
echo "suppression de le colonne ordre \n";
$requete = "ALTER TABLE tb_nettoye_cel.cel_obs DROP INDEX id_obs;";
$this->bdd->requeter($requete);
$requete = "ALTER TABLE tb_nettoye_cel.cel_obs DROP INDEX ordre;";
$this->bdd->requeter($requete);
$requete = "ALTER TABLE tb_nettoye_cel.`cel_obs` DROP `ordre`;";
$this->bdd->requeter($requete);
echo "modification des observations ayant une adresse mail en identifiant";
$requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON `U_MAIL` = ce_utilisateur SET `ce_utilisateur` = `U_ID`, `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,
`courriel_utilisateur` = `U_MAIL` WHERE ce_utilisateur like '%@%'";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "modification des observations ayant une adresse mail mais pas d'identifiant";
$requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON `U_MAIL` = courriel_utilisateur SET `ce_utilisateur` = `U_ID`, `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,
`courriel_utilisateur` = `U_MAIL` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
OR ce_utilisateur = 0) and courriel_utilisateur like '%@%'";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "modification des observations ayant un identifiant";
$requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON U_ID = ce_utilisateur SET `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,
`courriel_utilisateur` = `U_MAIL` WHERE (ce_utilisateur IS NOT NULL OR LENGTH(ce_utilisateur) > 6) and (courriel_utilisateur is null or courriel_utilisateur='')";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "suppression des autres valeurs ce_utilisateur";
$requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` SET ce_utilisateur = NULL WHERE ce_utilisateur IS NOT NULL AND LENGTH(ce_utilisateur) > 6";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "suppression des images anonymes";
$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_images` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
OR ce_utilisateur = 0) and (`courriel_utilisateur` is null or `courriel_utilisateur` not like '%@%')";
$this->bdd->requeter($requete_anonyme);
echo "suppression des tags images anonymes";
$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_arbre_mots_cles_images` WHERE id_utilisateur in (select ce_utilisateur FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
OR ce_utilisateur = 0) and (`courriel_utilisateur` is null or `courriel_utilisateur` not like '%@%'))";
$this->bdd->requeter($requete_anonyme);
echo "suppression des tags obs anonymes";
$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_arbre_mots_cles_obs` WHERE id_utilisateur in (select ce_utilisateur FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
OR ce_utilisateur = 0) and (`courriel_utilisateur` is null or `courriel_utilisateur` not like '%@%'))";
$this->bdd->requeter($requete_anonyme);
echo "suppression des obs anonymes";
$requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
OR ce_utilisateur = 0) and (`courriel_utilisateur` is null or `courriel_utilisateur` not like '%@%')";
$this->bdd->requeter($requete_anonyme);
$requete_verif = "SELECT `ce_utilisateur`, `prenom_utilisateur`, `nom_utilisateur`, `courriel_utilisateur` FROM tb_nettoye_cel.cel_obs
WHERE ce_utilisateur IS NOT NULL OR LENGTH(ce_utilisateur) > 6";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
echo "effectuée \n";
}
private function unifierNomReferentiel() {
echo "Uniformisation du nom de référentiel";
$referentiels = array("BDTFX", "BDTRE", "BDTXA", "APD", "LBF", "ISFAN");
foreach ($referentiels as $referentiel) {
$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = '".$referentiel."' WHERE nom_referentiel like '".$referentiel."%'";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'autre' WHERE nom_sel_nn = '' or nom_sel_nn = '0'";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'APD' WHERE nom_referentiel like 'bdtao%'";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'BDTFX' WHERE nom_referentiel like 'bdnff%'";
$this->bdd->requeter($requete);
echo "effectuée \n";
$requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'autre' WHERE nom_referentiel IS NULL or nom_referentiel = ''";
$this->bdd->requeter($requete);
echo "effectuée \n";
}
$requete_verif = "SELECT nom_referentiel FROM tb_nettoye_cel.cel_obs WHERE nom_referentiel NOT IN ('".implode("', '", $referentiels)."', 'autre')";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
}
private function supprimerInfosLiesObsInexistante() {
echo "Supprimer infos liés à obs inexistante";
$requete = "DELETE FROM tb_nettoye_cel.`cel_obs_etendues` WHERE `id_observation` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";
$this->bdd->requeter($requete);
$requete = "DELETE FROM tb_nettoye_cel.`cel_mots_cles_obs_liaison` WHERE `id_element_lie` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";
$this->bdd->requeter($requete);
$requete = "DELETE FROM tb_nettoye_cel.`cel_mots_cles_images_liaison` WHERE `id_element_lie` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";
$this->bdd->requeter($requete);
echo "effectuée \n";
}
private function verifierGeodatum() {
echo "Uniformisation du geodatum";
$requete = "UPDATE tb_nettoye_cel.cel_obs SET geodatum = 'WGS84' WHERE (latitude IS NOT NULL or latitude != '0.00000') AND geodatum IS NULL";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET geodatum = NULL WHERE (latitude IS NULL or latitude = '0.00000')";
$this->bdd->requeter($requete);
echo "effectuée \n";
}
private function verifierCodeInsee() {
echo "Vérification du code insee";
$requete = "ALTER TABLE tb_nettoye_cel`cel_obs` ADD `locality_consistency` INT(1) ;";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET locality_consistency = '0' WHERE
((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') and
replace(`ce_zone_geo`, 'INSEE-C:', '') != `code_insee_calcule`";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET locality_consistency = '1' WHERE
((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') and
replace(`ce_zone_geo`, 'INSEE-C:', '') = `code_insee_calcule`";
$this->bdd->requeter($requete);
$requete_verif = "SELECT `ce_zone_geo`, `code_insee_calcule`, `locality_consistency` FROM `cel_obs` WHERE `locality_consistency` IS NOT NULL";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
echo "effectuée \n";
}
private function analyserMotsCles(){
echo "Input source \n";
$requete = "ALTER TABLE tb_nettoye_cel`cel_obs` ADD `input_source` VARCHAR(15)";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET input_source = 'plantnet' WHERE `mots_cles_texte` like '%plantnet%'";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET input_source = 'autre' WHERE `mots_cles_texte` like '%MobileSauvages%'";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET input_source = 'widget' WHERE `mots_cles_texte` like '%Projets coopératifs%' and input_source = ''";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET input_source = 'widget' WHERE `mots_cles_texte` like '%widget%' and input_source = ''";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET input_source = 'cel' WHERE input_source = ''";
$this->bdd->requeter($requete);
echo "Suppression motcle du chemin \n";
$requete = "UPDATE tb_nettoye_cel.`cel_arbre_mots_cles_obs` SET chemin = substr(`chemin`, 1, CHAR_LENGTH(chemin)-CHAR_LENGTH(`mot_cle`)-1)";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.`cel_arbre_mots_cles_images` SET chemin = substr(`chemin`, 1, CHAR_LENGTH(chemin)-CHAR_LENGTH(`mot_cle`)-1)";
$this->bdd->requeter($requete);
echo "Certitude à certaine quand obs validée sur ip \n";
$requete = "UPDATE tb_nettoye_cel.`cel_obs` c left join
(SELECT distinct `ce_observation`, sum(`proposition_retenue`) as s, `nom_sel_nn`
FROM tb_del.`del_commentaire` group by `ce_observation`) d on
`ce_observation` = `id_observation` SET `certitude` = 'certain'
WHERE s = 1 and (c.`mots_cles_texte` LIKE '%adeterminer%'
or c.`certitude` = 'aDeterminer') and c.`nom_sel_nn` = d.`nom_sel_nn`";
$this->bdd->requeter($requete);
echo "Certitude à douteux quand obs validée sur ip mais num_nom diff entre ip et cel \n";
$requete = "UPDATE tb_nettoye_cel.`cel_obs` c left join
(SELECT distinct `ce_observation`, sum(`proposition_retenue`) as s, `nom_sel_nn`
FROM tb_del.`del_commentaire` group by `ce_observation`) d on
`ce_observation` = `id_observation` SET `certitude` = 'douteux'
WHERE s = 1 and (c.`mots_cles_texte` LIKE '%adeterminer%'
or c.`certitude` = 'aDeterminer') and c.`nom_sel_nn` != d.`nom_sel_nn`";
$this->bdd->requeter($requete);
echo "Certitude à aDeterminer quand obs non validée sur ip \n";
$requete = "UPDATE tb_nettoye_cel.`cel_obs` c SET `certitude` = 'aDeterminer'
WHERE c.`mots_cles_texte` LIKE '%adeterminer%' AND
(c.`certitude` = '' or c.certitude IS NULL)";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.`cel_obs` SET
`mots_cles_texte` = REPLACE(`mots_cles_texte`, 'aDeterminer,', '')
WHERE `mots_cles_texte` LIKE '%adeterminer,%'";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.`cel_obs` SET
`mots_cles_texte` = REPLACE(`mots_cles_texte`, ',aDeterminer', '')
WHERE `mots_cles_texte` LIKE '%,adeterminer'";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.`cel_obs` SET
`mots_cles_texte` = REPLACE(`mots_cles_texte`, 'aDeterminer', '')
WHERE `mots_cles_texte` LIKE '%adeterminer%'";
$this->bdd->requeter($requete);
}
private function changerSensible(){
echo "Sensible \n";
$requete = "ALTER TABLE tb_nettoye_cel.`cel_obs` ADD `published_location` int(1)";
$this->bdd->requeter($requete);
$requete = "UPDATE tb_nettoye_cel.cel_obs SET published_location = '1' WHERE `mots_cles_texte` like '%sensible%'";
$this->bdd->requeter($requete);
}
}