mirror of
https://github.com/dg/dibi.git
synced 2025-08-05 05:37:39 +02:00
DibiFluent: speed optimizations
This commit is contained in:
@@ -95,6 +95,9 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
/** @var array */
|
/** @var array */
|
||||||
private $cursor;
|
private $cursor;
|
||||||
|
|
||||||
|
/** @var DibiLazyStorage normalized clauses */
|
||||||
|
private static $normalizer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -103,6 +106,10 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
public function __construct(DibiConnection $connection)
|
public function __construct(DibiConnection $connection)
|
||||||
{
|
{
|
||||||
$this->connection = $connection;
|
$this->connection = $connection;
|
||||||
|
|
||||||
|
if (self::$normalizer === NULL) {
|
||||||
|
self::$normalizer = new DibiLazyStorage(array(__CLASS__, '_formatClause'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -115,7 +122,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
*/
|
*/
|
||||||
public function __call($clause, $args)
|
public function __call($clause, $args)
|
||||||
{
|
{
|
||||||
$clause = self::_formatClause($clause);
|
$clause = self::$normalizer->$clause;
|
||||||
|
|
||||||
// lazy initialization
|
// lazy initialization
|
||||||
if ($this->command === NULL) {
|
if ($this->command === NULL) {
|
||||||
@@ -188,7 +195,8 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
} // case $arg === FALSE is handled above
|
} // case $arg === FALSE is handled above
|
||||||
}
|
}
|
||||||
|
|
||||||
array_splice($this->cursor, count($this->cursor), 0, $args);
|
foreach ($args as $arg) $this->cursor[] = $arg;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,7 +209,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
*/
|
*/
|
||||||
public function clause($clause, $remove = FALSE)
|
public function clause($clause, $remove = FALSE)
|
||||||
{
|
{
|
||||||
$this->cursor = & $this->clauses[self::_formatClause($clause)];
|
$this->cursor = & $this->clauses[self::$normalizer->$clause];
|
||||||
|
|
||||||
if ($remove) { // deprecated, use removeClause
|
if ($remove) { // deprecated, use removeClause
|
||||||
trigger_error(__METHOD__ . '(..., TRUE) is deprecated; use removeClause() instead.', E_USER_NOTICE);
|
trigger_error(__METHOD__ . '(..., TRUE) is deprecated; use removeClause() instead.', E_USER_NOTICE);
|
||||||
@@ -223,7 +231,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
*/
|
*/
|
||||||
public function removeClause($clause)
|
public function removeClause($clause)
|
||||||
{
|
{
|
||||||
$this->clauses[self::_formatClause($clause)] = NULL;
|
$this->clauses[self::$normalizer->$clause] = NULL;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -441,7 +449,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
$data = $this->clauses;
|
$data = $this->clauses;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$clause = self::_formatClause($clause);
|
$clause = self::$normalizer->$clause;
|
||||||
if (array_key_exists($clause, $this->clauses)) {
|
if (array_key_exists($clause, $this->clauses)) {
|
||||||
$data = array($clause => $this->clauses[$clause]);
|
$data = array($clause => $this->clauses[$clause]);
|
||||||
} else {
|
} else {
|
||||||
@@ -452,10 +460,10 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
foreach ($data as $clause => $statement) {
|
foreach ($data as $clause => $statement) {
|
||||||
if ($statement !== NULL) {
|
if ($statement !== NULL) {
|
||||||
$args[] = $clause;
|
$args[] = $clause;
|
||||||
if ($clause === $this->command) {
|
if ($clause === $this->command && $this->flags) {
|
||||||
$args[] = implode(' ', array_keys($this->flags));
|
$args[] = implode(' ', array_keys($this->flags));
|
||||||
}
|
}
|
||||||
array_splice($args, count($args), 0, $statement);
|
foreach ($statement as $arg) $args[] = $arg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,15 +476,15 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
* Format camelCase clause name to UPPER CASE.
|
* Format camelCase clause name to UPPER CASE.
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
private static function _formatClause($s)
|
public static function _formatClause($s)
|
||||||
{
|
{
|
||||||
if ($s === 'order' || $s === 'group') {
|
if ($s === 'order' || $s === 'group') {
|
||||||
$s .= 'By';
|
$s .= 'By';
|
||||||
trigger_error("Did you mean '$s'?", E_USER_NOTICE);
|
trigger_error("Did you mean '$s'?", E_USER_NOTICE);
|
||||||
}
|
}
|
||||||
return strtoupper(preg_replace('#[a-z](?=[A-Z])#', '$0 ', $s));
|
return strtoupper(preg_replace('#[a-z](?=[A-Z])#', '$0 ', $s));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user