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]
