diff --git a/core/oqlactualclasstreeresolver.class.inc.php b/core/oqlactualclasstreeresolver.class.inc.php index 93e647db1..ca2cb72a1 100644 --- a/core/oqlactualclasstreeresolver.class.inc.php +++ b/core/oqlactualclasstreeresolver.class.inc.php @@ -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)); } } diff --git a/core/oqlclassnode.class.inc.php b/core/oqlclassnode.class.inc.php index 3377e6359..a57a1a0d2 100644 --- a/core/oqlclassnode.class.inc.php +++ b/core/oqlclassnode.class.inc.php @@ -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; + } + } \ No newline at end of file diff --git a/core/oqlclasstreeoptimizer.class.inc.php b/core/oqlclasstreeoptimizer.class.inc.php index e8f096497..0472863e7 100644 --- a/core/oqlclasstreeoptimizer.class.inc.php +++ b/core/oqlclasstreeoptimizer.class.inc.php @@ -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) diff --git a/core/querybuilderexpressions.class.inc.php b/core/querybuilderexpressions.class.inc.php index f2263225c..5f3aca1cf 100644 --- a/core/querybuilderexpressions.class.inc.php +++ b/core/querybuilderexpressions.class.inc.php @@ -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); diff --git a/core/sqlobjectquerybuilder.class.inc.php b/core/sqlobjectquerybuilder.class.inc.php index d0d6c98f9..8390bb071 100644 --- a/core/sqlobjectquerybuilder.class.inc.php +++ b/core/sqlobjectquerybuilder.class.inc.php @@ -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; diff --git a/test/ItopTestCase.php b/test/ItopTestCase.php index 60a61aaa0..638a6a64a 100644 --- a/test/ItopTestCase.php +++ b/test/ItopTestCase.php @@ -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; + } + } \ No newline at end of file diff --git a/test/core/OQLToSQLAllClassesTest.php b/test/core/OQLToSQLAllClassesTest.php new file mode 100644 index 000000000..a3e2942d2 --- /dev/null +++ b/test/core/OQLToSQLAllClassesTest.php @@ -0,0 +1,342 @@ +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; + } + } +} diff --git a/test/core/OQLToSQLTest.php b/test/core/OQLToSQLTest.php index cef247f2b..d7ac941fe 100644 --- a/test/core/OQLToSQLTest.php +++ b/test/core/OQLToSQLTest.php @@ -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),