// require_once ('../bootstrap.inc.php'); require_once(APPROOT.'application/application.inc.php'); require_once(APPROOT.'application/itopwebpage.class.inc.php'); require_once(APPROOT.'application/startup.inc.php'); require_once(APPROOT.'application/loginwebpage.class.inc.php'); ///////////////////////////////////////////////////////////////////// // Main program // LoginWebPage::DoLogin(true); // Check user rights and prompt if needed $sSubmit = utils::ReadParam('submit', '', false, 'raw_data'); if ($sSubmit != 'Reset') { $sOQL = utils::ReadParam('OQL_Request', '', false, 'raw_data'); } else { $sOQL = ''; } $bError = false; $oP = new iTopWebPage('Database inconsistencies'); $oP->set_base(utils::GetAbsoluteUrlAppRoot().'test/'); $oP->set_title('Grouping with functions'); $oP->add('

Grouping with functions

'); $oP->add('
'); try { if (!empty($sOQL)) { // Getting class attributes $oSearch = DBSearch::FromOQL($sOQL); $aSearches = $oSearch->GetSearches(); if ($oSearch instanceof DBUnionSearch) { $sClass = $aSearches[0]->GetClassAlias(); $sRealClass = $aSearches[0]->GetClass(); } else { $sClass = $oSearch->GetClassAlias(); $sRealClass = $oSearch->GetClass(); } $sGroupBy1 = utils::ReadParam('groupby_1', ''); $sGroupBy2 = utils::ReadParam('groupby_2', ''); $sOrderBy1 = utils::ReadParam('orderby_1', ''); $sOrderBy2 = utils::ReadParam('orderby_2', ''); $sAttributesOptions1 = ''; $sAttributesOptions2 = ''; $sAttributesOptions3 = ''; $sAttributesOptions4 = ''; foreach(array('_itop_sum_', '_itop_avg_', '_itop_min_', '_itop_max_', '_itop_count_', 'group1', 'group2') as $sAttCode) { $sAttributesOptions3 .= ''; $sAttributesOptions4 .= ''; } foreach(MetaModel::ListAttributeDefs($sRealClass) as $sAttCode => $oAttDef) { // Skip this attribute if not defined in this table if ($oSearch instanceof DBUnionSearch) { foreach($aSearches as $oSubQuery) { $sSubClass = $oSubQuery->GetClass(); if (!MetaModel::IsValidAttCode($sSubClass, $sAttCode)) { continue 2; } } } $sAttributesOptions1 .= ''; $sAttributesOptions2 .= ''; } $iLimit = intval(utils::ReadParam('top', '0')); $sInvOrder1 = utils::ReadParam('desc1', ''); $sCheck1 = ($sInvOrder1 == 'on' ? 'checked' : ''); $sInvOrder2 = utils::ReadParam('desc2', ''); $sCheck2 = ($sInvOrder2 == 'on' ? 'checked' : ''); $sFuncField = utils::ReadParam('funcfield', ''); $sFuncFieldOption = ''; foreach(MetaModel::ListAttributeDefs($sRealClass) as $sAttCode => $oAttDef) { // Skip this attribute if not defined in this table if ($oSearch instanceof DBUnionSearch) { foreach($aSearches as $oSubQuery) { $sSubClass = $oSubQuery->GetClass(); if (!MetaModel::IsValidAttCode($sSubClass, $sAttCode)) { continue 2; } } } switch (get_class($oAttDef)) { case 'Integer': case 'AttributeDecimal': case 'AttributeDuration': case 'AttributeSubItem': case 'AttributePercentage': $sFuncFieldOption .= ''; break; } } } } catch (Exception $e) { $oP->p('
'.$e->getMessage().'
'); $bError = true; } $oP->add("
"); $oP->add("\n"); $oP->add("
"); $oP->add("
"); $oP->add( <<
EOF ); if (!empty($sOQL) && !$bError) { $oP->add( <<
EOF ); } $oP->add("\n"); $oP->add(""); $sSQL = ''; if (empty($sOQL) || empty($sGroupBy1)) { $oP->output(); return; } try { $iLimitStart = 0; $aOrderBy = array(); if (!empty($sOrderBy1)) { $aOrderBy[$sOrderBy1] = ($sInvOrder1 != 'on'); } if (!empty($sOrderBy2)) { $aOrderBy[$sOrderBy2] = ($sInvOrder2 != 'on'); } $aGroupBy = array(); $oExpr1 = Expression::FromOQL($sClass.'.'.$sGroupBy1); $aGroupBy["group1"] = $oExpr1; if (!empty($sGroupBy2)) { $oExpr2 = Expression::FromOQL($sClass.'.'.$sGroupBy2); $aGroupBy["group2"] = $oExpr2; } $aArgs = array(); if (empty($sFuncField)) { $aFunctions = array(); } else { $oTimeExpr = Expression::FromOQL($sClass.'.'.$sFuncField); $oSumExpr = new FunctionExpression('SUM', array($oTimeExpr)); $oAvgExpr = new FunctionExpression('AVG', array($oTimeExpr)); $oMinExpr = new FunctionExpression('MIN', array($oTimeExpr)); $oMaxExpr = new FunctionExpression('MAX', array($oTimeExpr)); // Alias => Expression $aFunctions = array( '_itop_sum_' => $oSumExpr, '_itop_avg_' => $oAvgExpr, '_itop_min_' => $oMinExpr, '_itop_max_' => $oMaxExpr, ); } $sSQL = $oSearch->MakeGroupByQuery($aArgs, $aGroupBy, false, $aFunctions, $aOrderBy, $iLimit, $iLimitStart); $aRes = CMDBSource::QueryToArray($sSQL); // Display results if (!empty($aRes)) { $oP->add('
'); $oP->add(''); $aLine = $aRes[0]; $aCols = array(); $oP->add(''); foreach(array_keys($aLine) as $item) { if (!is_numeric($item)) { $aCols[] = $item; $oP->add(""); } } $oP->add(''); foreach($aRes as $aLine) { $oP->add(''); foreach($aCols as $sCol) { $oP->add(""); } $oP->add(''); } $oP->add('
$item
".$aLine[$sCol]."
'); $oP->add('
'); } else { $oP->add("

No Result

\n"); } } catch (Exception $e) { $oP->p('
'.$e->getMessage().'
'); $bError = true; } $oP->add("
$sSQL
\n"); $oP->output(); return; /* echo "
";
$aClassSelection = MetaModel::GetClasses();
foreach($aClassSelection as $sClass)
{
	if (!MetaModel::HasTable($sClass))
	{
		continue;
	}
	foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef)
	{
		// Skip this attribute if not defined in this table
		if (!MetaModel::IsAttributeOrigin($sClass, $sAttCode))
		{
			continue;
		}
		switch (get_class($oAttDef))
		{
			case 'Integer':
			case 'AttributeDecimal':
			case 'AttributeDuration':
			case 'AttributeSubItem':
			case 'AttributePercentage':
			echo "$sClass:$sAttCode = ".get_class($oAttDef)."\n";
				break;
		}
	}
}
*/