/**
  * Returns the SELECT clauses ready for inserting into a query.
  *
  * @param SQLSelect $query The expression object to build from
  * @param array $parameters Out parameter for the resulting query parameters
  * @return string Completed select part of statement
  */
 protected function buildSelectFragment(SQLSelect $query, array &$parameters)
 {
     $distinct = $query->getDistinct();
     $select = $query->getSelect();
     $clauses = array();
     foreach ($select as $alias => $field) {
         // Don't include redundant aliases.
         $fieldAlias = "\"{$alias}\"";
         if ($alias === $field || substr($field, -strlen($fieldAlias)) === $fieldAlias) {
             $clauses[] = $field;
         } else {
             $clauses[] = "{$field} AS {$fieldAlias}";
         }
     }
     $text = 'SELECT ';
     if ($distinct) {
         $text .= 'DISTINCT ';
     }
     return $text .= implode(', ', $clauses);
 }
 /**
  * Ensure that if a query has an order by clause, those columns are present in the select.
  *
  * @param SQLSelect $query
  * @param array $originalSelect
  * @return null
  */
 protected function ensureSelectContainsOrderbyColumns($query, $originalSelect = array())
 {
     if ($orderby = $query->getOrderBy()) {
         $newOrderby = array();
         $i = 0;
         foreach ($orderby as $k => $dir) {
             $newOrderby[$k] = $dir;
             // don't touch functions in the ORDER BY or public function calls
             // selected as fields
             if (strpos($k, '(') !== false) {
                 continue;
             }
             $col = str_replace('"', '', trim($k));
             $parts = explode('.', $col);
             // Pull through SortColumn references from the originalSelect variables
             if (preg_match('/_SortColumn/', $col)) {
                 if (isset($originalSelect[$col])) {
                     $query->selectField($originalSelect[$col], $col);
                 }
                 continue;
             }
             if (count($parts) == 1) {
                 // Get expression for sort value
                 $qualCol = "\"{$parts[0]}\"";
                 $table = DataObject::getSchema()->tableForField($this->dataClass(), $parts[0]);
                 if ($table) {
                     $qualCol = "\"{$table}\".{$qualCol}";
                 }
                 // remove original sort
                 unset($newOrderby[$k]);
                 // add new columns sort
                 $newOrderby[$qualCol] = $dir;
                 // To-do: Remove this if block once SQLSelect::$select has been refactored to store getSelect()
                 // format internally; then this check can be part of selectField()
                 $selects = $query->getSelect();
                 if (!isset($selects[$col]) && !in_array($qualCol, $selects)) {
                     $query->selectField($qualCol);
                 }
             } else {
                 $qualCol = '"' . implode('"."', $parts) . '"';
                 if (!in_array($qualCol, $query->getSelect())) {
                     unset($newOrderby[$k]);
                     $newOrderby["\"_SortColumn{$i}\""] = $dir;
                     $query->selectField($qualCol, "_SortColumn{$i}");
                     $i++;
                 }
             }
         }
         $query->setOrderBy($newOrderby);
     }
 }