Skip to content

Commit

Permalink
Add seed values support for Query Builder order_by
Browse files Browse the repository at this point in the history
(feature request bcit-ci#1987)
  • Loading branch information
narfbg committed Nov 13, 2012
1 parent 9e94576 commit 98e46cf
Show file tree
Hide file tree
Showing 22 changed files with 166 additions and 41 deletions.
4 changes: 2 additions & 2 deletions system/database/DB_driver.php
Expand Up @@ -329,9 +329,9 @@ abstract class CI_DB_driver {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' RAND()';
protected $_random_keyword = array('RAND()', 'RAND(%d)');

/**
* COUNT string
Expand Down
13 changes: 8 additions & 5 deletions system/database/DB_query_builder.php
Expand Up @@ -1144,21 +1144,24 @@ public function or_having($key, $value = NULL, $escape = NULL)
*/
public function order_by($orderby, $direction = '', $escape = NULL)
{
$direction = trim($direction);
$direction = strtoupper(trim($direction));

if (strtolower($direction) === 'random' OR $orderby === $this->_random_keyword)
if ($direction === 'RANDOM')
{
// Random ordered results don't need a field name
$orderby = $this->_random_keyword;
$direction = '';

// Do we have a seed value?
$orderby = ctype_digit((string) $orderby)
? $orderby = sprintf($this->_random_keyword[1], $orderby)
: $this->_random_keyword[0];
}
elseif (empty($orderby))
{
return $this;
}
elseif ($direction !== '')
{
$direction = in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE) ? ' '.$direction : '';
$direction = in_array($direction, array('ASC', 'DESC'), TRUE) ? ' '.$direction : '';
}

is_bool($escape) OR $escape = $this->_protect_identifiers;
Expand Down
7 changes: 7 additions & 0 deletions system/database/drivers/cubrid/cubrid_driver.php
Expand Up @@ -64,6 +64,13 @@ class CI_DB_cubrid_driver extends CI_DB {
*/
protected $_escape_char = '`';

/**
* ORDER BY random keyword
*
* @var array
*/
protected $_random_keyword = array('RANDOM()', 'RANDOM(%d)');

// --------------------------------------------------------------------

/**
Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/ibase/ibase_driver.php
Expand Up @@ -53,9 +53,9 @@ class CI_DB_ibase_driver extends CI_DB {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' Random()';
protected $_random_keyword = array('RAND()', 'RAND()');

/**
* IBase Transaction status flag
Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/mssql/mssql_driver.php
Expand Up @@ -53,9 +53,9 @@ class CI_DB_mssql_driver extends CI_DB {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' NEWID()';
protected $_random_keyword = array('NEWID()', 'RAND(%d)');

/**
* Quoted identifier flag
Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/oci8/oci8_driver.php
Expand Up @@ -102,9 +102,9 @@ class CI_DB_oci8_driver extends CI_DB {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' ASC'; // not currently supported
protected $_random_keyword = array('ASC', 'ASC'); // not currently supported

/**
* COUNT string
Expand Down
9 changes: 7 additions & 2 deletions system/database/drivers/odbc/odbc_driver.php
Expand Up @@ -73,6 +73,13 @@ class CI_DB_odbc_driver extends CI_DB {
*/
protected $_like_escape_str = " {escape '%s'} ";

/**
* ORDER BY random keyword
*
* @var array
*/
protected $_random_keyword = array('RND()', 'RND(%d)');

// --------------------------------------------------------------------

/**
Expand All @@ -85,8 +92,6 @@ public function __construct($params)
{
parent::__construct($params);

$this->_random_keyword = ' RND('.time().')'; // database specific random keyword

// Legacy support for DSN in the hostname field
if (empty($this->dsn))
{
Expand Down
7 changes: 7 additions & 0 deletions system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
Expand Up @@ -55,6 +55,13 @@ class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
*/
protected $_escape_char = '`';

/**
* ORDER BY random keyword
*
* @var array
*/
protected $_random_keyword = array('RANDOM()', 'RANDOM(%d)');

// --------------------------------------------------------------------

/**
Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php
Expand Up @@ -53,9 +53,9 @@ class CI_DB_pdo_dblib_driver extends CI_DB_pdo_driver {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' NEWID()';
protected $_random_keyword = array('NEWID()', 'RAND(%d)');

/**
* Quoted identifier flag
Expand Down
Expand Up @@ -53,9 +53,9 @@ class CI_DB_pdo_firebird_driver extends CI_DB_pdo_driver {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' RANDOM()';
protected $_random_keyword = array('RAND()', 'RAND()');

// --------------------------------------------------------------------

Expand Down
Expand Up @@ -50,6 +50,15 @@ class CI_DB_pdo_informix_driver extends CI_DB_pdo_driver {

// --------------------------------------------------------------------

/**
* ORDER BY random keyword
*
* @var array
*/
protected $_random_keyword = array('ASC', 'ASC'); // Currently not supported

// --------------------------------------------------------------------

/**
* Class constructor
*
Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/pdo/subdrivers/pdo_oci_driver.php
Expand Up @@ -62,9 +62,9 @@ class CI_DB_pdo_oci_driver extends CI_DB_pdo_driver {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' ASC'; // Currently not supported
protected $_random_keyword = array('ASC', 'ASC'); // Currently not supported

/**
* COUNT string
Expand Down
7 changes: 7 additions & 0 deletions system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
Expand Up @@ -73,6 +73,13 @@ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {
*/
protected $_like_escape_str = " {escape '%s'} ";

/**
* ORDER BY random keyword
*
* @var array
*/
protected $_random_keyword = array('RND()', 'RND(%d)');

// --------------------------------------------------------------------

/**
Expand Down
39 changes: 37 additions & 2 deletions system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
Expand Up @@ -60,9 +60,9 @@ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' RANDOM()';
protected $_random_keyword = array('RANDOM()', 'RANDOM()');

// --------------------------------------------------------------------

Expand Down Expand Up @@ -109,6 +109,41 @@ public function insert_id($name = NULL)

// --------------------------------------------------------------------

/**
* ORDER BY
*
* @param string $orderby
* @param string $direction ASC or DESC
* @param bool $escape
* @return object
*/
public function order_by($orderby, $direction = '', $escape = NULL)
{
$direction = strtoupper(trim($direction));
if ($direction === 'RANDOM')
{
if ( ! is_float($orderby) && ctype_digit((string) $orderby))
{
$orderby = ($orderby > 1)
? (float) '0.'.$orderby
: (float) $orderby;
}

if (is_float($orderby))
{
$this->simple_query('SET SEED '.$orderby);
}

$orderby = $this->_random_keyword[0];
$direction = '';
$escape = FALSE;
}

return parent::order_by($orderby, $direction, $escape);
}

// --------------------------------------------------------------------

/**
* Show table query
*
Expand Down
Expand Up @@ -53,7 +53,7 @@ class CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' RANDOM()';

Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php
Expand Up @@ -53,9 +53,9 @@ class CI_DB_pdo_sqlsrv_driver extends CI_DB_pdo_driver {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' NEWID()';
protected $_random_keyword = array('NEWID()', 'RAND(%d)');

/**
* Quoted identifier flag
Expand Down
39 changes: 37 additions & 2 deletions system/database/drivers/postgre/postgre_driver.php
Expand Up @@ -60,9 +60,9 @@ class CI_DB_postgre_driver extends CI_DB {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' RANDOM()'; // database specific random keyword
protected $_random_keyword = array('RANDOM()', 'RANDOM()');

// --------------------------------------------------------------------

Expand Down Expand Up @@ -481,6 +481,41 @@ public function error()

// --------------------------------------------------------------------

/**
* ORDER BY
*
* @param string $orderby
* @param string $direction ASC or DESC
* @param bool $escape
* @return object
*/
public function order_by($orderby, $direction = '', $escape = NULL)
{
$direction = strtoupper(trim($direction));
if ($direction === 'RANDOM')
{
if ( ! is_float($orderby) && ctype_digit((string) $orderby))
{
$orderby = ($orderby > 1)
? (float) '0.'.$orderby
: (float) $orderby;
}

if (is_float($orderby))
{
$this->simple_query('SET SEED '.$orderby);
}

$orderby = $this->_random_keyword[0];
$direction = '';
$escape = FALSE;
}

return parent::order_by($orderby, $direction, $escape);
}

// --------------------------------------------------------------------

/**
* Update statement
*
Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/sqlite/sqlite_driver.php
Expand Up @@ -53,9 +53,9 @@ class CI_DB_sqlite_driver extends CI_DB {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' Random()'; // database specific random keyword
protected $_random_keyword = array('RANDOM()', 'RANDOM()');

// --------------------------------------------------------------------

Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/sqlite3/sqlite3_driver.php
Expand Up @@ -54,9 +54,9 @@ class CI_DB_sqlite3_driver extends CI_DB {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' RANDOM()';
protected $_random_keyword = array('RANDOM()', 'RANDOM()');

// --------------------------------------------------------------------

Expand Down
4 changes: 2 additions & 2 deletions system/database/drivers/sqlsrv/sqlsrv_driver.php
Expand Up @@ -53,9 +53,9 @@ class CI_DB_sqlsrv_driver extends CI_DB {
/**
* ORDER BY random keyword
*
* @var string
* @var array
*/
protected $_random_keyword = ' NEWID()';
protected $_random_keyword = array('NEWID()', 'RAND(%d)');

/**
* Quoted identifier flag
Expand Down
1 change: 1 addition & 0 deletions user_guide_src/source/changelog.rst
Expand Up @@ -126,6 +126,7 @@ Release Date: Not Released
- Added an optional parameter that allows to disable escaping (useful for custom fields) for methods ``join()``, ``order_by()``, ``where_in()``, ``or_where_in()``, ``where_not_in()``, ``or_where_not_in()``, ``insert()``, ``insert_batch()``.
- Added support for ``join()`` with multiple conditions.
- Added support for *USING* in ``join()``.
- Added seed values support for random ordering with ``order_by(seed, 'RANDOM')``.
- Changed ``limit()`` to ignore NULL values instead of always casting to integer.
- Changed ``offset()`` to ignore empty values instead of always casting to integer.
- Methods ``insert_batch()`` and ``update_batch()`` now return an integer representing the number of rows affected by them.
Expand Down

0 comments on commit 98e46cf

Please sign in to comment.