浏览代码

#132 Views on data model classes

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@429 a333f486-631f-4898-b8df-5754b55c2be0
romainq 15 年之前
父节点
当前提交
fea793e2ba
共有 3 个文件被更改,包括 59 次插入7 次删除
  1. 2 4
      core/dbobjectsearch.class.php
  2. 40 0
      core/metamodel.class.php
  3. 17 3
      pages/ITopConsultant.php

+ 2 - 4
core/dbobjectsearch.class.php

@@ -34,15 +34,13 @@ class DBObjectSearch
 	private $m_aReferencedBy;
 	private $m_aReferencedBy;
 	private $m_aRelatedTo;
 	private $m_aRelatedTo;
 
 
-	public function __construct($sClass, $sClassAlias = '')
+	public function __construct($sClass, $sClassAlias = null)
 	{
 	{
-		if (empty($sClassAlias)) $sClassAlias = $sClass;
+		if (is_null($sClassAlias)) $sClassAlias = $sClass;
 		assert('is_string($sClass)');
 		assert('is_string($sClass)');
 		assert('MetaModel::IsValidClass($sClass)'); // #@# could do better than an assert, or at least give the caller's reference
 		assert('MetaModel::IsValidClass($sClass)'); // #@# could do better than an assert, or at least give the caller's reference
 		// => idee d'un assert avec call stack (autre utilisation = echec sur query SQL)
 		// => idee d'un assert avec call stack (autre utilisation = echec sur query SQL)
 
 
-		if (empty($sClassAlias)) $sClassAlias = $sClass;
-
 		$this->m_aSelectedClasses = array($sClassAlias => $sClass);
 		$this->m_aSelectedClasses = array($sClassAlias => $sClass);
 		$this->m_aClasses = array($sClassAlias => $sClass);
 		$this->m_aClasses = array($sClassAlias => $sClass);
 		$this->m_oSearchCondition = new TrueExpression;
 		$this->m_oSearchCondition = new TrueExpression;

+ 40 - 0
core/metamodel.class.php

@@ -2146,6 +2146,7 @@ abstract class MetaModel
 			CMDBSource::CreateDB(self::$m_sDBName);
 			CMDBSource::CreateDB(self::$m_sDBName);
 		}
 		}
 		self::DBCreateTables();
 		self::DBCreateTables();
+		self::DBCreateViews();
 	}
 	}
 
 
 	protected static function DBCreateTables()
 	protected static function DBCreateTables()
@@ -2169,6 +2170,25 @@ abstract class MetaModel
 		// $sDoCreateAll = implode(" ; ", $aSQL);
 		// $sDoCreateAll = implode(" ; ", $aSQL);
 	}
 	}
 
 
+	protected static function DBCreateViews()
+	{
+		list($aErrors, $aSugFix) = self::DBCheckViews();
+
+		$aSQL = array();
+		foreach ($aSugFix as $sClass => $aTarget)
+		{
+			foreach ($aTarget as $aQueries)
+			{
+				foreach ($aQueries as $sQuery)
+				{
+					//$aSQL[] = $sQuery;
+					// forces a refresh of cached information
+					CMDBSource::CreateTable($sQuery);
+				}
+			}
+		}
+	}
+
 	public static function DBDump()
 	public static function DBDump()
 	{
 	{
 		$aDataDump = array();
 		$aDataDump = array();
@@ -2411,6 +2431,26 @@ abstract class MetaModel
 		return array($aErrors, $aSugFix);
 		return array($aErrors, $aSugFix);
 	}
 	}
 
 
+	public static function DBCheckViews()
+	{
+		$aErrors = array();
+		$aSugFix = array();
+
+		// Reporting views (must be created after any other table)
+		//
+		foreach (self::GetClasses('bizmodel') as $sClass)
+		{
+			$sView = "view_$sClass";
+			if (!CMDBSource::IsTable($sView))
+			{
+				$oFilter = new DBObjectSearch($sClass, '');
+				$sSQL = self::MakeSelectQuery($oFilter);
+				$aErrors[$sClass]['*'][] = "Missing view for class: $sClass";
+				$aSugFix[$sClass]['*'][] = "CREATE VIEW `$sView` AS $sSQL";
+			}
+		}
+		return array($aErrors, $aSugFix);
+	}
 
 
 	private static function DBCheckIntegrity_Check2Delete($sSelWrongRecs, $sErrorDesc, $sClass, &$aErrorsAndFixes, &$iNewDelCount, &$aPlannedDel, $bProcessingFriends = false)
 	private static function DBCheckIntegrity_Check2Delete($sSelWrongRecs, $sErrorDesc, $sClass, &$aErrorsAndFixes, &$iNewDelCount, &$aPlannedDel, $bProcessingFriends = false)
 	{
 	{

+ 17 - 3
pages/ITopConsultant.php

@@ -287,10 +287,11 @@ function printMenu($sConfigFile)
 	echo "   <li><a href=\"$sUrl&todo=showbizmodel\">Browse business model</a></li>";
 	echo "   <li><a href=\"$sUrl&todo=showbizmodel\">Browse business model</a></li>";
 	if ($bHasDB)
 	if ($bHasDB)
 	{
 	{
-		echo "   <li><a href=\"$sUrl&todo=checkmodeltodb\">Concordance between Biz model and DB format</a></li>";
+		echo "   <li><a href=\"$sUrl&todo=checkmodeltodb\">Concordance between Biz model and <b>DB format</b></a></li>";
+		echo "   <li><a href=\"$sUrl&todo=checkmodeltoviews\">Concordance between Biz model and <b>Views</b></a></li>";
 		echo "   <li><a href=\"$sUrl&todo=checkdb\">DB integrity check</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=checkdb\">DB integrity check</a></li>";
+		echo "   <li><a href=\"$sUrl&todo=checkall\">Any check at once (see list above)</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=userrightssetup\">Setup userrights (init DB)</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=userrightssetup\">Setup userrights (init DB)</a></li>";
-		echo "   <li><a href=\"$sUrl&todo=checkall\">Check business model, DB format and data integrity</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=showtables\">Show Tables</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=showtables\">Show Tables</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=debugquery\">Test an OQL query (debug)</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=debugquery\">Test an OQL query (debug)</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=dumpdb\">Dump database</a></li>";
 		echo "   <li><a href=\"$sUrl&todo=dumpdb\">Dump database</a></li>";
@@ -371,7 +372,10 @@ function DisplayDBFormatIssues($aErrors, $aSugFix, $sRepairUrl = "", $sSQLStatem
 			$i = 0;
 			$i = 0;
 			foreach ($aTarget as $sTarget => $aMessages)
 			foreach ($aTarget as $sTarget => $aMessages)
 			{
 			{
-				echo "<p>Wrong declaration for attribute <b>$sTarget</b></p>\n";
+				if ($sTarget != '*')
+				{
+					echo "<p>Wrong declaration for attribute <b>$sTarget</b></p>\n";
+				}
 				$sMsg = implode(' AND ', $aMessages);
 				$sMsg = implode(' AND ', $aMessages);
 				if (!empty($sRepairUrl))
 				if (!empty($sRepairUrl))
 				{
 				{
@@ -518,6 +522,12 @@ else
 			DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql");
 			DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql");
 			echo "done...</br>\n";
 			echo "done...</br>\n";
 			break;
 			break;
+		case "checkmodeltoviews":
+			echo "Check Views...</br>\n";
+			list($aErrors, $aSugFix) = MetaModel::DBCheckViews();
+			DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql");
+			echo "done...</br>\n";
+			break;
 		case "checkdb":
 		case "checkdb":
 			echo "Check DB integrity...</br>\n";
 			echo "Check DB integrity...</br>\n";
 			MetaModel::DBCheckIntegrity($sBaseUrl, "sql");
 			MetaModel::DBCheckIntegrity($sBaseUrl, "sql");
@@ -541,6 +551,10 @@ else
 			list($aErrors, $aSugFix) = MetaModel::DBCheckFormat();
 			list($aErrors, $aSugFix) = MetaModel::DBCheckFormat();
 			DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql");
 			DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql");
 			echo "done...</br>\n";
 			echo "done...</br>\n";
+			echo "Check Views...</br>\n";
+			list($aErrors, $aSugFix) = MetaModel::DBCheckViews();
+			DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql");
+			echo "done...</br>\n";
 			echo "Check DB integrity...</br>\n";
 			echo "Check DB integrity...</br>\n";
 			MetaModel::DBCheckIntegrity($sBaseUrl, "sql");
 			MetaModel::DBCheckIntegrity($sBaseUrl, "sql");
 			echo "done...</br>\n";
 			echo "done...</br>\n";