array( "Web applications" => "SELECT WebApplication", "Person having an 'A' in their name" => "SELECT Person AS B WHERE B.name LIKE '%A%'", "Servers having a name like dbserver1.demo.com or dbserver023.foo.fr" => "SELECT Server WHERE name REGEXP '^dbserver[0-9]+\\\\..+\\\\.[a-z]{2,3}$'", "Changes planned on new year's day" => "SELECT Change AS ch WHERE ch.start_date >= '2009-12-31' AND ch.end_date <= '2010-01-01'", "IPs in a range" => "SELECT DatacenterDevice AS dev WHERE INET_ATON(dev.managementip) > INET_ATON('10.22.32.224') AND INET_ATON(dev.managementip) < INET_ATON('10.22.32.255')", "Persons below a given root organization" => "SELECT Person AS P JOIN Organization AS Node ON P.org_id = Node.id JOIN Organization AS Root ON Node.parent_id BELOW Root.id WHERE Root.id=1", ), 'Usefull examples' => array( "NW interfaces of equipment in production for customer 'Demo'" => "SELECT PhysicalInterface AS if JOIN DatacenterDevice AS dev ON if.connectableci_id = dev.id WHERE dev.status = 'production' AND dev.organization_name = 'Demo'", "My tickets" => "SELECT Ticket AS t WHERE t.agent_id = :current_contact_id", "People being owner of an active ticket" => "SELECT Person AS p JOIN UserRequest AS u ON u.agent_id = p.id WHERE u.status != 'closed'", "Contracts terminating in the next thirty days" => "SELECT Contract AS c WHERE c.end_date > NOW() AND c.end_date < DATE_ADD(NOW(), INTERVAL 30 DAY)", "Orphan tickets (opened one hour ago, still not assigned)" => "SELECT UserRequest AS u WHERE u.start_date < DATE_SUB(NOW(), INTERVAL 60 MINUTE) AND u.status = 'new'", "Long lasting incidents (duration > 8 hours)" => "SELECT UserRequest AS u WHERE u.close_date > DATE_ADD(u.start_date, INTERVAL 8 HOUR)", ), ); $aDisplayData = array(); $oAppContext = new ApplicationContext(); $sContext = $oAppContext->GetForForm(); foreach($aExamples as $sTopic => $aQueries) { foreach($aQueries as $sDescription => $sOql) { $sHighlight = ''; $sDisable = ''; if ($sOql == $sExpression) { // this one is currently being tested, highlight it $sHighlight = "background-color:yellow;"; $sDisable = 'disabled'; // and remember we are testing a query of the list $bUsingExample = true; } //$aDisplayData[$sTopic][] = array( $aDisplayData[Dict::S('UI:RunQuery:QueryExamples')][] = array( 'desc' => "
'.utils::EscapeHtml($oFilter->ToOQL()).'')); $aMoreInfoBlocks[] = $oDevelopedQuerySet; $oSerializedQuerySet = new FieldSet(Dict::S('UI:RunQuery:SerializedFilter')); $oSerializedQuerySet->AddSubBlock(new Html('
'.utils::EscapeHtml($oFilter->serialize()).'')); $aMoreInfoBlocks[] = $oSerializedQuerySet; $aModifierProperties = MetaModel::MakeModifierProperties($oFilter); // Avoid adding all the fields for counts or "group by" requests $aCountAttToLoad = array(); $sMainClass = null; foreach ($oFilter->GetSelectedClasses() as $sClassAlias => $sClass) { $aCountAttToLoad[$sClassAlias] = array(); if (empty($sMainClass)) { $sMainClass = $sClass; } } $aOrderBy = MetaModel::GetOrderByDefault($sMainClass); if (($oFilter instanceof DBObjectSearch) && !MetaModel::GetConfig()->Get('use_legacy_dbsearch')) { // OQL Developed for Count $oSQLObjectQueryBuilder = new SQLObjectQueryBuilder($oFilter); $oBuild = new QueryBuilderContext($oFilter, $aModifierProperties, null, null, null, $aCountAttToLoad); $oCountDevelopedQuerySet = new FieldSet(Dict::S('UI:RunQuery:DevelopedOQLCount')); $oCountDevelopedQuerySet->AddSubBlock(new Html('
'.$oSQLObjectQueryBuilder->DebugOQLClassTree($oBuild).'')); $aMoreInfoBlocks[] = $oCountDevelopedQuerySet; } // SQL Count $sSQL = $oFilter->MakeSelectQuery(array(), $aRealArgs, $aCountAttToLoad, null, 0, 0, true); $oCountResultQuerySet = new FieldSet(Dict::S('UI:RunQuery:ResultSQLCount')); $oCountResultQuerySet->AddSubBlock(new Html('
'.$sSQL.'')); $aMoreInfoBlocks[] = $oCountResultQuerySet; if (($oFilter instanceof DBObjectSearch) && !MetaModel::GetConfig()->Get('use_legacy_dbsearch')) { // OQL Developed $oSQLObjectQueryBuilder = new SQLObjectQueryBuilder($oFilter); $oBuild = new QueryBuilderContext($oFilter, $aModifierProperties); $oOqlDevelopedQuerySet = new FieldSet(Dict::S('UI:RunQuery:DevelopedOQL')); $oOqlDevelopedQuerySet->AddSubBlock(new Html('
'.$oSQLObjectQueryBuilder->DebugOQLClassTree($oBuild).'')); $aMoreInfoBlocks[] = $oOqlDevelopedQuerySet; } // SQL $sSQL = $oFilter->MakeSelectQuery($aOrderBy, $aRealArgs, null, null, 0, 0, false); $oSqlQuerySet = new FieldSet(Dict::S('UI:RunQuery:ResultSQL')); $oSqlQuerySet->AddSubBlock(new Html('
'.$sSQL.'')); $aMoreInfoBlocks[] = $oSqlQuerySet; $oMoreInfoSection = new CollapsibleSection(Dict::S('UI:RunQuery:MoreInfo'), $aMoreInfoBlocks); $oMoreInfoSection->EnableSaveCollapsibleState('run_query__more-info'); $oP->AddUiBlock($oMoreInfoSection); } elseif ($sSyntaxError) { $oSyntaxErrorPanel = PanelUIBlockFactory::MakeForFailure(Dict::S('UI:RunQuery:Error')); $oP->AddUiBlock($oSyntaxErrorPanel); if ($e instanceof OqlException) { $sWrongWord = $e->GetWrongWord(); $aSuggestedWords = $e->GetSuggestions(); if (is_array($aSuggestedWords) && count($aSuggestedWords) > 0) { $sSuggestedWord = OqlException::FindClosestString($sWrongWord, $aSuggestedWords); if (strlen($sSuggestedWord) > 0) { $sSyntaxErrorText = $e->GetIssue().'
Suggesting: $sFixedExpressionHtml
"; $oSyntaxErrorPanel->AddSubBlock(new Html($sSyntaxErrorText)); $sEscapedExpression = utils::EscapeHtml(addslashes($sFixedExpression)); $oUseSuggestedQueryButton = ButtonUIBlockFactory::MakeForDestructiveAction('Use this query'); $oUseSuggestedQueryButton->SetOnClickJsCode(<<'.$e->getTraceAsString().'' ); $oErrorAlert->SetOpenedByDefault(false); $oP->AddUiBlock($oErrorAlert); } $oP->output();