Changeset 82870 in spip-zone


Ignore:
Timestamp:
Jun 5, 2014, 2:13:26 PM (5 years ago)
Author:
rastapopoulos@…
Message:
  • Modification de la fonction quote() pour utiliser un deuxième argument $type qui permet de forcer l'interprétation (float, int, string).
  • Prise en compte de cette possibilité dans l'API tableau en pouvant donner "type"=>truc dans la description.
  • Ajout d'un argument supplémentaire aux critères {filtermono} et {filtermultijson} pour pouvoir forcer le type des valeurs à comparer.

Toujours un peu chiant de devoir ajouter des arguments, mais c'est le propre des signatures de fonctions avec une liste précise dans un ordre précis…

Location:
_plugins_/indexer/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/iterateur/sphinx.php

    r82818 r82870  
    895895                $comparison = calculer_liste($crit->param[3], array(), $boucles, $boucles[$idb]->id_parent);
    896896        }
     897        if (isset($crit->param[4])) {
     898                $comparison = calculer_liste($crit->param[4], array(), $boucles, $boucles[$idb]->id_parent);
     899        }
    897900       
    898901        // Test
     
    931934                $values = calculer_liste($crit->param[2], array(), $boucles, $boucles[$idb]->id_parent);
    932935        }
     936        if (isset($crit->param[3])) {
     937                $type = calculer_liste($crit->param[3], array(), $boucles, $boucles[$idb]->id_parent);
     938        }
    933939       
    934940        // Test
     
    941947                . (isset($crit->param[1]) ? "\t\t\t'field'       => $field,\n" : '')
    942948                . (isset($crit->param[2]) ? "\t\t\t'values'      => $values,\n" : '')
     949                . (isset($crit->param[3]) ? "\t\t\t'type'        => $type,\n" : '')
    943950                . "\t\t);\n";
    944951       
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL/Query.php

    r82818 r82870  
    7070
    7171        function quote($value, $type='') {
    72                 return
    73                         (is_numeric($value)) ? strval($value) :
    74                                 (!is_array($value) ? ("'" . addslashes($value) . "'") :
    75                                         join(",", array_map(array($this, 'quote'), $value))
    76                                 );
     72                // If it's an array, quote all internal values
     73                if (is_array($value)) {
     74                        foreach ($value as $k=>$v) {
     75                                $value[$k] = $this->quote($v);
     76                        }
     77                        return join(',', $value);
     78                }
     79                // If there's a knowed type, cast the value, or consider as a string
     80                elseif ($type) {
     81                        if (preg_match('/(int|entier)/i', $type)) {
     82                                return intval($value);
     83                        }
     84                        elseif (preg_match('/(double|float)/i', $type)) {
     85                                return floatval($value);
     86                        }
     87                        else {
     88                                return "'" . addslashes(strval($value)) . "'";
     89                        }
     90                }
     91                // If no type, all numeric valuee is return as numeric : "1234" => 1234
     92                else{
     93                        return is_numeric($value) ? strval($value) : "'" . addslashes($value) . "'";
     94                }
    7795        }
    7896
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL/QueryApi.php

    r82816 r82870  
    401401                        $filter['values'] = array($filter['values']);
    402402                }
     403               
     404                // No type by default
     405                if (!isset($filter['type'])) {
     406                        $filter['type'] = '';
     407                }
    403408
    404409                // For each values, we build a comparison
    405410                $comparisons = array();
    406411                foreach ($filter['values'] as $value){
    407                         $comparison = $filter['field'] . $filter['comparison'] . $this->quote($value);
     412                        $comparison = $filter['field'] . $filter['comparison'] . $this->quote($value, $filter['type']);
    408413                        if (isset($filter['not']) and $filter['not']){
    409414                                $comparison = "!($comparison)";
     
    447452                        $filter['values'] = array(array($filter['values']));
    448453                }
     454               
     455                // No type by default
     456                if (!isset($filter['type'])) {
     457                        $filter['type'] = '';
     458                }
    449459
    450460                // At depth 1, generate AND
     
    455465                                $values_in = array($values_in);
    456466                        }
    457                         $ins[] = 'IN(' . $filter['field'] . ', ' . join(', ', array_map(array($this, 'quote'), array_filter($values_in))) . ')';
     467                        // Quote all values if necessary
     468                        $values_in = array_filter($values_in);
     469                        foreach ($values_in as $k=>$v) {
     470                                $values_in[$k] = $this->quote($v, $filter['type']);
     471                        }
     472                        $ins[] = 'IN(' . $filter['field'] . ', ' . join(', ', $values_in) . ')';
    458473                }
    459474
Note: See TracChangeset for help on using the changeset viewer.