Fixed issues with pagination + core limitations in the use of Object Sets (wrong filter when adding objects to a set)

SVN:trunk[1300]
This commit is contained in:
Romain Quetiez
2011-06-24 09:53:45 +00:00
parent 9d2a8d0a67
commit 54d5497f0a
5 changed files with 96 additions and 18 deletions

View File

@@ -32,6 +32,7 @@
class DBObjectSet
{
private $m_oFilter;
private $m_aAddedIds; // Ids of objects added
private $m_aOrderBy;
public $m_bLoaded;
private $m_aData;
@@ -41,6 +42,7 @@ class DBObjectSet
public function __construct(DBObjectSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0)
{
$this->m_oFilter = $oFilter;
$this->m_aAddedIds = array();
$this->m_aOrderBy = $aOrderBy;
$this->m_aArgs = $aArgs;
$this->m_aAttToLoad = null;
@@ -128,7 +130,8 @@ class DBObjectSet
static public function FromScratch($sClass)
{
$oFilter = new CMDBSearchFilter($sClass);
$oFilter = new DBObjectSearch($sClass);
$oFilter->AddConditionExpression(new FalseExpression());
$oRetSet = new self($oFilter);
$oRetSet->m_bLoaded = true; // no DB load
return $oRetSet;
@@ -138,9 +141,7 @@ class DBObjectSet
// input = array of objects
static public function FromArray($sClass, $aObjects)
{
$oFilter = new CMDBSearchFilter($sClass);
$oRetSet = new self($oFilter);
$oRetSet->m_bLoaded = true; // no DB load
$oRetSet = self::FromScratch($sClass);
$oRetSet->AddObjectArray($aObjects, $sClass);
return $oRetSet;
}
@@ -268,8 +269,19 @@ class DBObjectSet
public function GetFilter()
{
// #@# This is false as soon as the set has been manipulated (AddObject...)
return $this->m_oFilter;
if (count($this->m_aAddedIds) == 0)
{
return $this->m_oFilter;
}
else
{
$oFilter = $this->m_oFilter;
$oIdListExpr = ListExpression::FromScalars($this->m_aAddedIds);
$oIdExpr = new FieldExpression('id', $oFilter->GetClassAlias());
$oIdInList = new BinaryExpression($oIdExpr, 'IN', $oIdListExpr);
$oFilter->MergeConditionExpression($oIdInList);
return $oFilter;
}
}
public function GetClass()
@@ -287,6 +299,11 @@ class DBObjectSet
return MetaModel::GetRootClass($this->GetClass());
}
public function GetArgs()
{
return $this->m_aArgs;
}
public function SetLimit($iLimitCount, $iLimitStart = 0)
{
$this->m_iLimitCount = $iLimitCount;
@@ -427,6 +444,7 @@ class DBObjectSet
if (!is_null($oObject))
{
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
$this->m_aAddedIds[] = $oObject->GetKey();
}
}
@@ -442,6 +460,7 @@ class DBObjectSet
if (!is_null($oObject))
{
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
$this->m_aAddedIds[] = $oObject->GetKey();
}
}
}