35,6 → 35,10 |
protected $total_resultat; |
protected $retour_format = 'max'; |
|
// beaucoup plus flexible dans le cas de requêtes SQL complexes |
protected $mesChamps = ''; |
protected $mesJoinsEtConditions = ''; |
|
public function traiterParametres() { |
if (isset($this->parametres) && !empty($this->parametres)) { |
foreach ($this->parametres as $param => $valeur) { |
112,6 → 116,13 |
$this->format_reponse .= '/id'; |
//requete : /ontologies/#classe:#code (ex : /ontologies/rangTaxo:290) |
} elseif (strrpos($this->ressources[0], ':') !== false) { |
// plusieurs couples #classe:#code séparés par des virgules |
if(strrpos($this->ressources[0], ',') !== false) { |
$this->traiterMultipleRessourceId(); |
return; |
} |
|
// ou un unique couple #classe:#code |
$this->format_reponse .= '/id'; |
preg_match('/^([^:]+):([^:]+)$/', $this->ressources[0], $match); |
$this->requete_condition[] = |
130,7 → 141,44 |
} |
} |
|
// Requète : /ontologies/#classe:#code,[...] (ex : /ontologies/numStatus:2,numStatus:3,genreNombre:10) |
public function traiterMultipleRessourceId() { |
$this->format_reponse .= '/ids'; // noter le "s" |
$this->mesChamps = Array( |
// 'a.*' // pourquoi pas, mais alors des unset() seront nécessaire |
'a.id', |
'a.classe_id AS `classe.id`', |
'a.nom', |
'a.description', |
'a.code', |
'a.complements', |
'c.nom AS classe', // évite très simplement (un très couteux) ajouterClasseCorrespondante() |
'concat(c.code,":", b.code) AS requete'); // permet aux appelants de récupérer la valeur qu'ils recherchent |
$this->mesChamps = implode(', ', $this->mesChamps); |
|
$this->mesJoinsEtConditions = |
// alias de la table première |
" a " |
. " LEFT JOIN {$this->table} b ON a.id = b.id LEFT JOIN {$this->table} c ON b.classe_id = c.id" |
. " WHERE "; |
|
$or_stack = false; |
$tab = explode(',', $this->ressources[0]); |
foreach($tab as $couple) { |
preg_match('/^([^:]+):([^:]+)$/', $couple, $match); |
if($or_stack) { |
// une fois qu'un set de condition et présent, |
// les autres sont `OR`-ed. |
$this->mesJoinsEtConditions .= " OR "; |
} |
$this->mesJoinsEtConditions .= |
sprintf("(b.code = %s AND c.code = %s)", |
$this->getBdd()->proteger($match[2]), |
$this->getBdd()->proteger($match[1])); |
$or_stack = true; |
} |
} |
|
public function traiterRessourceRelations() { |
//requete = /ontologies/#id/relations : |
if ($this->ressources[1] == 'relations') { |
151,6 → 199,8 |
} |
|
public function formerRequeteChamp() { |
if($this->mesChamps) return $this->mesChamps; |
|
$champ[] = 'id'; |
if ($this->format_reponse == 'ontologies') { |
$champ[] = 'nom, code '; |
194,6 → 244,8 |
} |
|
public function retournerRequeteCondition() { |
if($this->mesJoinsEtConditions) return $this->mesJoinsEtConditions; |
|
$condition = ''; |
if ($this->requete_condition !== null) { |
$condition = ' WHERE '.implode(' AND ', $this->requete_condition); |
239,6 → 291,7 |
switch ($this->format_reponse) { |
case 'ontologies' : $reponse = $this->formaterOntologies($resultat); break; |
case 'ontologies/id' : $reponse = $this->formaterOntologiesId($resultat[0]); break; |
case 'ontologies/ids' : $reponse = $this->formaterMultipleOntologiesId($resultat); break; |
case 'ontologies/id/relations' : $reponse = $this->formaterOntologiesIdRelations($resultat); break; |
default : break; |
} |
288,6 → 341,17 |
return $table_retour; |
} |
|
public function formaterMultipleOntologiesId($resultats) { |
$result = Array(); |
foreach($resultats as $k => $resultat) { |
$id = $resultat['requete']; |
$result[$id] = array_filter($resultat, function($val) { return $val != ''; }); |
unset($result[$id]['requete']); |
$this->calculerClassID($result[$id]); |
} |
return $result; |
} |
|
public function calculerClassID(&$resultat) { |
// commenté: pourquoi restreindre le choix des champs au format "max", |
// ça ne semble pas logique... |