200% speed increase for get/set with with new Null object
This commit is contained in:
parent
20990ed204
commit
067fe93cef
@ -41,6 +41,10 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
|
|||||||
* @var mixed $generator
|
* @var mixed $generator
|
||||||
*/
|
*/
|
||||||
protected $generator;
|
protected $generator;
|
||||||
|
/**
|
||||||
|
* @var Doctrine_Null $null used for extremely fast SQL null value testing
|
||||||
|
*/
|
||||||
|
protected static $null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* constructor
|
* constructor
|
||||||
@ -53,6 +57,12 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
|
|||||||
$this->generator = new Doctrine_IndexGenerator($name);
|
$this->generator = new Doctrine_IndexGenerator($name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* initNullObject
|
||||||
|
*/
|
||||||
|
public static function initNullObject(Doctrine_Null $null) {
|
||||||
|
self::$null = $null;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @return object Doctrine_Table
|
* @return object Doctrine_Table
|
||||||
*/
|
*/
|
||||||
|
@ -80,7 +80,7 @@ class Doctrine_Collection_Batch extends Doctrine_Collection {
|
|||||||
$proxies = array();
|
$proxies = array();
|
||||||
|
|
||||||
for($i = $e; $i < $e2 && $i < $this->count(); $i++):
|
for($i = $e; $i < $e2 && $i < $this->count(); $i++):
|
||||||
if(is_object($this->data[$i]))
|
if($this->data[$i] instanceof Doctrine_Record)
|
||||||
$id = $this->data[$i]->getID();
|
$id = $this->data[$i]->getID();
|
||||||
elseif(is_array($this->data[$i]))
|
elseif(is_array($this->data[$i]))
|
||||||
$id = $this->data[$i][$identifier];
|
$id = $this->data[$i][$identifier];
|
||||||
@ -120,6 +120,7 @@ class Doctrine_Collection_Batch extends Doctrine_Collection {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get
|
* get
|
||||||
* @param mixed $key the key of the record
|
* @param mixed $key the key of the record
|
||||||
|
@ -25,13 +25,27 @@ class Doctrine_Manager extends Doctrine_Configurable implements Countable, Itera
|
|||||||
/**
|
/**
|
||||||
* @var string $root root directory
|
* @var string $root root directory
|
||||||
*/
|
*/
|
||||||
private $root;
|
private $root;
|
||||||
|
/**
|
||||||
|
* @var Doctrine_Null $null Doctrine_Null object, used for extremely fast null value checking
|
||||||
|
*/
|
||||||
|
private $null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* constructor
|
* constructor
|
||||||
*/
|
*/
|
||||||
private function __construct() {
|
private function __construct() {
|
||||||
$this->root = dirname(__FILE__);
|
$this->root = dirname(__FILE__);
|
||||||
|
$this->null = new Doctrine_Null;
|
||||||
|
|
||||||
|
Doctrine_Record::initNullObject($this->null);
|
||||||
|
Doctrine_Collection::initNullObject($this->null);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return Doctrine_Null
|
||||||
|
*/
|
||||||
|
final public function getNullObject() {
|
||||||
|
return $this->null;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* setDefaultAttributes
|
* setDefaultAttributes
|
||||||
|
@ -84,9 +84,10 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
*/
|
*/
|
||||||
private static $index = 1;
|
private static $index = 1;
|
||||||
/**
|
/**
|
||||||
* @var Doctrine_Null $nullObject a Doctrine_Null object used for SQL null value testing
|
* @var Doctrine_Null $nullObject a Doctrine_Null object used for extremely fast
|
||||||
|
* SQL null value testing
|
||||||
*/
|
*/
|
||||||
private static $nullObject;
|
private static $null;
|
||||||
/**
|
/**
|
||||||
* @var integer $oid object identifier
|
* @var integer $oid object identifier
|
||||||
*/
|
*/
|
||||||
@ -164,8 +165,8 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
/**
|
/**
|
||||||
* initNullObject
|
* initNullObject
|
||||||
*/
|
*/
|
||||||
public static function initNullObject() {
|
public static function initNullObject(Doctrine_Null $null) {
|
||||||
self::$nullObject = new Doctrine_Null;
|
self::$null = $null;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* setUp
|
* setUp
|
||||||
@ -198,7 +199,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
|
|
||||||
foreach($this->table->getColumnNames() as $name) {
|
foreach($this->table->getColumnNames() as $name) {
|
||||||
if( ! isset($tmp[$name])) {
|
if( ! isset($tmp[$name])) {
|
||||||
$this->data[$name] = array();
|
$this->data[$name] = self::$null;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$cols++;
|
$cols++;
|
||||||
@ -231,7 +232,10 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
$this->id = array();
|
$this->id = array();
|
||||||
|
|
||||||
foreach($names as $name) {
|
foreach($names as $name) {
|
||||||
$this->id[$name] = isset($this->data[$name])?$this->data[$name]:null;
|
if($this->data[$name] === self::$null)
|
||||||
|
$this->id[$name] = null;
|
||||||
|
else
|
||||||
|
$this->id[$name] = $this->data[$name];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
endswitch;
|
endswitch;
|
||||||
@ -408,8 +412,8 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
public function get($name) {
|
public function get($name) {
|
||||||
if(isset($this->data[$name])) {
|
if(isset($this->data[$name])) {
|
||||||
|
|
||||||
// check if the property is not loaded (= it is an empty array)
|
// check if the property is null (= it is the Doctrine_Null object located in self::$null)
|
||||||
if(is_array($this->data[$name])) {
|
if($this->data[$name] === self::$null) {
|
||||||
|
|
||||||
// no use trying to load the data from database if the Doctrine_Record is not a proxy
|
// no use trying to load the data from database if the Doctrine_Record is not a proxy
|
||||||
if($this->state == Doctrine_Record::STATE_PROXY) {
|
if($this->state == Doctrine_Record::STATE_PROXY) {
|
||||||
@ -423,7 +427,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
$this->state = Doctrine_Record::STATE_CLEAN;
|
$this->state = Doctrine_Record::STATE_CLEAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(is_array($this->data[$name]))
|
if($this->data[$name] === self::$null)
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return $this->data[$name];
|
return $this->data[$name];
|
||||||
@ -453,7 +457,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
$value = $id;
|
$value = $id;
|
||||||
|
|
||||||
if(isset($this->data[$name])) {
|
if(isset($this->data[$name])) {
|
||||||
if( ! is_array($this->data[$name])) {
|
if($this->data[$name] === self::$null) {
|
||||||
if($this->data[$name] !== $value) {
|
if($this->data[$name] !== $value) {
|
||||||
switch($this->state):
|
switch($this->state):
|
||||||
case Doctrine_Record::STATE_CLEAN:
|
case Doctrine_Record::STATE_CLEAN:
|
||||||
|
@ -24,12 +24,12 @@ $test = new GroupTest("Doctrine Framework Unit Tests");
|
|||||||
|
|
||||||
//$test->addTestCase(new Sensei_UnitTestCase());
|
//$test->addTestCase(new Sensei_UnitTestCase());
|
||||||
|
|
||||||
|
$test->addTestCase(new Doctrine_RecordTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_SessionTestCase());
|
$test->addTestCase(new Doctrine_SessionTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_TableTestCase());
|
$test->addTestCase(new Doctrine_TableTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_RecordTestCase());
|
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_ValidatorTestCase());
|
$test->addTestCase(new Doctrine_ValidatorTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_ManagerTestCase());
|
$test->addTestCase(new Doctrine_ManagerTestCase());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user