1
0
mirror of https://github.com/dg/dibi.git synced 2025-08-05 13:47:33 +02:00

DibiFluent: speed optimizations

This commit is contained in:
David Grudl
2010-08-03 08:13:04 +02:00
parent bcee7bba91
commit 9d27c7cc4e

View File

@@ -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));
} }