[limb-svn] r7017 - 3.x/trunk/limb/active_record/src
svn at limb-project.com
svn at limb-project.com
Tue May 13 16:26:48 MSD 2008
Author: slevin
Date: 2008-05-13 16:26:48 +0400 (Tue, 13 May 2008)
New Revision: 7017
URL: http://fisheye.limb-project.com/changelog/limb/?cs=7017
Modified:
3.x/trunk/limb/active_record/src/lmbARRecordSetAttachDecorator.class.php
Log:
== ActiveRecord eager fetching optimized a bit. For now there are no extra database requests for attached objects every rewind of parent collection
Modified: 3.x/trunk/limb/active_record/src/lmbARRecordSetAttachDecorator.class.php
===================================================================
--- 3.x/trunk/limb/active_record/src/lmbARRecordSetAttachDecorator.class.php 2008-05-13 12:05:06 UTC (rev 7016)
+++ 3.x/trunk/limb/active_record/src/lmbARRecordSetAttachDecorator.class.php 2008-05-13 12:26:48 UTC (rev 7017)
@@ -11,7 +11,7 @@
lmb_require('limb/core/src/lmbSet.class.php');
/**
- * class lmbARRecordSetAttachDecorator. This class is a part of eager fetching functionality
+ * class lmbARRecordSetAttachDecorator. This class is a part of eager fetching functionality
*
* @package active_record
* @version $Id$
@@ -35,108 +35,112 @@
parent :: __construct($record_set);
}
-
+
function rewind()
{
foreach($this->attach_relations as $relation_name => $params)
{
- $relation_type = $this->base_object->getRelationType($relation_name);
- $relation_info = $this->base_object->getRelationInfo($relation_name);
-
- $relation_class = $relation_info['class'];
- $relation_object = new $relation_class(null, $this->conn);
-
- switch($relation_type)
+ if(!in_array($relation_name, array_keys($this->loaded_attaches)))
{
- case lmbActiveRecord :: HAS_ONE:
- case lmbActiveRecord :: MANY_BELONGS_TO:
- $ids = lmbArrayHelper :: getColumnValues($this->prefix . $relation_info['field'], $this->iterator);
- if(!count($ids))
+ $relation_type = $this->base_object->getRelationType($relation_name);
+ $relation_info = $this->base_object->getRelationInfo($relation_name);
+
+ $relation_class = $relation_info['class'];
+ $relation_object = new $relation_class(null, $this->conn);
+
+ switch($relation_type)
+ {
+ case lmbActiveRecord :: HAS_ONE:
+ case lmbActiveRecord :: MANY_BELONGS_TO:
+ $ids = lmbArrayHelper :: getColumnValues($this->prefix . $relation_info['field'], $this->iterator);
+ if(!count($ids))
+ $this->loaded_attaches[$relation_name] = array();
+ else
+ {
+ $attached_objects = lmbActiveRecord :: findByIds($relation_class, $ids, $params, $this->conn);
+ $this->loaded_attaches[$relation_name] = lmbCollection :: toFlatArray($attached_objects,
+ $key_field = $relation_object->getPrimaryKeyName(),
+ $export_each = false);
+ }
+ break;
+ case lmbActiveRecord :: BELONGS_TO:
+ $ids = lmbArrayHelper :: getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
+
+ if(!count($ids))
+ $this->loaded_attaches[$relation_name] = array();
+ else
+ {
+ $criteria = lmbSQLCriteria :: in($relation_info['field'], $ids);
+ $params['criteria'] = isset($params['criteria']) ? $params['criteria']->addAnd($criteria) : $criteria;
+ $attached_objects = lmbActiveRecord :: find($relation_class, $params, $this->conn);
+ $this->loaded_attaches[$relation_name] = lmbCollection :: toFlatArray($attached_objects,
+ $key_field = $relation_info['field'],
+ $export_each = false);
+ }
+ break;
+ case lmbActiveRecord :: HAS_MANY:
+ if(!isset($params['sort']))
+ $params['sort'] = $relation_object->getDefaultSortParams();
+
+ $params['sort'] = array($relation_info['field'] => 'ASC') + $params['sort'];
+
+ $query = lmbAROneToManyCollection :: createFullARQueryForRelation($relation_info, $this->conn, $params);
+
+ $ids = lmbArrayHelper :: getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
+
$this->loaded_attaches[$relation_name] = array();
- else
- {
- $attached_objects = lmbActiveRecord :: findByIds($relation_class, $ids, $params, $this->conn);
- $this->loaded_attaches[$relation_name] = lmbCollection :: toFlatArray($attached_objects,
- $key_field = $relation_object->getPrimaryKeyName(),
- $export_each = false);
- }
- break;
- case lmbActiveRecord :: BELONGS_TO:
- $ids = lmbArrayHelper :: getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
-
- if(!count($ids))
- $this->loaded_attaches[$relation_name] = array();
- else
- {
- $criteria = lmbSQLCriteria :: in($relation_info['field'], $ids);
- $params['criteria'] = isset($params['criteria']) ? $params['criteria']->addAnd($criteria) : $criteria;
- $attached_objects = lmbActiveRecord :: find($relation_class, $params, $this->conn);
- $this->loaded_attaches[$relation_name] = lmbCollection :: toFlatArray($attached_objects,
- $key_field = $relation_info['field'],
- $export_each = false);
- }
- break;
- case lmbActiveRecord :: HAS_MANY:
- if(!isset($params['sort']))
- $params['sort'] = $relation_object->getDefaultSortParams();
-
- $params['sort'] = array($relation_info['field'] => 'ASC') + $params['sort'];
-
- $query = lmbAROneToManyCollection :: createFullARQueryForRelation($relation_info, $this->conn, $params);
-
- $ids = lmbArrayHelper :: getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
-
- if(!count($ids))
- $this->loaded_attaches[$relation_name] = array();
- else
- {
+
+ if(!count($ids))
+ break;
+
$query->addCriteria(lmbSQLCriteria :: in($relation_info['field'], $ids));
-
+
$attached_objects = $query->fetch();
-
+
foreach($attached_objects as $attached_object)
$this->loaded_attaches[$relation_name][$attached_object->get($relation_info['field'])][] = $attached_object;
- }
- break;
- case lmbActiveRecord :: HAS_MANY_TO_MANY:
- if(!isset($params['sort']))
- $params['sort'] = $relation_object->getDefaultSortParams();
-
- $params['sort'] = array($relation_info['field'] => 'ASC') + $params['sort'];
-
- $query = lmbARManyToManyCollection :: createFullARQueryForRelation($relation_info, $this->conn, $params);
- $query->addField($relation_info['table']. '.' . $relation_info['field'], "link__id");
-
- $ids = lmbArrayHelper :: getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
- if(!count($ids))
+ break;
+ case lmbActiveRecord :: HAS_MANY_TO_MANY:
+ if(!isset($params['sort']))
+ $params['sort'] = $relation_object->getDefaultSortParams();
+
+ $params['sort'] = array($relation_info['field'] => 'ASC') + $params['sort'];
+
+ $query = lmbARManyToManyCollection :: createFullARQueryForRelation($relation_info, $this->conn, $params);
+ $query->addField($relation_info['table']. '.' . $relation_info['field'], "link__id");
+
+ $ids = lmbArrayHelper :: getColumnValues($this->prefix . $this->base_object->getPrimaryKeyName(), $this->iterator);
+
$this->loaded_attaches[$relation_name] = array();
- else
- {
+
+ if(!count($ids))
+ break;
+
$query->addCriteria(lmbSQLCriteria :: in($relation_info['field'], $ids));
-
+
$attached_objects = $query->fetch();
-
+
foreach($attached_objects as $attached_object)
$this->loaded_attaches[$relation_name][$attached_object->get("link__id")][] = $attached_object;
- }
- break;
+ break;
+ }
}
}
-
+
parent :: rewind();
}
-
+
function current()
{
$object = parent :: current();
-
+
$fields = new lmbSet();
foreach($this->attach_relations as $relation_name => $params)
{
$relation_type = $this->base_object->getRelationType($relation_name);
$relation_info = $this->base_object->getRelationInfo($relation_name);
-
+
switch($relation_type)
{
case lmbActiveRecord :: HAS_ONE:
@@ -160,7 +164,7 @@
break;
}
}
-
+
$object->loadFromRecord($fields);
return $object;
}
More information about the limb-svn
mailing list