Implemented the capability to modify queries by the mean of a plugin (make it work with APC cache)

SVN:1.2[1842]
This commit is contained in:
Romain Quetiez
2012-02-06 10:54:35 +00:00
parent f9e7446e7b
commit c7aa00e81a
3 changed files with 46 additions and 7 deletions

View File

@@ -68,10 +68,6 @@ class DBObjectSearch
$this->m_aParentConditions = array();
$this->m_aModifierProperties = array();
foreach (MetaModel::EnumPlugins('iQueryModifier') as $sPluginClass => $oQueryModifier)
{
$this->m_aModifierProperties[$sPluginClass] = ApplicationContext::GetPluginProperties($sPluginClass);
}
}
public function AllowAllData() {$this->m_bAllowAllData = true;}

View File

@@ -1934,12 +1934,40 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
}
}
// Compute query modifiers properties (can be set in the search itself, by the context, etc.)
//
$aModifierProperties = array();
foreach (MetaModel::EnumPlugins('iQueryModifier') as $sPluginClass => $oQueryModifier)
{
// Lowest precedence: the application context
$aPluginProps = ApplicationContext::GetPluginProperties($sPluginClass);
// Highest precedence: programmatically specified (or OQL)
foreach($oFilter->GetModifierProperties($sPluginClass) as $sProp => $value)
{
$aPluginProps[$sProp] = $value;
}
if (count($aPluginProps) > 0)
{
$aModifierProperties[$sPluginClass] = $aPluginProps;
}
}
if (self::$m_bQueryCacheEnabled || self::$m_bTraceQueries)
{
// Need to identify the query
$sOqlQuery = $oFilter->ToOql();
$sRawId = $sOqlQuery;
if (count($aModifierProperties))
{
array_multisort($aModifierProperties);
$sModifierProperties = json_encode($aModifierProperties);
}
else
{
$sModifierProperties = '';
}
$sRawId = $sOqlQuery.$sModifierProperties;
if (!is_null($aAttToLoad))
{
foreach($aAttToLoad as $sAlias => $aAttributes)
@@ -2035,7 +2063,7 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
if (!isset($oSelect))
{
$oBuild = new QueryBuilderContext($oFilter);
$oBuild = new QueryBuilderContext($oFilter, $aModifierProperties);
$oKPI = new ExecutionKPI();
$oSelect = self::MakeQuery($oBuild, $oFilter, $aAttToLoad, array(), true /* main query */);

View File

@@ -28,16 +28,19 @@ class QueryBuilderContext
protected $m_oRootFilter;
protected $m_aClassAliases;
protected $m_aTableAliases;
protected $m_aModifierProperties;
public $m_oQBExpressions;
public function __construct($oFilter)
public function __construct($oFilter, $aModifierProperties)
{
$this->m_oRootFilter = $oFilter;
$this->m_oQBExpressions = new QueryBuilderExpressions($oFilter->GetCriteria());
$this->m_aClassAliases = $oFilter->GetJoinedClasses();
$this->m_aTableAliases = array();
$this->m_aModifierProperties = $aModifierProperties;
}
public function GetRootFilter()
@@ -54,6 +57,18 @@ class QueryBuilderContext
{
return MetaModel::GenerateUniqueAlias($this->m_aClassAliases, $sNewName, $sRealName);
}
public function GetModifierProperties($sPluginClass)
{
if (array_key_exists($sPluginClass, $this->m_aModifierProperties))
{
return $this->m_aModifierProperties[$sPluginClass];
}
else
{
return array();
}
}
}
?>