1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
$LFields=$this->getFieldsAsArray($table,"L");
$DFields=$this->getFieldsAsArray($table,"D");
$len = count($LFields);
$tablefields = array();
for($i = 1; $i < (1 << $len); $i++) {
$c = Array();
for($j = 0; $j < $len; $j++)
if($i & (1 << $j))
$c [] = $LFields[$j];
$tablefields[] = $c;
}
/**
* Creating & populating tables
*/
$this->setConsolidationStatusWithPG("Mise à jour des données", 0);
$i=0;
$max=count($tablefields);
foreach($tablefields as $tf)
{
$i++;
$this->createAggregateTable($tf, $DFields, $table);
$this->logtofile("Etape $i/$max Terminée","notice","<br /> \n","<br /> \n");
$this->setConsolidationStatusWithPG("Mise à jour des données: $i/$max", round($i/$max*100));
}
function createAggregateTable($LFields, $DFields, $basetable)
{
$fields_id=array_value_recursive("field_id",$LFields);
$fields_name=array_value_recursive("fieldname",$LFields);
$aggregate_table_name=$basetable."_".join("_",$fields_id);
$this->logtofile("Création de la table $aggregate_table_name pour les champs: ".join(",",$fields_name));
/*
* Création de la table en premier pour ne pas corrompre les entrées si erreur
*/
$ddl = "CREATE TABLE IF NOT EXISTS `$aggregate_table_name` (";
$fields="";
$keys="";
foreach($fields_name as $fn)
{
$fields.="\n `$fn` varchar($this->defaultVarcharSize) DEFAULT NULL,";
$keys.="\nKEY `$fn` (`$fn`),";
}
foreach($DFields as $df)
{
$fields.="\n`".$df["fieldname"]."` decimal(30,15) DEFAULT NULL,";
}
$keys=substr($keys,0,strlen($keys)-1); //on enlève la dernière ','
$ddl .= $fields;
$ddl .= $keys;
$ddl .= ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$ddlhtml="<a href='#' style='color:red;' onclick='$(\"#div_$aggregate_table_name\").toggle(); return false;'>Afficher/Masquer le DDL SQL</a>
<div style='display:none;' id='div_$aggregate_table_name'><pre>$ddl</pre> </div>";
$this->logtofile("Table $aggregate_table_name créée:\n <br /> $ddlhtml \n <br />\n <br /> Création des entrées...", "success","","<br />\n");
$this->db->query($ddl);
/*
* Insertion de l'entrée dans aggregate_tables
*/
$data=Array("aggregate_table_name" => $aggregate_table_name,
"basetable"=>$basetable,
"fieldscount"=>count($fields_id));
$aggregate_table_id=$this->db->query_insert("aggregate_tables", $data);
$this->logtofile("Insertion de l'entrée dans aggregate_tables réeussie", "success");
/*
* Insertion des champs dans aggregate_tables_fields
*/
foreach($fields_id as $fid)
{
$data=Array("aggregate_table_id" => $aggregate_table_id,
"field_id"=>$fid);
$this->db->query_insert("aggregate_tables_fields", $data);
}
$this->logtofile("Insertion des entrées dans aggregate_tables_fields réeussie. Remlissage ...", "success");
/*
* Remplissage de la table
*/
$insertLFields=$fields_name;
$insertLFields=array_map(function ($str) { return "`$str`"; }, $insertLFields);
$insertLFields=join(",",$insertLFields);
$sumfields=array_value_recursive("fieldname",$DFields);
$sumfields=array_map(function ($str) { return "SUM(`$str`)"; }, $sumfields);
$sumfields=join(",",$sumfields);
$query="INSERT INTO $aggregate_table_name SELECT $insertLFields, $sumfields FROM $basetable GROUP BY $insertLFields";
$this->logtofile("Execution de la requête: <br />\n$query", "notice","<br />\n<br />\n","<br />\n<br />\n");
$this->db->query($query);
$numlines=@mysql_affected_rows($this->db->link_id);
/*
* Optimisation de la table
*/
$this->optimizeAggregateTableFieldLengths($aggregate_table_id);
$this->logtofile("Optimisation de la table (OPTIMIZE TABLE): $aggregate_table_name");
$this->db->query("OPTIMIZE TABLE $aggregate_table_name");
$this->logtofile("Table Optimisée","success");
$this->logtofile("Table $aggregate_table_name créée et consolidée ($numlines Lignes)", "success","","<br />\n");
}
function getAggregateTableNameFromId($aggregate_table_id)
{
$res=$this->db->fetch_all_array("SELECT aggregate_table_name FROM aggregate_tables WHERE aggregate_table_id=$aggregate_table_id");
if(empty($res))
{
$this->logtofile("La table consolidée avec l'ID $aggregate_table_id n'a pas été trouvée, opération annulée","error");
die("La table consolidée avec l'ID $aggregate_table_id n'a pas été trouvée, opération annulée");
} else {
return $res[0]["aggregate_table_name"];
}
}
function getAggregateTableFromFieldsIds($fieldsids)
{
$Q="SELECT aggregate_table_name, aggregate_table_id FROM aggregate_tables WHERE \n";
for($i=0;$i<count($fieldsids); $i++)
{
$Q.= ($i>0 ? "\n AND " : "\n" )."aggregate_table_id IN (SELECT aggregate_table_id FROM aggregate_tables_fields WHERE field_id =".$fieldsids[$i].")";
}
$Q.=" AND fieldscount=".count($fieldsids);
$db=new Database();
$res=$db->fetch_all_array($Q);
if(count($res)>1)
{
die("Plusieurs tables aggrégées ont étées trouvées pour les champs " . join(",",$fieldsids).".\n Cela ne devrait pas arriver. Merci de prévenir l'administrateur");
}
if(count($res)<1)
{
die("Aucune tables aggrégée n'a été trouvée pour les champs " . join(",",$fieldsids).".\n Cela ne devrait pas arriver. Merci de prévenir l'administrateur");
}
return $res[0]["aggregate_table_name"];
} |
Partager