/**
* Apply selects to the query.
*
* Returns the name of the (aliased) column, which information should be
* used for sorting.
*
* @param \eZ\Publish\Core\Persistence\Database\SelectQuery $query
* @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause
* @param int $number
*
* @return string
*/
public function applySelect(SelectQuery $query, SortClause $sortClause, $number)
{
/** @var \eZ\Publish\API\Repository\Values\Content\Query\SortClause\Target\MapLocationTarget $target */
$target = $sortClause->targetData;
$externalTable = $this->getSortTableName($number, 'ezgmaplocation');
/*
* Note: this formula is precise only for short distances.
*/
$longitudeCorrectionByLatitude = pow(cos(deg2rad($target->latitude)), 2);
$distanceExpression = $query->expr->add($query->expr->mul($query->expr->sub($this->dbHandler->quoteColumn('latitude', $externalTable), $query->bindValue($target->latitude)), $query->expr->sub($this->dbHandler->quoteColumn('latitude', $externalTable), $query->bindValue($target->latitude))), $query->expr->mul($query->expr->sub($this->dbHandler->quoteColumn('longitude', $externalTable), $query->bindValue($target->longitude)), $query->expr->sub($this->dbHandler->quoteColumn('longitude', $externalTable), $query->bindValue($target->longitude)), $query->bindValue($longitudeCorrectionByLatitude)));
$query->select($query->alias($distanceExpression, $column1 = $this->getSortColumnName($number)));
return array($column1);
}