Browse Source

Improved the run query page: added meaningfull examples, including "ticket of the user currently logged in", and did some cosmetics on the page (examples shown in a drawer) ; needed to add some options to the OQL (date intervals)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@122 a333f486-631f-4898-b8df-5754b55c2be0
romainq 15 years ago
parent
commit
6e4255e0a1

+ 6 - 0
addons/userrights/userrightsmatrix.class.inc.php

@@ -336,6 +336,12 @@ class UserRightsMatrix extends UserRightsAddOnAPI
 		return $oLogin->Get('userid');
 		return $oLogin->Get('userid');
 	}
 	}
 
 
+	public function GetContactId($sUserName)
+	{
+		// this module has no link with the business data
+		return null;
+	}
+
 	public function GetFilter($sUserName, $sClass)
 	public function GetFilter($sUserName, $sClass)
 	{
 	{
 		$oNullFilter  = new DBObjectSearch($sClass);
 		$oNullFilter  = new DBObjectSearch($sClass);

+ 6 - 0
addons/userrights/userrightsnull.class.inc.php

@@ -47,6 +47,12 @@ class UserRightsNull extends UserRightsAddOnAPI
 		return 1;
 		return 1;
 	}
 	}
 
 
+	public function GetContactId($sUserName)
+	{
+		// this module has no link with the business data
+		return null;
+	}
+
 	public function GetFilter($sUserName, $sClass)
 	public function GetFilter($sUserName, $sClass)
 	{
 	{
 		$oNullFilter  = new DBObjectSearch($sClass);
 		$oNullFilter  = new DBObjectSearch($sClass);

+ 20 - 7
addons/userrights/userrightsprofile.class.inc.php

@@ -733,6 +733,8 @@ class UserRightsProfile extends UserRightsAddOnAPI
 	protected $m_aUserProfiles = array(); // userid,profileid -> object
 	protected $m_aUserProfiles = array(); // userid,profileid -> object
 	protected $m_aProPro = array(); // profileid,dimensionid -> object
 	protected $m_aProPro = array(); // profileid,dimensionid -> object
 
 
+	protected $m_aLogin2UserId = array(); // login -> id
+
 	protected $m_aAdmins = array(); // id of users being linked to the profile #ADMIN_PROFILE_ID
 	protected $m_aAdmins = array(); // id of users being linked to the profile #ADMIN_PROFILE_ID
 
 
 	protected $m_aClassActionGrants = array(); // profile, class, action -> permission
 	protected $m_aClassActionGrants = array(); // profile, class, action -> permission
@@ -746,7 +748,8 @@ class UserRightsProfile extends UserRightsAddOnAPI
 		$oUserSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Users"));
 		$oUserSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Users"));
 		while ($oUser = $oUserSet->Fetch())
 		while ($oUser = $oUserSet->Fetch())
 		{
 		{
-			$this->m_aUsers[$oUser->GetKey()] = $oUser; 
+			$this->m_aUsers[$oUser->GetKey()] = $oUser;
+			$this->m_aLogin2UserId[$oUser->Get('login')] = $oUser->GetKey();  
 		}
 		}
 
 
 		$oDimensionSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Dimensions"));
 		$oDimensionSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Dimensions"));
@@ -818,15 +821,25 @@ exit;
 
 
 	public function GetUserId($sUserName)
 	public function GetUserId($sUserName)
 	{
 	{
-		$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Users WHERE login = :login"), array(), array('login' => $sUserName));
-		if ($oSet->Count() < 1)
+		if (array_key_exists($sUserName, $this->m_aLogin2UserId))
 		{
 		{
-		// todo: throw an exception?
-			return false;
+			// This happens really when the list of users is being loaded into the cache!!!
+			$iUserId = $this->m_aLogin2UserId[$sUserName];  
+			return $iUserId;
 		}
 		}
+		return null;
+	}
 
 
-		$oUser = $oSet->Fetch();
-		return $oUser->GetKey();
+	public function GetContactId($sUserName)
+	{
+		if (array_key_exists($sUserName, $this->m_aLogin2UserId))
+		{
+			// This happens really when the list of users is being loaded into the cache!!!
+			$iUserId = $this->m_aLogin2UserId[$sUserName];  
+			$oUser = $this->m_aUsers[$iUserId];
+			return $oUser->Get('userid');
+		}
+		return null;
 	}
 	}
 
 
 	public function GetFilter($sUserName, $sClass)
 	public function GetFilter($sUserName, $sClass)

+ 4 - 0
core/metamodel.class.php

@@ -1202,6 +1202,10 @@ abstract class MetaModel
 				$aScalarArgs[$sArgName] = (string) $value;
 				$aScalarArgs[$sArgName] = (string) $value;
 			}
 			}
 		}
 		}
+		// Add standard contextual arguments
+		//
+		$aScalarArgs['current_contact_id'] = UserRights::GetContactId();
+		
 		return $aScalarArgs;
 		return $aScalarArgs;
 	}
 	}
 
 

+ 26 - 8
core/oql/oql-lexer.php

@@ -125,6 +125,9 @@ class OQLLexerRaw
     			'/^YEAR/',
     			'/^YEAR/',
     			'/^MONTH/',
     			'/^MONTH/',
     			'/^DAY/',
     			'/^DAY/',
+    			'/^HOUR/',
+    			'/^MINUTE/',
+    			'/^SECOND/',
     			'/^DATE_ADD/',
     			'/^DATE_ADD/',
     			'/^DATE_SUB/',
     			'/^DATE_SUB/',
     			'/^ROUND/',
     			'/^ROUND/',
@@ -444,46 +447,61 @@ class OQLLexerRaw
     function yy_r1_43($yy_subpatterns)
     function yy_r1_43($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::F_DATE_ADD;
+	$this->token = OQLParser::F_HOUR;
     }
     }
     function yy_r1_44($yy_subpatterns)
     function yy_r1_44($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::F_DATE_SUB;
+	$this->token = OQLParser::F_MINUTE;
     }
     }
     function yy_r1_45($yy_subpatterns)
     function yy_r1_45($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::F_ROUND;
+	$this->token = OQLParser::F_SECOND;
     }
     }
     function yy_r1_46($yy_subpatterns)
     function yy_r1_46($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::F_FLOOR;
+	$this->token = OQLParser::F_DATE_ADD;
     }
     }
     function yy_r1_47($yy_subpatterns)
     function yy_r1_47($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::NUMVAL;
+	$this->token = OQLParser::F_DATE_SUB;
     }
     }
     function yy_r1_48($yy_subpatterns)
     function yy_r1_48($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::STRVAL;
+	$this->token = OQLParser::F_ROUND;
     }
     }
     function yy_r1_49($yy_subpatterns)
     function yy_r1_49($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::NAME;
+	$this->token = OQLParser::F_FLOOR;
     }
     }
     function yy_r1_50($yy_subpatterns)
     function yy_r1_50($yy_subpatterns)
     {
     {
 
 
-	$this->token = OQLParser::VARNAME;
+	$this->token = OQLParser::NUMVAL;
     }
     }
     function yy_r1_51($yy_subpatterns)
     function yy_r1_51($yy_subpatterns)
     {
     {
 
 
+	$this->token = OQLParser::STRVAL;
+    }
+    function yy_r1_52($yy_subpatterns)
+    {
+
+	$this->token = OQLParser::NAME;
+    }
+    function yy_r1_53($yy_subpatterns)
+    {
+
+	$this->token = OQLParser::VARNAME;
+    }
+    function yy_r1_54($yy_subpatterns)
+    {
+
 	$this->token = OQLParser::DOT;
 	$this->token = OQLParser::DOT;
     }
     }
 
 

+ 12 - 0
core/oql/oql-lexer.plex

@@ -97,6 +97,9 @@ f_from_days = "FROM_DAYS"
 f_year     = "YEAR"
 f_year     = "YEAR"
 f_month    = "MONTH"
 f_month    = "MONTH"
 f_day      = "DAY"
 f_day      = "DAY"
+f_hour     = "HOUR"
+f_minute   = "MINUTE"
+f_second   = "SECOND"
 f_date_add = "DATE_ADD"
 f_date_add = "DATE_ADD"
 f_date_sub = "DATE_SUB"
 f_date_sub = "DATE_SUB"
 f_round    = "ROUND"
 f_round    = "ROUND"
@@ -238,6 +241,15 @@ f_month {
 f_day {
 f_day {
 	$this->token = OQLParser::F_DAY;
 	$this->token = OQLParser::F_DAY;
 }
 }
+f_hour {
+	$this->token = OQLParser::F_HOUR;
+}
+f_minute {
+	$this->token = OQLParser::F_MINUTE;
+}
+f_second {
+	$this->token = OQLParser::F_SECOND;
+}
 f_date_add {
 f_date_add {
 	$this->token = OQLParser::F_DATE_ADD;
 	$this->token = OQLParser::F_DATE_ADD;
 }
 }

File diff suppressed because it is too large
+ 444 - 427
core/oql/oql-parser.php


+ 3 - 0
core/oql/oql-parser.y

@@ -118,6 +118,9 @@ arg_list(A) ::= arg_list(L) COMA argument(X). {
 argument(A) ::= expression_prio4(X). { A = X; }
 argument(A) ::= expression_prio4(X). { A = X; }
 argument(A) ::= INTERVAL expression_prio4(X) interval_unit(Y). { A = new IntervalOqlExpression(X, Y); }
 argument(A) ::= INTERVAL expression_prio4(X) interval_unit(Y). { A = new IntervalOqlExpression(X, Y); }
 
 
+interval_unit(A) ::= F_SECOND(X). { A = X; }
+interval_unit(A) ::= F_MINUTE(X). { A = X; }
+interval_unit(A) ::= F_HOUR(X). { A = X; }
 interval_unit(A) ::= F_DAY(X). { A = X; }
 interval_unit(A) ::= F_DAY(X). { A = X; }
 interval_unit(A) ::= F_MONTH(X). { A = X; }
 interval_unit(A) ::= F_MONTH(X). { A = X; }
 interval_unit(A) ::= F_YEAR(X). { A = X; }
 interval_unit(A) ::= F_YEAR(X). { A = X; }

+ 11 - 0
core/userrights.class.inc.php

@@ -50,6 +50,7 @@ abstract class UserRightsAddOnAPI
 	abstract public function Init(); // loads data (possible optimizations)
 	abstract public function Init(); // loads data (possible optimizations)
 	abstract public function CheckCredentials($sLogin, $sPassword); // returns the id of the user or false
 	abstract public function CheckCredentials($sLogin, $sPassword); // returns the id of the user or false
 	abstract public function GetUserId($sLogin); // returns the id of the user or false
 	abstract public function GetUserId($sLogin); // returns the id of the user or false
+	abstract public function GetContactId($sLogin); // returns the id of the "business" user or false
 	abstract public function GetFilter($sLogin, $sClass); // returns a filter object
 	abstract public function GetFilter($sLogin, $sClass); // returns a filter object
 	abstract public function IsActionAllowed($iUserId, $sClass, $iActionCode, dbObjectSet $oInstances);
 	abstract public function IsActionAllowed($iUserId, $sClass, $iActionCode, dbObjectSet $oInstances);
 	abstract public function IsStimulusAllowed($iUserId, $sClass, $sStimulusCode, dbObjectSet $oInstances);
 	abstract public function IsStimulusAllowed($iUserId, $sClass, $sStimulusCode, dbObjectSet $oInstances);
@@ -171,6 +172,16 @@ class UserRights
 		}
 		}
 	}
 	}
 
 
+	public static function GetContactId($sName = '')
+	{
+		// note: returns null if the user management module is not related to the business data model
+		if (empty($sName))
+		{
+			$sName = self::$m_sUser;
+		}
+		return self::$m_oAddOn->GetContactId($sName);
+	}
+
 	public static function GetRealUser()
 	public static function GetRealUser()
 	{
 	{
 		return self::$m_sRealUser;
 		return self::$m_sRealUser;

+ 51 - 33
pages/run_query.php

@@ -7,6 +7,54 @@ require_once('../application/startup.inc.php');
 require_once('../application/loginwebpage.class.inc.php');
 require_once('../application/loginwebpage.class.inc.php');
 login_web_page::DoLogin(); // Check user rights and prompt if needed
 login_web_page::DoLogin(); // Check user rights and prompt if needed
 
 
+
+function ShowExamples($oP, $sExpression)
+{
+	$aExamples = array(
+		"Applications" => "SELECT bizApplication",
+		"Changes planned on new year's day" => "SELECT bizChangeTicket AS ch WHERE ch.start_date >= '2009-12-31' AND ch.end_date <= '2010-01-01'",
+		"Person having an 'A' in their name" => "SELECT bizPerson AS B WHERE B.name LIKE '%A%'",
+		"NW interfaces of equipment in production for customer 'Demo'" => "SELECT bizInterface AS if JOIN bizDevice AS dev ON if.device_id = dev.id WHERE if.status = 'production' AND dev.status = 'production' AND dev.org_name = 'Demo' AND if.physical_type = 'ethernet'",
+		"My tickets" => "SELECT bizIncidentTicket AS i WHERE i.agent_id = :current_contact_id",
+		"People being owner of an active ticket" => "SELECT bizPerson AS p JOIN bizIncidentTicket AS i ON i.agent_id = p.id WHERE i.ticket_status != 'Closed'",
+		"Contracts terminating in the next thirty days" => "SELECT bizContract AS c WHERE c.end_prod > NOW() AND c.end_prod < DATE_ADD(NOW(), INTERVAL 30 DAY)",
+		"Orphan tickets (opened one hour ago, still not assigned)" => "SELECT bizIncidentTicket AS i WHERE i.start_date < DATE_SUB(NOW(), INTERVAL 60 MINUTE) AND i.ticket_status = 'New'",
+		"Long lasting incidents (duration > 8 hours)" => "SELECT bizIncidentTicket AS i WHERE i.end_date > DATE_ADD(i.start_date, INTERVAL 8 HOUR)", 
+	);
+
+	$aDisplayData = array();
+	foreach($aExamples as $sDescription => $sOql)
+	{
+		$sHighlight = '';
+		$sDisable = '';
+		if ($sOql == $sExpression)
+		{
+			// this one is currently being tested, highlight it
+			$sHighlight = "background-color:yellow;";
+			$sDisable = 'disabled';
+		}
+		$aDisplayData[] = array(
+			'desc' => "<div style=\"$sHighlight\">$sDescription</div>",
+			'oql' => "<div style=\"$sHighlight\">$sOql</div>",
+			'go' => "<form method=\"get\"><input type=\"hidden\" name=\"expression\" value=\"$sOql\"><input type=\"submit\" value=\"Test!\" $sDisable></form>\n",
+		);
+	}
+	$aDisplayConfig = array();
+	$aDisplayConfig['desc'] = array('label' => 'Target', 'description' => '');
+	$aDisplayConfig['oql'] = array('label' => 'OQL Expression', 'description' => '');
+	$aDisplayConfig['go'] = array('label' => '', 'description' => '');
+
+	$sStyle = "SearchDrawer DrawerClosed";
+	$oP->add_ready_script("\$(\"#examples_drawer_handle_id\").click(function() {\$(\"#examples_contents_id\").slideToggle('normal'); $(\"#examples_drawer_handle_id\").toggleClass('open');});");
+	$oP->add("<div id=\"examples_contents_id\" class=\"$sStyle\">\n");
+
+	$oP->table($aDisplayConfig, $aDisplayData);
+
+	$oP->add("</div>\n");
+	$oP->add("<div class=\"HRDrawer\"></div>\n");
+	$oP->add("<div id=\"examples_drawer_handle_id\" class=\"DrawerHandle\">Some examples</div>\n");
+}
+
 $sOperation = utils::ReadParam('operation', 'menu');
 $sOperation = utils::ReadParam('operation', 'menu');
 $oContext = new UserContext();
 $oContext = new UserContext();
 $oAppContext = new ApplicationContext();
 $oAppContext = new ApplicationContext();
@@ -19,6 +67,8 @@ $oP = new iTopWebPage("iTop - Expression Evaluation", $currentOrganization);
 $sExpression = utils::ReadParam('expression', '');
 $sExpression = utils::ReadParam('expression', '');
 $sEncoding = utils::ReadParam('encoding', 'oql');
 $sEncoding = utils::ReadParam('encoding', 'oql');
 
 
+ShowExamples($oP, $sExpression);
+
 try
 try
 {
 {
 	if ($sEncoding == 'crypted')
 	if ($sEncoding == 'crypted')
@@ -35,43 +85,12 @@ try
 		// leave $sExpression as is
 		// leave $sExpression as is
 	}
 	}
 
 
-	$aExamples = array(
-		"Applications" => "SELECT bizApplication",
-		"Changes planned on new year's day" => "SELECT bizChangeTicket AS ch WHERE ch.start_date >= '2009-12-31' AND ch.end_date <= '2010-01-01'",
-		"Person having an 'A' in their name" => "SELECT bizPerson AS B WHERE B.name LIKE '%A%'",
-		"NW interfaces of equipment in production for customer 'Demo'" => "SELECT bizInterface AS if JOIN bizDevice AS dev ON if.device_id = dev.id WHERE if.status = 'production' AND dev.status = 'production' AND dev.org_name = 'Demo' AND if.physical_type = 'ethernet'"
-	);
-
 	$oP->add("<form method=\"get\">\n");
 	$oP->add("<form method=\"get\">\n");
 	$oP->add("Expression to evaluate:<br/>\n");
 	$oP->add("Expression to evaluate:<br/>\n");
-	$oP->add("<textarea cols=\"50\" rows=\"20\" name=\"expression\">$sExpression</textarea>\n");
+	$oP->add("<textarea cols=\"80\" rows=\"15\" name=\"expression\">$sExpression</textarea>\n");
 	$oP->add("<input type=\"submit\" value=\" Evaluate \">\n");
 	$oP->add("<input type=\"submit\" value=\" Evaluate \">\n");
 	$oP->add("</form>\n");
 	$oP->add("</form>\n");
 
 
-	$oP->add("<h3>Examples</h3>\n");
-	$aDisplayData = array();
-	foreach($aExamples as $sDescription => $sOql)
-	{
-		$sHighlight = '';
-		$sDisable = '';
-		if ($sOql == $sExpression)
-		{
-			// this one is currently being tested, highlight it
-			$sHighlight = "background-color:yellow;";
-			$sDisable = 'disabled';
-		}
-		$aDisplayData[] = array(
-			'desc' => "<div style=\"$sHighlight\">$sDescription</div>",
-			'oql' => "<div style=\"$sHighlight\">$sOql</div>",
-			'go' => "<form method=\"get\"><input type=\"hidden\" name=\"expression\" value=\"$sOql\"><input type=\"submit\" value=\"Test!\" $sDisable></form>\n",
-		);
-	}
-	$aDisplayConfig = array();
-	$aDisplayConfig['desc'] = array('label' => 'Target', 'description' => '');
-	$aDisplayConfig['oql'] = array('label' => 'OQL Expression', 'description' => '');
-	$aDisplayConfig['go'] = array('label' => '', 'description' => '');
-	$oP->table($aDisplayConfig, $aDisplayData);
-	
 	if (!empty($sExpression))
 	if (!empty($sExpression))
 	{
 	{
 		$oFilter = DBObjectSearch::FromOQL($sExpression);
 		$oFilter = DBObjectSearch::FromOQL($sExpression);
@@ -82,7 +101,6 @@ try
 			$oP->p('Serialized filter: '.$oFilter->serialize());
 			$oP->p('Serialized filter: '.$oFilter->serialize());
 			
 			
 			$oSet = new CMDBObjectSet($oFilter);
 			$oSet = new CMDBObjectSet($oFilter);
-			$oP->p('The query returned '.$oSet->count().' results(s)');
 			cmdbAbstractObject::DisplaySet($oP, $oSet);
 			cmdbAbstractObject::DisplaySet($oP, $oSet);
 		}
 		}
 	}
 	}

Some files were not shown because too many files changed in this diff