25 #include <document.hxx>
27 #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
30 #include <osl/diagnose.h>
31 #include <rtl/math.hxx>
34 #include <globstr.hrc>
100 sal_uInt32 nFormat = 0;
120 for (
const auto& rItem :
maItems)
127 aSourceDim( rSource ),
128 aGroupDimName( rName ),
134 aSourceDim( rSource ),
135 aGroupDimName( rName ),
136 aDateInfo( rDateInfo ),
160 const sal_Int32 nMaxAdd = nAdd +
aGroups.size();
161 while ( nAdd <= nMaxAdd )
163 OUString aGroupName = rPrefix + OUString::number( nAdd );
168 return rGroup.GetGroupName() == aGroupName;
177 OSL_FAIL(
"CreateGroupName: no valid name found");
190 return rGroup.GetGroupName() == rGroupName;
214 for ( ScDPSaveGroupItemVec::iterator aIter(
aGroups.begin()); aIter !=
aGroups.end(); ++aIter )
215 if ( aIter->RemoveElement( rItemName ) )
217 if ( aIter->IsEmpty() )
228 return rGroup.GetGroupName() == rGroupName;
244 [&rVisible](
const ScDPSaveGroupItem& rGroup) {
return rVisible.count(rGroup.GetGroupName()) > 0; });
260 bool isInteger(
double fValue)
262 return rtl::math::approxEqual(fValue, rtl::math::approxFloor(fValue));
265 void fillDateGroupDimension(
271 double fSourceMin = 0.0;
272 double fSourceMax = 0.0;
281 double fVal = rItem.GetValue();
284 fSourceMin = fSourceMax = fVal;
289 if (fVal < fSourceMin)
291 if ( fVal > fSourceMax )
300 rDateInfo.
mfStart = rtl::math::approxFloor(fSourceMin);
302 rDateInfo.
mfEnd = rtl::math::approxFloor(fSourceMax) + 1;
310 case sheet::DataPilotFieldGroupBy::YEARS:
312 fSourceMin,
nullptr, sheet::DataPilotFieldGroupBy::YEARS, pFormatter);
315 case sheet::DataPilotFieldGroupBy::QUARTERS: nStart = 1; nEnd = 4;
break;
316 case sheet::DataPilotFieldGroupBy::MONTHS: nStart = 1; nEnd = 12;
break;
317 case sheet::DataPilotFieldGroupBy::DAYS: nStart = 1; nEnd = 366;
break;
318 case sheet::DataPilotFieldGroupBy::HOURS: nStart = 0; nEnd = 23;
break;
319 case sheet::DataPilotFieldGroupBy::MINUTES: nStart = 0; nEnd = 59;
break;
320 case sheet::DataPilotFieldGroupBy::SECONDS: nStart = 0; nEnd = 59;
break;
322 OSL_FAIL(
"invalid date part");
341 if ( nSourceIndex < 0 )
355 for (
const auto& rGroup :
aGroups)
356 rGroup.AddToData(aDim);
373 fillDateGroupDimension(rCache,
aDateInfo, nSourceDim, nDim, nDatePart, pFormatter);
380 rGI.ConvertElementsToItems(pFormatter);
394 aDimensionName( rName ),
401 aDimensionName( rName ),
402 aDateInfo( rDateInfo ),
430 fillDateGroupDimension(rCache,
aDateInfo, nDim, nDim, nDatePart, pFormatter);
445 double fSourceMin = 0.0;
446 double fSourceMax = 0.0;
455 double fValue = rItem.GetValue();
458 fSourceMin = fSourceMax = fValue;
463 if (fValue < fSourceMin)
465 if (fValue > fSourceMax)
480 fSourceMin = rtl::math::approxFloor(fSourceMin);
481 fSourceMax = rtl::math::approxFloor(fSourceMax) + 1;
502 bool bFirstGroup =
true;
537 struct ScDPSaveGroupDimNameFunc
540 explicit ScDPSaveGroupDimNameFunc(
const OUString& rDimName ) : maDimName( rDimName ) {}
544 struct ScDPSaveGroupSourceNameFunc
546 OUString maSrcDimName;
547 explicit ScDPSaveGroupSourceNameFunc(
const OUString& rSrcDimName ) : maSrcDimName( rSrcDimName ) {}
565 "ScDPDimensionSaveData::AddGroupDimension - group dimension exists already" );
572 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
582 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
591 "ScDPDimensionSaveData::AddNumGroupDimension - numeric group dimension exists already" );
602 aIt->second = rGroupDim;
616 rGroupDim.AddToData( rData );
619 rEntry.second.AddToData( rData );
625 rEntry.AddToCache(rCache);
627 rEntry.second.AddToCache(rCache);
663 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
665 return (aIt ==
maGroupDims.end()) ?
nullptr : &*aIt;
670 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
672 return (aIt ==
maGroupDims.end()) ?
nullptr : &*aIt;
678 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
682 aIt = ::std::find_if( aIt + 1,
maGroupDims.end(), ScDPSaveGroupSourceNameFunc( aIt->GetSourceDimName() ) );
683 return (aIt ==
maGroupDims.end()) ?
nullptr : &*aIt;
688 ScDPSaveNumGroupDimMap::iterator aIt =
maNumGroupDims.find( rGroupDimName );
699 sal_Int32 nParts = 0;
702 nParts |= pNumDim->GetDatePart();
705 nParts |= pGroupDim->GetDatePart();
711 const OUString& rSourceName,
const ScDPObject& rObject,
bool bAllowSource,
712 const std::vector<OUString>* pDeletedNames )
717 bool bUseSource = bAllowSource;
720 const sal_Int32 nMaxAdd = 1000;
721 while ( nAdd <= nMaxAdd )
723 OUString aDimName( rSourceName );
725 aDimName += OUString::number(nAdd);
730 return rDim.GetGroupDimName() == aDimName;
736 if ( pDeletedNames &&
737 std::find( pDeletedNames->begin(), pDeletedNames->end(), aDimName ) != pDeletedNames->end() )
753 OSL_FAIL(
"CreateGroupDimName: no valid name found");
761 STR_DPFIELD_GROUP_BY_SECONDS,
762 STR_DPFIELD_GROUP_BY_MINUTES,
763 STR_DPFIELD_GROUP_BY_HOURS,
764 STR_DPFIELD_GROUP_BY_DAYS,
765 STR_DPFIELD_GROUP_BY_MONTHS,
766 STR_DPFIELD_GROUP_BY_QUARTERS,
767 STR_DPFIELD_GROUP_BY_YEARS
772 sal_Int32 nDatePart,
const ScDPObject& rObject,
bool bAllowSource,
773 const std::vector<OUString>* pDeletedNames )
775 using namespace css::sheet::DataPilotFieldGroupBy;
779 case SECONDS: aPartName =
ScResId(aDatePartIds[0]);
break;
780 case MINUTES: aPartName =
ScResId(aDatePartIds[1]);
break;
781 case HOURS: aPartName =
ScResId(aDatePartIds[2]);
break;
782 case DAYS: aPartName =
ScResId(aDatePartIds[3]);
break;
783 case MONTHS: aPartName =
ScResId(aDatePartIds[4]);
break;
784 case QUARTERS: aPartName =
ScResId(aDatePartIds[5]);
break;
785 case YEARS: aPartName =
ScResId(aDatePartIds[6]);
break;
787 OSL_ENSURE(!aPartName.isEmpty(),
"ScDPDimensionSaveData::CreateDateGroupDimName - invalid date part");
void SetValue(double fVal)
const OUString & GetGroupDimName() const
bool IsInGroup(const ScDPItemData &rItem) const
bool IsDimNameInUse(std::u16string_view rName) const
void AddToData(ScDPGroupTableData &rData) const
void ReplaceNumGroupDimension(const ScDPSaveNumGroupDimension &rGroupDim)
This class has to do with handling exclusively grouped dimensions? TODO: Find out what this class doe...
OUString ScResId(TranslateId aId)
void Rename(const OUString &rNewName)
void AddGroupDimension(const ScDPGroupDimension &rGroup)
bool HasGroupDimensions() const
ScDPSaveGroupItemVec aGroups
void AddNumGroupDimension(const ScDPSaveNumGroupDimension &rGroupDim)
bool RemoveElement(const OUString &rName)
const ScDPSaveGroupDimension * GetGroupDimForBase(const OUString &rBaseDimName) const
SCROW SetGroupItem(tools::Long nDim, const ScDPItemData &rData)
ScDocument & GetDoc() const
ScDPSaveGroupItem(const OUString &rName)
void AddGroupDimension(const ScDPSaveGroupDimension &rGroupDim)
Classes to save Data Pilot settings that create new dimensions (fields).
void SetString(const OUString &rS)
const OUString & GetSourceDimName() const
void RemoveGroupDimension(const OUString &rGroupDimName)
void AddToData(ScDPGroupTableData &rData) const
ScDPNumGroupInfo aDateInfo
const ScDPItemDataVec & GetDimMemberValues(SCCOL nDim) const
void RemoveNumGroupDimension(const OUString &rGroupDimName)
This class represents the cached data part of the datapilot cache table implementation.
std::vector< ScDPItemData > maItems
items converted from the strings.
SCCOL GetDimensionIndex(std::u16string_view sName) const
OUString CreateGroupDimName(const OUString &rSourceName, const ScDPObject &rObject, bool bAllowSource, const ::std::vector< OUString > *pDeletedNames)
void SetNumGroupDimension(sal_Int32 nIndex, const ScDPNumGroupDimension &rGroup)
const ScDPSaveGroupDimension * GetNamedGroupDim(const OUString &rGroupDimName) const
ScDPSaveGroupDimension * GetGroupDimAccForBase(const OUString &rBaseDimName)
tools::Long AppendGroupField()
ScDPSaveGroupDimension * GetNextNamedGroupDimAcc(const OUString &rGroupDimName)
ScDPNumGroupInfo aDateInfo
ScDPSaveGroupDimVec maGroupDims
void AddElementsFromGroup(const ScDPSaveGroupItem &rGroup)
void ReplaceGroupDimension(const ScDPSaveGroupDimension &rGroupDim)
void SetGroupInfo(const ScDPNumGroupInfo &rNew)
size_t GetElementCount() const
constexpr OUStringLiteral aData
ScDPSaveGroupDimension * GetNamedGroupDimAcc(const OUString &rGroupDimName)
tools::Long GetGroupCount() const
OUString aSourceDim
always the real source from the original data
SC_DLLPUBLIC SvNumberFormatter * GetFormatTable() const
const ScDPSaveGroupItem & GetGroupByIndex(tools::Long nIndex) const
When assigning a string value, you can also assign an interned string whose life-cycle is managed by ...
void AddElement(const ScDPItemData &rName)
const OUString * GetElementByIndex(size_t nIndex) const
Represents a group dimension that introduces a new hierarchy for an existing dimension.
void RemoveGroup(const OUString &rGroupName)
const OUString & GetDimensionName() const
const ScDPSaveGroupDimension * GetNextNamedGroupDim(const OUString &rGroupDimName) const
void ResetGroupItems(tools::Long nDim, const ScDPNumGroupInfo &rNumInfo, sal_Int32 nGroupType)
ScDPSaveNumGroupDimension * GetNumGroupDimAcc(const OUString &rGroupDimName)
ScDPNumGroupInfo aGroupInfo
std::vector< ScDPItemData > ScDPItemDataVec
OUString aGroupName
name of group
ScDPSaveGroupDimension * GetFirstNamedGroupDimAcc(const OUString &rBaseDimName)
sal_Int32 GetDimensionIndex(std::u16string_view rName)
const ScDPSaveGroupDimension * GetFirstNamedGroupDim(const OUString &rBaseDimName) const
ScDPSaveNumGroupDimMap maNumGroupDims
ScDPSaveNumGroupDimension(const OUString &rName, const ScDPNumGroupInfo &rInfo)
void AddItem(const ScDPGroupItem &rItem)
bool HasOnlyHidden(const ScDPUniqueStringSet &rVisible)
void RemoveElementsFromGroups(ScDPSaveGroupDimension &rDimension) const
remove this group's elements from their groups in rDimension (rDimension must be a different dimensio...
static const sal_Int32 DateLast
void AddToCache(ScDPCache &rCache) const
void AddToData(ScDPGroupDimension &rDataDim) const
ScDPSaveGroupItem * GetNamedGroupAcc(const OUString &rGroupName)
std::unordered_set< OUString > ScDPUniqueStringSet
void RemoveFromGroups(const OUString &rItemName)
static const sal_Int32 DateFirst
std::vector< OUString > aElements
names of items in original dimension
Represents a new group dimension whose dimension ID is higher than the highest source dimension ID...
static sal_Int32 getDatePartValue(double fValue, const ScDPNumGroupInfo *pInfo, sal_Int32 nDatePart, const SvNumberFormatter *pFormatter)
void Rename(const OUString &rNewName)
void AddElement(const OUString &rName)
const ScDPSaveGroupItem * GetNamedGroup(const OUString &rGroupName) const
void SetDateInfo(const ScDPNumGroupInfo &rInfo, sal_Int32 nPart)
sal_Int32 CollectDateParts(const OUString &rBaseDimName) const
bool operator==(const ScDPDimensionSaveData &r) const
void WriteToData(ScDPGroupTableData &rData) const
void AddToCache(ScDPCache &rCache) const
OUString CreateDateGroupDimName(sal_Int32 nDatePart, const ScDPObject &rObject, bool bAllowSource, const ::std::vector< OUString > *pDeletedNames)
void ConvertElementsToItems(SvNumberFormatter *pFormatter) const
void WriteToCache(ScDPCache &rCache) const
const ScDPSaveNumGroupDimension * GetNumGroupDim(const OUString &rGroupDimName) const
bool HasInGroup(const ScDPItemData &rItem) const
ScDPSaveGroupDimension(const OUString &rSource, const OUString &rName)
void AddGroupItem(const ScDPSaveGroupItem &rItem)
void SetDateInfo(const ScDPNumGroupInfo &rInfo, sal_Int32 nPart)
OUString CreateGroupName(std::u16string_view rPrefix)
void SetRangeStart(double fVal)