Example #1
0
 /**
  * Generates the fields list of an SQL query.
  *
  * @param Model $model
  * @param string $alias Alias tablename
  * @param mixed $fields
  * @param boolean $quote If false, returns fields array unquoted
  * @return array
  */
 function fields(&$model, $alias = null, $fields = array(), $quote = true)
 {
     if (empty($alias)) {
         $alias = $model->name;
     }
     if (!is_array($fields)) {
         if (!empty($fields)) {
             $depth = 0;
             $offset = 0;
             $buffer = '';
             $results = array();
             $length = strlen($fields);
             while ($offset <= $length) {
                 $tmpOffset = -1;
                 $offsets = array(strpos($fields, ',', $offset), strpos($fields, '(', $offset), strpos($fields, ')', $offset));
                 for ($i = 0; $i < 3; $i++) {
                     if ($offsets[$i] !== false && ($offsets[$i] < $tmpOffset || $tmpOffset == -1)) {
                         $tmpOffset = $offsets[$i];
                     }
                 }
                 if ($tmpOffset !== -1) {
                     $buffer .= substr($fields, $offset, $tmpOffset - $offset);
                     if ($fields[$tmpOffset] == ',' && $depth == 0) {
                         $results[] = $buffer;
                         $buffer = '';
                     } else {
                         $buffer .= $fields[$tmpOffset];
                     }
                     if ($fields[$tmpOffset] == '(') {
                         $depth++;
                     }
                     if ($fields[$tmpOffset] == ')') {
                         $depth--;
                     }
                     $offset = ++$tmpOffset;
                 } else {
                     $results[] = $buffer . substr($fields, $offset);
                     $offset = $length + 1;
                 }
             }
             if (empty($results) && !empty($buffer)) {
                 $results[] = $buffer;
             }
             if (!empty($results)) {
                 $fields = array_map('trim', $results);
             } else {
                 $fields = array();
             }
         }
     }
     if (empty($fields)) {
         $fieldData = $model->loadInfo();
         $fields = $fieldData->extract('{n}.name');
     } else {
         $fields = array_filter($fields);
     }
     if (!$quote) {
         return $fields;
     }
     $count = count($fields);
     if ($count >= 1 && !in_array($fields[0], array('*', 'COUNT(*)'))) {
         for ($i = 0; $i < $count; $i++) {
             if (!preg_match('/^.+\\(.*\\)/', $fields[$i])) {
                 $prepend = '';
                 if (strpos($fields[$i], 'DISTINCT') !== false) {
                     $prepend = 'DISTINCT ';
                     $fields[$i] = trim(r('DISTINCT', '', $fields[$i]));
                 }
                 $dot = strpos($fields[$i], '.');
                 if ($dot === false) {
                     $fields[$i] = $prepend . $this->name($alias) . '.' . $this->name($fields[$i]);
                 } else {
                     $comma = strpos($fields[$i], ',');
                     if ($comma === false) {
                         $build = explode('.', $fields[$i]);
                         if (!Set::numeric($build)) {
                             $fields[$i] = $prepend . $this->name($build[0]) . '.' . $this->name($build[1]);
                         }
                     } else {
                         $comma = explode(',', $fields[$i]);
                         foreach ($comma as $string) {
                             $build = explode('.', $string);
                             if (!Set::numeric($build)) {
                                 $value[] = $prepend . $this->name(trim($build[0])) . '.' . $this->name(trim($build[1]));
                             }
                         }
                         $fields[$i] = implode(', ', $value);
                     }
                 }
             } elseif (preg_match('/\\(([\\.\\w]+)\\)/', $fields[$i], $field)) {
                 if (isset($field[1])) {
                     if (strpos($field[1], '.') === false) {
                         $field[1] = $this->name($alias) . '.' . $this->name($field[1]);
                     } else {
                         $field[0] = explode('.', $field[1]);
                         if (!Set::numeric($field[0])) {
                             $field[0] = join('.', array_map(array($this, 'name'), $field[0]));
                             $fields[$i] = preg_replace('/\\(' . $field[1] . '\\)/', '(' . $field[0] . ')', $fields[$i], 1);
                         }
                     }
                 }
             }
         }
     }
     return $fields;
 }