Tag: cws_dev300_dba30d
User: oj      
Date: 2008-06-02 13:46:14+0000
Modified:
   dba/dbaccess/source/ui/querydesign/QueryDesignView.cxx
   dba/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx

Log:
 #i90244# handle group by and having

File Changes:

Directory: /dba/dbaccess/source/ui/querydesign/
===============================================

File [changed]: QueryDesignView.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/ui/querydesign/QueryDesignView.cxx?r1=1.92.8.2&r2=1.92.8.3
Delta lines:  +28 -24
---------------------
--- QueryDesignView.cxx 2008-05-29 11:30:21+0000        1.92.8.2
+++ QueryDesignView.cxx 2008-06-02 13:46:11+0000        1.92.8.3
@@ -7,7 +7,7 @@
  * OpenOffice.org - a multi-platform office productivity suite
  *
  * $RCSfile: QueryDesignView.cxx,v $
- * $Revision: 1.92.8.2 $
+ * $Revision: 1.92.8.3 $
  *
  * This file is part of OpenOffice.org.
  *
@@ -955,8 +955,8 @@
                                                        ::rtl::OUString aTmp = 
aCriteria;
                                                        ::rtl::OUString 
aErrorMsg;
                                                        Reference<XPropertySet> 
xColumn;
-                                                       
::connectivity::OSQLParseNode* pParseNode = 
_pView->getPredicateTreeFromEntry(pEntryField,aTmp,aErrorMsg,xColumn);
-                                                       if (pParseNode)
+                            ::std::auto_ptr< ::connectivity::OSQLParseNode> 
pParseNode(_pView->getPredicateTreeFromEntry(pEntryField,aTmp,aErrorMsg,xColumn));
+                                                       if (pParseNode.get())
                                                        {
                                                                if (bMulti && 
!(pEntryField->isOtherFunction() || (aFieldName.toChar() == '*')))
                                                                        
pParseNode->replaceNodeValue(pEntryField->GetAlias(),aFieldName);
@@ -970,7 +970,6 @@
                                                                                
                                                sal_False,
                                                                                
                                                
!pEntryField->isOtherFunction());
                                                                aHavingStr = 
sHavingStr;
-                                                               delete 
pParseNode;
                                                        }
                                                        else
                                                                aHavingStr += 
aCriteria;
@@ -987,8 +986,8 @@
                                                        ::rtl::OUString aTmp = 
aCriteria;
                                                        ::rtl::OUString 
aErrorMsg;
                                                        Reference<XPropertySet> 
xColumn;
-                                                       
::connectivity::OSQLParseNode* pParseNode = 
_pView->getPredicateTreeFromEntry(pEntryField,aTmp,aErrorMsg,xColumn);
-                                                       if (pParseNode)
+                                                       ::std::auto_ptr< 
::connectivity::OSQLParseNode> pParseNode( 
_pView->getPredicateTreeFromEntry(pEntryField,aTmp,aErrorMsg,xColumn));
+                                                       if (pParseNode.get())
                                                        {
                                                                if (bMulti && 
!(pEntryField->isOtherFunction() || (aFieldName.toChar() == '*')))
                                                                        
pParseNode->replaceNodeValue(pEntryField->GetAlias(),aFieldName);
@@ -999,7 +998,6 @@
                                                                                
                                        sal_False,
                                                                                
                                        !pEntryField->isOtherFunction() );
                                                                aWhereStr = 
aWhere;
-                                                               delete 
pParseNode;
                                                        }
                                                        else
                                                        {
@@ -1291,17 +1289,18 @@
        
//------------------------------------------------------------------------------
        ::rtl::OUString GenerateGroupBy(const OQueryDesignView* 
_pView,OTableFields& _rFieldList, sal_Bool bMulti )
        {
-
         OQueryController& rController = 
static_cast<OQueryController&>(_pView->getController());
-               Reference< XConnection> xConnection = 
rController.getConnection();
+               const Reference< XConnection> xConnection = 
rController.getConnection();
                if(!xConnection.is())
                        return ::rtl::OUString();
 
+        ::std::map< rtl::OUString,bool> aGroupByNames;
+
                ::rtl::OUString aGroupByStr;
                try
                {
-                       Reference< XDatabaseMetaData >  xMetaData = 
xConnection->getMetaData();
-                       ::rtl::OUString aQuote = 
xMetaData->getIdentifierQuoteString();
+                       const Reference< XDatabaseMetaData >  xMetaData = 
xConnection->getMetaData();
+                       const ::rtl::OUString aQuote = 
xMetaData->getIdentifierQuoteString();
 
                        OTableFields::iterator aIter = _rFieldList.begin();
                        for(;aIter != _rFieldList.end();++aIter)
@@ -1310,18 +1309,20 @@
                                if ( pEntryField->IsGroupBy() )
                                {
                                        
DBG_ASSERT(pEntryField->GetField().getLength(),"Kein FieldName vorhanden!;-(");
-                                       aGroupByStr += 
quoteTableAlias(bMulti,pEntryField->GetAlias(),aQuote);
+                                       ::rtl::OUString sGroupByPart = 
quoteTableAlias(bMulti,pEntryField->GetAlias(),aQuote);
 
                                        // only quote the field name when it 
isn't calculated
                                        if ( pEntryField->isNoneFunction() )
-                                               aGroupByStr += 
::dbtools::quoteName(aQuote, pEntryField->GetField());
+                    {
+                                               sGroupByPart += 
::dbtools::quoteName(aQuote, pEntryField->GetField());
+                    }
                                        else
                     {
                         ::rtl::OUString aTmp = pEntryField->GetField();
                                                ::rtl::OUString aErrorMsg;
                                                Reference<XPropertySet> xColumn;
-                                               ::connectivity::OSQLParseNode* 
pParseNode = 
_pView->getPredicateTreeFromEntry(pEntryField,aTmp,aErrorMsg,xColumn);
-                                               if (pParseNode)
+                        ::std::auto_ptr< ::connectivity::OSQLParseNode> 
pParseNode(_pView->getPredicateTreeFromEntry(pEntryField,aTmp,aErrorMsg,xColumn));
+                                               if (pParseNode.get())
                                                {
                                                        ::rtl::OUString 
sGroupBy;
                                                        
pParseNode->parseNodeToStr(     sGroupBy,
@@ -1329,15 +1330,19 @@
                                                                                
                                &rController.getParser().getContext(),
                                                                                
                                sal_False,
                                                                                
                                !pEntryField->isOtherFunction());
-                                                       aGroupByStr += sGroupBy;
-                                                       delete pParseNode;
+                                                       sGroupByPart += 
sGroupBy;
                                                }
                                                else
-                                                       aGroupByStr += 
pEntryField->GetField();
+                                                       sGroupByPart += 
pEntryField->GetField();
                     }
+                    if ( aGroupByNames.find(sGroupByPart) == 
aGroupByNames.end() )
+                    {
+                        aGroupByNames.insert(::std::map< 
rtl::OUString,bool>::value_type(sGroupByPart,true));
+                        aGroupByStr += sGroupByPart;
                                        aGroupByStr += ::rtl::OUString(',');
                                }
                        }
+                       }
                        if ( aGroupByStr.getLength() )
                        {
                                aGroupByStr = 
aGroupByStr.replaceAt(aGroupByStr.getLength()-1,1, ::rtl::OUString(' ') );
@@ -1476,8 +1481,8 @@
                                                                        
sal_Bool bHaving,
                                     bool bAddOrOnOneLine)
        {
-               ::com::sun::star::lang::Locale  aLocale = _pView->getLocale();
-               ::rtl::OUString sDecimal = _pView->getDecimalSeparator();
+               const ::com::sun::star::lang::Locale    aLocale = 
_pView->getLocale();
+               const ::rtl::OUString sDecimal = _pView->getDecimalSeparator();
 
                // ich werde ein paar Mal einen gecasteten Pointer auf meinen 
::com::sun::star::sdbcx::Container brauchen
                OQueryController& rController = 
static_cast<OQueryController&>(_pView->getController());
@@ -3173,9 +3178,9 @@
                        sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" 
FROM x WHERE "));
                        sSql += pEntry->GetField();
                        sSql += _sCriteria;
-                       OSQLParseNode* pParseNode = rParser.parseTree( 
_rsErrorMessage, sSql, sal_True );
+            ::std::auto_ptr<OSQLParseNode> pParseNode( rParser.parseTree( 
_rsErrorMessage, sSql, sal_True ) );
                        nType = DataType::DOUBLE;
-                       if ( pParseNode )
+                       if ( pParseNode.get() )
                        {
                                OSQLParseNode* pColumnRef = 
pParseNode->getByRule(OSQLParseNode::column_ref);
                                if ( pColumnRef )
@@ -3186,7 +3191,6 @@
                                                nType = aField->GetDataType();
                                        }
                                }
-                               delete pParseNode;
                        }
                }
 

File [changed]: SelectionBrowseBox.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx?r1=1.81.30.2&r2=1.81.30.3
Delta lines:  +13 -10
---------------------
--- SelectionBrowseBox.cxx      2008-05-29 11:30:22+0000        1.81.30.2
+++ SelectionBrowseBox.cxx      2008-06-02 13:46:11+0000        1.81.30.3
@@ -7,7 +7,7 @@
  * OpenOffice.org - a multi-platform office productivity suite
  *
  * $RCSfile: SelectionBrowseBox.cxx,v $
- * $Revision: 1.81.30.2 $
+ * $Revision: 1.81.30.3 $
  *
  * This file is part of OpenOffice.org.
  *
@@ -1767,8 +1767,8 @@
        DBG_CHKTHIS(OSelectionBrowseBox,NULL);
        DBG_ASSERT(!rInfo->IsEmpty(),"AddGroupBy:: OTableFieldDescRef sollte 
nicht Empty sein!");
        OTableFieldDescRef pEntry;
-       Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
-       ::comphelper::UStringMixEqual bCase(xMeta.is() && 
xMeta->supportsMixedCaseQuotedIdentifiers());
+       const Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
+       const ::comphelper::UStringMixEqual bCase(xMeta.is() && 
xMeta->supportsMixedCaseQuotedIdentifiers());
     sal_Bool bAppend = sal_False;
     
     OTableFields& rFields = getFields();
@@ -1778,21 +1778,24 @@
                pEntry = *aIter;
                OSL_ENSURE(pEntry.isValid(),"OTableFieldDescRef was null!");
 
-               ::rtl::OUString aField = pEntry->GetField();
-               ::rtl::OUString aAlias = pEntry->GetAlias();
+               const ::rtl::OUString   aField = pEntry->GetField();
+               const ::rtl::OUString   aAlias = pEntry->GetAlias();
 
                if (bCase(aField,rInfo->GetField()) && 
                        bCase(aAlias,rInfo->GetAlias()) && 
                        pEntry->GetFunctionType() == rInfo->GetFunctionType())
                {
-            sal_uInt32 nPos = aIter - rFields.begin();
-            bAppend = _nCurrentPos > nPos;
+            /*sal_uInt32 nPos = aIter - rFields.begin();
+            bAppend = _nCurrentPos > nPos && (rInfo->IsGroupBy() != 
pEntry->IsGroupBy());
             if ( bAppend )
                 aIter = rFields.end();
-            else
+            else*/
             {
                            if ( pEntry->isNumericOrAggreateFunction() && 
rInfo->IsGroupBy() )
+                {
                                    pEntry->SetGroupBy(sal_False);
+                    aIter = rFields.end();
+                }
                            else
                            {
                                    pEntry->SetGroupBy(rInfo->IsGroupBy());
@@ -1828,8 +1831,8 @@
        for(;aIter != getFields().end();++aIter)
        {
                pEntry = *aIter;
-               ::rtl::OUString aField = pEntry->GetField();
-               ::rtl::OUString aAlias = pEntry->GetAlias();
+               const ::rtl::OUString   aField = pEntry->GetField();
+               const ::rtl::OUString   aAlias = pEntry->GetAlias();
 
                if (bCase(aField,rInfo->GetField()) && 
                        bCase(aAlias,rInfo->GetAlias()) && 




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to