public static function MakeGroupByQuery(DBObjectSearch $oFilter, $aArgs, $aGroupByExpr, $bExcludeNullValues = false) { $aAttToLoad = array(); if ($bExcludeNullValues) { // Null values are not handled (though external keys set to 0 are allowed) $oQueryFilter = $oFilter->DeepClone(); foreach ($aGroupByExpr as $oGroupByExp) { $oNull = new FunctionExpression('ISNULL', array($oGroupByExp)); $oNotNull = new BinaryExpression($oNull, '!=', new TrueExpression()); $oQueryFilter->AddConditionExpression($oNotNull); } } else { $oQueryFilter = $oFilter; } $oSelect = self::MakeSelectStructure($oQueryFilter, array(), $aArgs, $aAttToLoad, null, 0, 0, false, $aGroupByExpr); $aScalarArgs = array_merge(self::PrepareQueryArguments($aArgs), $oFilter->GetInternalParams()); try { $bBeautifulSQL = self::$m_bTraceQueries || self::$m_bDebugQuery || self::$m_bIndentQueries; $sRes = $oSelect->RenderGroupBy($aScalarArgs, $bBeautifulSQL); } catch (MissingQueryArgument $e) { // Add some information... $e->addInfo('OQL', $oFilter->ToOQL()); throw $e; } self::AddQueryTraceGroupBy($oFilter, $aArgs, $aGroupByExpr, $sRes); return $sRes; }