N°2272 - OQL performance (SQL Generation)

This commit is contained in:
Eric
2019-09-24 18:10:46 +02:00
parent 496ea830c5
commit 51ee3b31cb
8 changed files with 503 additions and 49 deletions

View File

@@ -17,6 +17,7 @@ class OQLActualClassTreeResolver
*
* @param OQLClassNode $oOQLClassNode
* @param QueryBuilderContext $oBuild
* @param array $aJoinedAliases
*/
public function __construct($oOQLClassNode, $oBuild)
{
@@ -27,13 +28,21 @@ class OQLActualClassTreeResolver
/**
* Assign attributes on their original classes
*
* @param string $sIncomingKeyAttCode Key used for the join (entry point of the class)
*
* @return \OQLClassNode
* @throws \CoreException
*/
public function Resolve()
public function Resolve($sIncomingKeyAttCode = null)
{
$sClassAlias = $this->oOQLClassNode->GetClassAlias();
$sClass = $this->oOQLClassNode->GetClass();
$sClass = $this->oOQLClassNode->GetNodeClass();
$sClassAlias = $this->oOQLClassNode->GetNodeClassAlias();
$aExpectedAttributes = $this->oBuild->m_oQBExpressions->GetUnresolvedFields($sClassAlias);
if (!is_null($sIncomingKeyAttCode) && !isset($aExpectedAttributes[$sIncomingKeyAttCode]))
{
// Add entry point as expected attribute
$aExpectedAttributes[$sIncomingKeyAttCode] = new FieldExpression($sIncomingKeyAttCode, $sClassAlias);
}
$aClasses = MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL, false);
/** @var OQLClassNode[] $aClassAndAncestorsNodes */
$aClassAndAncestorsNodes = array();
@@ -46,6 +55,12 @@ class OQLActualClassTreeResolver
}
}
if (empty($aClassAndAncestorsNodes))
{
throw new CoreException("Impossible to query the class $sClass");
}
$oBaseNode = null;
$aTranslateFields = array();
foreach ($aExpectedAttributes as $sAttCode => $oExpression)
{
@@ -76,19 +91,29 @@ class OQLActualClassTreeResolver
if ($sOriginClass != $sClass)
{
// Alias changed, set a new translation
$sOriginClassAlias = $oOriginClassNode->GetClassAlias();
$sOriginClassAlias = $oOriginClassNode->GetNodeClassAlias();
$aTranslateFields[$sClassAlias][$sAttCode] = new FieldExpression($sAttCode, $sOriginClassAlias);
}
// Add Joins corresponding to external keys
$this->ResolveJoins($sAttCode, $oOriginClassNode);
if ($sAttCode === $sIncomingKeyAttCode)
{
// This is the entry point of the class
$oBaseNode = $oOriginClassNode;
}
}
// Create joins for ancestor classes
/** @var \OQLClassNode $oBaseNode */
$oBaseNode = null;
$sFirstValidAncestor = null;
foreach ($aClassAndAncestorsNodes as $sOriginClass => $oOriginClassNode)
{
if (is_null($sFirstValidAncestor))
{
$sFirstValidAncestor = $sOriginClass;
}
if (is_null($oOriginClassNode))
{
continue;
@@ -98,19 +123,33 @@ class OQLActualClassTreeResolver
$oBaseNode = $oOriginClassNode;
continue;
}
// Add inner join
if ($oBaseNode === $oOriginClassNode)
{
// Don't link to itself
continue;
}
$oBaseNode->AddInnerJoin($oOriginClassNode, 'id', 'id');
}
if (is_null($oBaseNode))
{
// If no class was generated above, keep the initial one
return $this->oOQLClassNode;
// If no class was generated above, keep the first valid ancestor
if (is_null($sFirstValidAncestor) || ($sFirstValidAncestor == $sClass))
{
// take current node
$oBaseNode = $this->oOQLClassNode->CloneNode();
}
else
{
// Use the first valid class to build a default node
$sDefaultClassAlias = $this->oBuild->GenerateTableAlias($sClassAlias.'_'.$sFirstValidAncestor, $sClass);
$oBaseNode = new OQLClassNode($this->oBuild, $sFirstValidAncestor, $sDefaultClassAlias);
}
}
if (isset($aExpectedAttributes['id']) && !isset($aClassAndAncestorsNodes[$sClass]))
{
$sFirstClassAlias = $oBaseNode->GetClassAlias();
$sFirstClassAlias = $oBaseNode->GetNodeClassAlias();
$aTranslateFields[$sClassAlias]['id'] = new FieldExpression('id', $sFirstClassAlias);
}
$this->oBuild->m_oQBExpressions->Translate($aTranslateFields, false);
@@ -119,10 +158,10 @@ class OQLActualClassTreeResolver
$this->ResolveJoins('id', $oBaseNode);
// Add finalclass condition if not the requested class
if ($oBaseNode->GetClass() != $sClass)
if ($oBaseNode->GetNodeClass() != $sClass)
{
$sExpectedClasses = implode("', '", MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL));
$oInExpression = Expression::FromOQL("`".$oBaseNode->GetClassAlias()."`.finalclass IN ('$sExpectedClasses')");
$oInExpression = Expression::FromOQL("`".$oBaseNode->GetNodeClassAlias()."`.finalclass IN ('$sExpectedClasses')");
$oTrueExpression = new TrueExpression();
$aCoalesceAttr = array($oInExpression, $oTrueExpression);
$oFinalClassRestriction = new FunctionExpression("COALESCE", $aCoalesceAttr);
@@ -134,6 +173,7 @@ class OQLActualClassTreeResolver
/**
* Move the joins from the selected class to the class where the external key is instantiated
* The joined class is also resolved using the right key as entry point
*
* @param string $sAttCode (can be an external key)
* @param \OQLClassNode $oOriginClassNode real class to join
@@ -149,9 +189,11 @@ class OQLActualClassTreeResolver
{
foreach ($aJoins[$sAttCode] as $oBaseOQLJoin)
{
// transfer the join from OQL class tree to actual class tree
$oBaseJoinedClassNode = $oBaseOQLJoin->GetOOQLClassNode();
$oOQLActualClassTreeResolver = new OQLActualClassTreeResolver($oBaseJoinedClassNode, $this->oBuild);
$oResolvedClassNode = $oOQLActualClassTreeResolver->Resolve();
// Use the right key to link to actual join class tree
$oResolvedClassNode = $oOQLActualClassTreeResolver->Resolve($oBaseOQLJoin->GetRightField());
$oOriginClassNode->AddOQLJoin($sAttCode, $oBaseOQLJoin->NewOQLJoinWithClassNode($oResolvedClassNode));
}
}

View File

@@ -7,9 +7,10 @@
class OQLClassNode
{
private $sClass;
private $sClassAlias;
private $sSelectedClassAlias;
private $sNodeClass;
private $sNodeClassAlias;
/** @var string Class alias coming from OQL */
private $sOQLClassAlias;
/** @var OQLJoin[][] */
private $aJoins;
private $aExtKeys;
@@ -19,27 +20,37 @@ class OQLClassNode
* OQLClassNode constructor.
*
* @param QueryBuilderContext $oBuild
* @param string $sClass Current node class
* @param string $sNodeClass Current node class
* @param string $sClassAlias Current node class alias
* @param string $sSelectedClassAlias Alias of the class requested in the filter (defaulted to $sClassAlias if null)
* @param string $sOQLClassAlias Alias of the class requested in the filter (defaulted to $sClassAlias if null)
*/
public function __construct($oBuild, $sClass, $sClassAlias, $sSelectedClassAlias = null)
public function __construct($oBuild, $sNodeClass, $sClassAlias, $sOQLClassAlias = null)
{
$this->sClass = $sClass;
$this->sClassAlias = $sClassAlias;
$this->sNodeClass = $sNodeClass;
$this->sNodeClassAlias = $sClassAlias;
$this->aJoins = array();
$this->aExtKeys = array();
if (is_null($sSelectedClassAlias))
if (is_null($sOQLClassAlias))
{
$this->sSelectedClassAlias = $sClassAlias;
$this->sOQLClassAlias = $sClassAlias;
}
else
{
$this->sSelectedClassAlias = $sSelectedClassAlias;
$this->sOQLClassAlias = $sOQLClassAlias;
}
$this->oBuild = $oBuild;
}
/**
* clone without joins
*
* @return \OQLClassNode
*/
public function CloneNode()
{
return new self($this->oBuild, $this->sNodeClass, $this->sNodeClassAlias, $this->sOQLClassAlias);
}
public function AddExternalKey($sKeyAttCode)
{
if (!isset($this->aExtKeys[$sKeyAttCode]))
@@ -85,8 +96,8 @@ class OQLClassNode
{
// Record Left join field expression
// (right join field expression is recorded in OQLJoin)
$sJoinFieldName = $this->GetClassAlias().'.'.$sLeftField;
$this->oBuild->m_oQBExpressions->AddJoinField($sJoinFieldName, new FieldExpression($sLeftField, $this->GetClassAlias()));
$sJoinFieldName = $this->sNodeClassAlias.'.'.$sLeftField;
$this->oBuild->m_oQBExpressions->AddJoinField($sJoinFieldName, new FieldExpression($sLeftField, $this->sNodeClassAlias));
$this->aJoins[$sLeftField][] = $oOQLJoin;
}
@@ -97,12 +108,12 @@ class OQLClassNode
public function RenderDebug()
{
$sOQL = "SELECT `{$this->sClassAlias}` FROM `{$this->sClass}` AS `{$this->sClassAlias}`";
$sOQL = "SELECT `{$this->sNodeClassAlias}` FROM `{$this->sNodeClass}` AS `{$this->sNodeClassAlias}`";
foreach ($this->aJoins as $aJoins)
{
foreach ($aJoins as $oJoin)
{
$sOQL .= "{$oJoin->RenderDebug($this->sClassAlias)}";
$sOQL .= "{$oJoin->RenderDebug($this->sNodeClassAlias)}";
}
}
@@ -125,22 +136,22 @@ class OQLClassNode
return $this->aExtKeys[$sAttCode];
}
public function GetClass()
public function GetNodeClass()
{
return $this->sClass;
return $this->sNodeClass;
}
public function GetClassAlias()
public function GetNodeClassAlias()
{
return $this->sClassAlias;
return $this->sNodeClassAlias;
}
/**
* @return string
*/
public function GetSelectedClassAlias()
public function GetOQLClassAlias()
{
return $this->sSelectedClassAlias;
return $this->sOQLClassAlias;
}
public function GetJoins()
@@ -192,8 +203,8 @@ class OQLJoin
{
// Record right join field expression
// (left join field expression is recorded in OQLClassNode)
$sJoinFieldName = $oOQLClassNode->GetClassAlias().'.'.$sRightField;
$oBuild->m_oQBExpressions->AddJoinField($sJoinFieldName, new FieldExpression($sRightField, $oOQLClassNode->GetClassAlias()));
$sJoinFieldName = $oOQLClassNode->GetNodeClassAlias().'.'.$sRightField;
$oBuild->m_oQBExpressions->AddJoinField($sJoinFieldName, new FieldExpression($sRightField, $oOQLClassNode->GetNodeClassAlias()));
$this->sJoinType = $sJoinType;
$this->oOQLClassNode = $oOQLClassNode;
@@ -253,7 +264,7 @@ class OQLJoin
$sLeftFieldRight = $sSQLLeft.'_right';
$sRightFieldLeft = $sSQLRight.'_left';
$sRightFieldRight = $sSQLRight.'_right';
$sRightTableAlias = $this->oOQLClassNode->GetClassAlias();
$sRightTableAlias = $this->oOQLClassNode->GetNodeClassAlias();
$oBaseSQLQuery->AddInnerJoinTree($oJoinedSQLQuery, $sLeftFieldLeft, $sLeftFieldRight, $sRightFieldLeft, $sRightFieldRight, $sRightTableAlias, $this->sTreeOperator, $this->bInvertOnClause);
break;
}
@@ -262,15 +273,15 @@ class OQLJoin
public function RenderDebug($sClassAlias, $sPrefix = " ")
{
$sType = strtoupper($this->sJoinType);
$sOQL = "\n{$sPrefix}{$sType} JOIN `{$this->oOQLClassNode->GetClass()}` AS `{$this->oOQLClassNode->GetClassAlias()}`";
$sOQL = "\n{$sPrefix}{$sType} JOIN `{$this->oOQLClassNode->GetNodeClass()}` AS `{$this->oOQLClassNode->GetNodeClassAlias()}`";
//$sOQL = str_pad($sOQL, 100);
$sOQL .= "\n{$sPrefix} ON `{$sClassAlias}`.`{$this->sLeftField}` = `{$this->oOQLClassNode->GetClassAlias()}`.`{$this->sRightField}`";
$sOQL .= "\n{$sPrefix} ON `{$sClassAlias}`.`{$this->sLeftField}` = `{$this->oOQLClassNode->GetNodeClassAlias()}`.`{$this->sRightField}`";
$sPrefix .= " ";
foreach ($this->oOQLClassNode->GetJoins() as $aJoins)
{
foreach ($aJoins as $oJoin)
{
$sOQL .= " {$oJoin->RenderDebug($this->oOQLClassNode->GetClassAlias(), $sPrefix)}";
$sOQL .= " {$oJoin->RenderDebug($this->oOQLClassNode->GetNodeClassAlias(), $sPrefix)}";
}
}
@@ -293,4 +304,12 @@ class OQLJoin
return $this->bOutbound;
}
/**
* @return string
*/
public function GetRightField()
{
return $this->sRightField;
}
}

View File

@@ -39,7 +39,7 @@ class OQLClassTreeOptimizer
*/
private function PruneJoins($oCurrentClassNode)
{
$aExpectedAttributes = $this->oBuild->m_oQBExpressions->GetExpectedFields($oCurrentClassNode->GetClassAlias());
$aExpectedAttributes = $this->oBuild->m_oQBExpressions->GetExpectedFields($oCurrentClassNode->GetNodeClassAlias());
$bCanBeRemoved = empty($aExpectedAttributes);
foreach ($oCurrentClassNode->GetJoins() as $sLeftKey => $aJoins)

View File

@@ -40,6 +40,7 @@ class QueryBuilderExpressions
$this->m_aSelectExpr = is_null($aSelectExpr) ? array() : $aSelectExpr;
$this->m_aGroupByExpr = $aGroupByExpr;
$this->m_aJoinFields = array();
$this->m_aJoinFields = array();
$this->m_aClassIds = array();
foreach ($oSearch->GetJoinedClasses() as $sClassAlias => $sClass)
@@ -189,7 +190,6 @@ class QueryBuilderExpressions
{
$this->m_aJoinFields[$index] = $oExpression->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
}
foreach ($this->m_aClassIds as $sClass => $oExpression)
{
$this->m_aClassIds[$sClass] = $oExpression->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);

View File

@@ -190,11 +190,11 @@ class SQLObjectQueryBuilder
*/
private function MakeSQLObjectQueryNode($oBuild, $oOQLClassNode, $aValues)
{
$sClass = $oOQLClassNode->GetClass();
$sClass = $oOQLClassNode->GetNodeClass();
$sTable = MetaModel::DBGetTable($sClass);
$sClassAlias = $oOQLClassNode->GetClassAlias();
$sSelectedClassAlias = $oOQLClassNode->GetSelectedClassAlias();
$bIsOnQueriedClass = array_key_exists($sClassAlias, $oBuild->GetRootFilter()->GetSelectedClasses());
$sClassAlias = $oOQLClassNode->GetNodeClassAlias();
$sSelectedClassAlias = $oOQLClassNode->GetOQLClassAlias();
$bIsOnQueriedClass = array_key_exists($sSelectedClassAlias, $oBuild->GetRootFilter()->GetSelectedClasses());
$aExpectedAttributes = $oBuild->m_oQBExpressions->GetUnresolvedFields($sClassAlias);
$oSelectedIdField = null;

View File

@@ -26,11 +26,14 @@ namespace Combodo\iTop\Test\UnitTest;
*/
use PHPUnit\Framework\TestCase;
use SetupUtils;
define('DEBUG_UNIT_TEST', true);
class ItopTestCase extends TestCase
{
const TEST_LOG_DIR = 'test';
protected function setUp()
{
@include_once '../approot.inc.php';
@@ -64,7 +67,34 @@ class ItopTestCase extends TestCase
public function GetMicroTime()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
list($uSec, $sec) = explode(" ", microtime());
return ((float)$uSec + (float)$sec);
}
public function WriteToCsvHeader($sFilename, $aHeader)
{
$sResultFile = APPROOT.'log/'.$sFilename;
if (is_file($sResultFile))
{
@unlink($sResultFile);
}
SetupUtils::builddir(dirname($sResultFile));
file_put_contents($sResultFile, implode(';', $aHeader)."\n");
}
public function WriteToCsvData($sFilename, $aData)
{
$sResultFile = APPROOT.'log/'.$sFilename;
$file = fopen($sResultFile, 'a');
fputs($file, implode(';', $aData)."\n");
fclose($file);
}
public function GetTestId()
{
$sId = str_replace('"', '', $this->getName());
$sId = str_replace(' ', '_', $sId);
return $sId;
}
}

View File

@@ -0,0 +1,342 @@
<?php
namespace Combodo\iTop\Test\UnitTest\Core;
@include_once '../approot.inc.php';
@include_once '../../approot.inc.php';
@include_once '../../../approot.inc.php';
@include_once '../../../../approot.inc.php';
require_once(APPROOT.'bootstrap.inc.php');
require_once(APPROOT.'application/startup.inc.php');
define('PRECISION', 2);
use CMDBSource;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
use DBSearch;
use MetaModel;
use SetupUtils;
use utils;
/**
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
* @backupGlobals disabled
*/
class OQLToSQLAllCLassesTest extends ItopDataTestCase
{
const USE_TRANSACTION = false;
const CREATE_TEST_ORG = false;
public function setUp()
{
parent::setUp();
SetupUtils::builddir(APPROOT.'log/test/OQLToSQL');
}
private function GetPreviousTestResult($sTestId)
{
$sResultFile = APPROOT.'log/test/OQLToSQL/'.$sTestId.'.txt';
if (!is_file($sResultFile))
{
return null;
}
$aResult = unserialize(file_get_contents($sResultFile));
return $aResult;
}
private function SaveTestResult($sTestId, $aResult)
{
$sResultFile = APPROOT.'log/test/OQLToSQL/'.$sTestId.'.txt';
if (is_file($sResultFile))
{
@unlink($sResultFile);
}
file_put_contents($sResultFile, serialize($aResult));
}
/**
* @doesNotPerformAssertions
*
* @throws \ConfigException
* @throws \CoreException
*/
public function testOQLLegacySetup()
{
utils::GetConfig()->Set('use_legacy_dbsearch', true, 'Test');
utils::GetConfig()->Set('apc_cache.enabled', false, 'Test');
utils::GetConfig()->Set('expression_cache_enabled', false, 'Test');
utils::GetConfig()->Set('query_cache_enabled', false, 'Test');
$sConfigFile = utils::GetConfig()->GetLoadedFile();
@chmod($sConfigFile, 0770);
utils::GetConfig()->WriteToFile();
@chmod($sConfigFile, 0444); // Read-only
SetupUtils::rrmdir($sResultFile = APPROOT.'log/test');
}
/**
* @dataProvider OQLSelectProvider
* @depends testOQLLegacySetup
*
* @param $sOQL
*
* @param array $aOrderBy
* @param array $aArgs
* @param null $aAttToLoad
* @param null $aExtendedDataSpec
* @param int $iLimitCount
* @param int $iLimitStart
*
* @throws \Exception
* @throws \MissingQueryArgument
* @throws \OQLException
*/
public function testOQLLegacyAllClasses($sOQL, $aOrderBy = array(), $aArgs = array(), $aAttToLoad = null, $aExtendedDataSpec = null, $iLimitCount = 20, $iLimitStart = 0)
{
$this->assertTrue(utils::GetConfig()->Get('use_legacy_dbsearch'));
$this->assertFalse(utils::GetConfig()->Get('apc_cache.enabled'));
$this->assertFalse(utils::GetConfig()->Get('query_cache_enabled'));
$this->assertFalse(utils::GetConfig()->Get('expression_cache_enabled'));
$aPrevious = $this->GetPreviousTestResult($this->GetId());
if (is_null($aPrevious))
{
$aResult = $this->OQLSelectRunner($sOQL, $aOrderBy, $aArgs, $aAttToLoad, $aExtendedDataSpec, $iLimitCount, $iLimitStart);
// no test yet, just save
$this->SaveTestResult($this->GetId(), $aResult);
$this->debug("Test result saved");
}
$this->assertTrue(true);
}
/**
* @doesNotPerformAssertions
*
* @throws \ConfigException
* @throws \CoreException
*/
public function testOQLSetup()
{
utils::GetConfig()->Set('use_legacy_dbsearch', false, 'test');
utils::GetConfig()->Set('apc_cache.enabled', false, 'test');
utils::GetConfig()->Set('query_cache_enabled', false, 'test');
utils::GetConfig()->Set('expression_cache_enabled', false, 'test');
$sConfigFile = utils::GetConfig()->GetLoadedFile();
@chmod($sConfigFile, 0770);
utils::GetConfig()->WriteToFile();
@chmod($sConfigFile, 0444); // Read-only
}
/**
* @dataProvider OQLSelectProvider
* @depends testOQLSetup
*
* @param $sOQL
*
* @param array $aOrderBy
* @param array $aArgs
* @param null $aAttToLoad
* @param null $aExtendedDataSpec
* @param int $iLimitCount
* @param int $iLimitStart
*
* @throws \Exception
* @throws \MissingQueryArgument
* @throws \OQLException
*/
public function testOQLAllClasses($sOQL, $aOrderBy = array(), $aArgs = array(), $aAttToLoad = null, $aExtendedDataSpec = null, $iLimitCount = 20, $iLimitStart = 0)
{
$this->assertFalse(utils::GetConfig()->Get('use_legacy_dbsearch'));
$this->assertFalse(utils::GetConfig()->Get('apc_cache.enabled'));
$this->assertFalse(utils::GetConfig()->Get('query_cache_enabled'));
$this->assertFalse(utils::GetConfig()->Get('expression_cache_enabled'));
$aResult = $this->OQLSelectRunner($sOQL, $aOrderBy, $aArgs, $aAttToLoad, $aExtendedDataSpec, $iLimitCount, $iLimitStart);
$this->assertNull($aResult);
}
/**
* @param $sOQL
*
* @param array $aOrderBy
* @param array $aArgs
* @param null $aAttToLoad
* @param null $aExtendedDataSpec
* @param int $iLimitCount
* @param int $iLimitStart
*
* @return array|null
* @throws \Exception
* @throws \MissingQueryArgument
* @throws \OQLException
*/
private function OQLSelectRunner($sOQL, $aOrderBy = array(), $aArgs = array(), $aAttToLoadNames = null, $aExtendedDataSpec = null, $iLimitCount = 20, $iLimitStart = 0)
{
if (is_null($aAttToLoadNames))
{
$aAttToLoad = null;
}
else
{
$aAttToLoad = array();
foreach ($aAttToLoadNames as $sClass => $aAttCodes)
{
$aAttToLoad[$sClass] = array();
foreach ($aAttCodes as $sAttCode)
{
if (!empty($sAttCode))
{
if (MetaModel::IsValidAttCode($sClass, $sAttCode))
{
$aAttToLoad[$sClass][$sAttCode] = MetaModel::GetAttributeDef($sClass, $sAttCode);
}
}
}
}
}
$oSearch = DBSearch::FromOQL($sOQL);
$sSQLCount = $oSearch->MakeSelectQuery($aOrderBy, $aArgs, $aAttToLoad, $aExtendedDataSpec, 0, 0, true);
$fStart = $this->GetMicroTime();
$aRow = $this->GetArrayResult($sSQLCount);
$fCountDuration = $this->GetMicroTime() - $fStart;
if (is_null($aRow))
{
$iCount = 0;
}
else
{
$iCount = intval($aRow[0]['COUNT']);
}
$iJoinCount = count(explode(' JOIN ', $sSQLCount)) - 1;
$sSQL = $oSearch->MakeSelectQuery($aOrderBy, $aArgs, $aAttToLoad, $aExtendedDataSpec, $iLimitCount, $iLimitStart);
$fStart = $this->GetMicroTime();
$aRow = $this->GetArrayResult($sSQL);
$fDataDuration = $this->GetMicroTime() - $fStart;
if (is_null($aRow))
{
$aRow = array();
}
// Store only to the 10 first entries
$aRow = array_slice($aRow, 0, 10);
$iJoinData = count(explode(' JOIN ', $sSQL)) - 1;
$aResult = array(
'oql' => $sOQL,
'count_sql' => $sSQLCount,
'count_join_count' => $iJoinCount,
'count' => $iCount,
'count_duration' => $fCountDuration,
'data_sql' => $sSQL,
'data_join_count' => $iJoinData,
'data_duration' => $fDataDuration,
);
//$this->debug($aResult);
$aResult['data'] = $aRow;
$aPrevious = $this->GetPreviousTestResult($this->GetId());
if (is_null($aPrevious))
{
return $aResult;
}
$this->debug("count: ".$aResult['count']);
$this->debug("count_join_count: ".$aPrevious['count_join_count']." -> ".$aResult['count_join_count']);
$this->debug("count_duration : ".round($aPrevious['count_duration'], PRECISION)." -> ".round($aResult['count_duration'], PRECISION));
$this->debug("data_join_count : ".$aPrevious['data_join_count']." -> ".$aResult['data_join_count']);
$this->debug("data_duration : ".round($aPrevious['data_duration'], PRECISION)." -> ".round($aResult['data_duration'], PRECISION));
// Compare result
$aFields = array('oql', 'count', 'data');
foreach ($aFields as $sField)
{
$this->assertEquals($aPrevious[$sField], $aResult[$sField], "$sField differ");
}
if ($aPrevious['data_join_count'] != $aResult['data_join_count'])
{
unset($aPrevious['data']);
unset($aResult['data']);
$this->debug("Previous");
$this->debug($aPrevious);
$this->debug("Current");
$this->debug($aResult);
}
return null;
}
public function OQLSelectProvider()
{
$aData = array();
// $sOQL, $aOrderBy = array(), $aArgs = array(), $aAttToLoad = null, $aExtendedDataSpec = null, $iLimitCount = 20, $iLimitStart = 0
$aClasses = MetaModel::GetClasses();
sort($aClasses);
foreach ($aClasses as $sClass)
{
$sOQL = "SELECT $sClass";
$aOrderBy = array();
if (MetaModel::IsValidAttCode($sClass, 'friendlyname'))
{
$aOrderBy["$sClass.friendlyname"] = true;
}
$aData[$sOQL] = array($sOQL, $aOrderBy, array(), null, null, 10, 0);
}
return $aData;
}
private function GetId()
{
$sId = str_replace('"', '', $this->getName());
$sId = str_replace('Legacy', '', $sId);
$sId = str_replace(' ', '_', $sId);
return $sId;
}
/**
* @param $sSQL
*
* @param int $iLimit
*
* @return array|null
* @throws \CoreException
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
*/
private function GetArrayResult($sSQL, $iLimit = 10)
{
$resQuery = CMDBSource::Query($sSQL);
if (!$resQuery)
{
return null;
}
else
{
$aRow = array();
$iCount = 0;
while ($aRes = CMDBSource::FetchArray($resQuery))
{
if ($iCount < $iLimit)
{
$aRow[] = $aRes;
}
$iCount++;
unset($aRes);
}
CMDBSource::FreeResult($resQuery);
return $aRow;
}
}
}

View File

@@ -27,6 +27,7 @@ class OQLToSQLTest extends ItopDataTestCase
{
const USE_TRANSACTION = false;
const CREATE_TEST_ORG = false;
const TEST_CSV_RESULT = 'OQLToSQLTest.csv';
public function setUp()
{
@@ -164,6 +165,16 @@ class OQLToSQLTest extends ItopDataTestCase
@chmod($sConfigFile, 0770);
utils::GetConfig()->WriteToFile();
@chmod($sConfigFile, 0444); // Read-only
$aCSVHeader = array(
'test', 'OQL','count',
'Legacy Count Joins', 'Count Joins',
'Legacy Count Duration', 'Count Duration',
'Legacy Data Joins', 'Data Joins',
'Legacy Data Duration', 'Data Duration',
'Count Joins Diff', 'Data Joins Diff',
);
$this->WriteToCsvHeader(self::TEST_CSV_RESULT, $aCSVHeader);
}
/**
@@ -320,6 +331,16 @@ class OQLToSQLTest extends ItopDataTestCase
$this->debug("data_join_count : ".$aPrevious['data_join_count']." -> ".$aResult['data_join_count']);
$this->debug("data_duration : ".round($aPrevious['data_duration'], PRECISION)." -> ".round($aResult['data_duration'], PRECISION));
$aCSVData = array(
$this->GetId(), $sOQL, $aResult['count'],
$aPrevious['count_join_count'], $aResult['count_join_count'],
round($aPrevious['count_duration'], PRECISION), round($aResult['count_duration'], PRECISION),
$aPrevious['data_join_count'], $aResult['data_join_count'],
round($aPrevious['data_duration'], PRECISION), round($aResult['data_duration'], PRECISION),
$aPrevious['count_join_count'] - $aResult['count_join_count'], $aPrevious['data_join_count'] - $aResult['data_join_count'],
);
$this->WriteToCsvData(self::TEST_CSV_RESULT, $aCSVData);
// Compare result
$aFields = array('oql', 'count', 'data');
foreach ($aFields as $sField)
@@ -378,12 +399,12 @@ class OQLToSQLTest extends ItopDataTestCase
return array(
"SELECT WebServer 150" => array("SELECT `WebServer` FROM WebServer AS `WebServer` WHERE 1", array(), array(), $aAttToLoad150, null, null, 3, 0),
"SELECT WebServer 151" => array("SELECT `WebServer` FROM WebServer AS `WebServer` WHERE 1", array(), array(), array(), null, null, 3, 0),
"SELECT L JOIN 176" => array("SELECT `L` FROM Location AS `L` JOIN Person AS `P` ON `P`.location_id = `L`.id WHERE 1", array(), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT L JOIN 176" => array("SELECT `L` FROM Location AS `L` JOIN Person AS `P` ON `P`.location_id = `L`.id WHERE 1", unserialize('a:1:{s:14:"L.friendlyname";b:1;}'), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT P JOIN 177" => array("SELECT `P` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id WHERE 1", array(), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT L,P JOIN 178" => array("SELECT `L`, `P` FROM Location AS `L` JOIN Person AS `P` ON `P`.location_id = `L`.id WHERE 1", array(), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT P,L JOIN 179" => array("SELECT `P`, `L` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id WHERE 1", array(), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT L,P JOIN 180" => array("SELECT `L`, `P` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id WHERE 1", array(), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT L JOIN 181" => array("SELECT `L` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id WHERE 1", array(), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT L JOIN 181" => array("SELECT `L` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id WHERE 1", unserialize('a:1:{s:14:"L.friendlyname";b:1;}'), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":25:{s:17:" * oContactObject";O:6:"Person":24:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:13:" * m_aChanges";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 3, 0),
"SELECT UserRequest 14" => array("SELECT `UserRequest` FROM UserRequest AS `UserRequest` WHERE (`UserRequest`.`status` != 'closed')", array(), unserialize('a:3:{s:18:"current_contact_id";i:1;s:22:"current_user->object()";O:9:"UserLocal":24:{s:17:" * oContactObject";O:6:"Person":23:{s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:14:{s:4:"name";s:12:"My last name";s:6:"status";s:6:"active";s:6:"org_id";i:1;s:8:"org_name";s:21:"My Company/Department";s:5:"email";s:16:"my.email@foo.org";s:5:"phone";s:15:"+00 000 000 000";s:6:"notify";s:3:"yes";s:8:"function";s:0:"";s:10:"finalclass";s:6:"Person";s:12:"friendlyname";s:26:"My first name My last name";s:17:"obsolescence_flag";b:0;s:17:"obsolescence_date";N;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:14:{s:4:"name";b:1;s:6:"status";b:1;s:6:"org_id";b:1;s:8:"org_name";b:1;s:5:"email";b:1;s:5:"phone";b:1;s:6:"notify";b:1;s:8:"function";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:17:"obsolescence_flag";b:1;s:17:"obsolescence_date";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:12:" * m_iFormId";N;s:13:" * aFieldsMap";N;s:14:" * bAllowWrite";b:0;s:15:" * m_datCreated";N;s:15:" * m_datUpdated";N;s:12:" * m_bIsInDB";b:1;s:9:" * m_iKey";s:1:"1";s:23:" DBObject m_aCurrValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:16:" * m_aOrigValues";a:15:{s:9:"contactid";i:1;s:9:"last_name";s:12:"My last name";s:10:"first_name";s:13:"My first name";s:5:"email";s:16:"my.email@foo.org";s:6:"org_id";i:1;s:5:"login";s:5:"admin";s:8:"language";s:5:"EN US";s:6:"status";s:7:"enabled";s:15:"reset_pwd_token";O:11:"ormPassword":2:{s:12:" * m_sHashed";s:0:"";s:10:" * m_sSalt";s:0:"";}s:10:"finalclass";s:9:"UserLocal";s:12:"friendlyname";s:5:"admin";s:22:"contactid_friendlyname";s:26:"My first name My last name";s:27:"contactid_obsolescence_flag";b:0;s:19:"org_id_friendlyname";s:21:"My Company/Department";s:24:"org_id_obsolescence_flag";b:0;}s:18:" * m_aExtendedData";N;s:18:" DBObject m_bDirty";b:0;s:24:" DBObject m_bCheckStatus";b:1;s:19:" * m_bSecurityIssue";N;s:17:" * m_aCheckIssues";N;s:19:" * m_aCheckWarnings";N;s:18:" * m_aDeleteIssues";N;s:24:" DBObject m_bFullyLoaded";b:0;s:22:" DBObject m_aLoadedAtt";a:15:{s:9:"contactid";b:1;s:9:"last_name";b:1;s:10:"first_name";b:1;s:5:"email";b:1;s:6:"org_id";b:1;s:5:"login";b:1;s:8:"language";b:1;s:6:"status";b:1;s:15:"reset_pwd_token";b:1;s:10:"finalclass";b:1;s:12:"friendlyname";b:1;s:22:"contactid_friendlyname";b:1;s:27:"contactid_obsolescence_flag";b:1;s:19:"org_id_friendlyname";b:1;s:24:"org_id_obsolescence_flag";b:1;}s:16:" * m_aTouchedAtt";a:0:{}s:17:" * m_aModifiedAtt";a:0:{}s:17:" * m_aSynchroData";N;s:19:" * m_sHighlightCode";N;s:15:" * m_aCallbacks";a:0:{}}s:25:"current_contact->object()";r:4;}'), null, null, 24, 0),
"SELECT UserRequest 212" => array("SELECT `UserRequest` FROM UserRequest AS `UserRequest` WHERE (ISNULL(`UserRequest`.`org_id`) != 1)", unserialize('a:1:{s:24:"UserRequest.friendlyname";b:1;}'), unserialize('a:19:{s:22:"ActionEmail_finalclass";s:11:"ActionEmail";s:19:"UserInternal_status";s:6:"active";s:18:"current_contact_id";s:0:"";s:2:"id";s:1:"3";s:5:"login";s:5:"admin";s:9:"menu_code";s:15:"WelcomeMenuPage";s:4:"name";s:13:"database_uuid";s:14:"this->brand_id";s:1:"1";s:16:"this->finalclass";s:13:"NetworkDevice";s:8:"this->id";s:1:"3";s:17:"this->location_id";s:1:"2";s:12:"this->org_id";s:1:"3";s:17:"this->osfamily_id";s:1:"6";s:18:"this->osversion_id";s:1:"8";s:13:"this->rack_id";s:1:"3";s:18:"this->request_type";s:8:"incident";s:16:"this->service_id";s:1:"1";s:7:"user_id";s:1:"5";s:6:"userid";s:1:"5";}'), null, null, 24, 0),
"SELECT UserRequest 208" => array("SELECT `UserRequest` FROM UserRequest AS `UserRequest` WHERE ((`UserRequest`.`status` NOT IN ('closed', 'rejected')) AND (ISNULL(`UserRequest`.`agent_id`) != 1))", unserialize('a:1:{s:24:"UserRequest.friendlyname";b:1;}'), unserialize('a:19:{s:22:"ActionEmail_finalclass";s:11:"ActionEmail";s:19:"UserInternal_status";s:6:"active";s:18:"current_contact_id";s:0:"";s:2:"id";s:1:"3";s:5:"login";s:5:"admin";s:9:"menu_code";s:15:"WelcomeMenuPage";s:4:"name";s:13:"database_uuid";s:14:"this->brand_id";s:1:"1";s:16:"this->finalclass";s:13:"NetworkDevice";s:8:"this->id";s:1:"3";s:17:"this->location_id";s:1:"2";s:12:"this->org_id";s:1:"3";s:17:"this->osfamily_id";s:1:"6";s:18:"this->osversion_id";s:1:"8";s:13:"this->rack_id";s:1:"3";s:18:"this->request_type";s:8:"incident";s:16:"this->service_id";s:1:"1";s:7:"user_id";s:1:"5";s:6:"userid";s:1:"5";}'), null, null, 0, 0),