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>
53 for (
const auto& rElement : rGroup.
aElements )
102 sal_uInt32 nFormat = 0;
122 for (
const auto& rItem :
maItems)
129 aSourceDim( rSource ),
130 aGroupDimName( rName ),
136 aSourceDim( rSource ),
137 aGroupDimName( rName ),
138 aDateInfo( rDateInfo ),
162 const sal_Int32 nMaxAdd = nAdd +
aGroups.size();
163 while ( nAdd <= nMaxAdd )
165 OUString aGroupName = rPrefix + OUString::number( nAdd );
170 return rGroup.GetGroupName() == aGroupName;
179 OSL_FAIL(
"CreateGroupName: no valid name found");
192 return rGroup.GetGroupName() == rGroupName;
216 for ( ScDPSaveGroupItemVec::iterator aIter(
aGroups.begin()); aIter !=
aGroups.end(); ++aIter )
217 if ( aIter->RemoveElement( rItemName ) )
219 if ( aIter->IsEmpty() )
230 return rGroup.GetGroupName() == rGroupName;
246 [&rVisible](
const ScDPSaveGroupItem& rGroup) {
return rVisible.count(rGroup.GetGroupName()) > 0; });
262 bool isInteger(
double fValue)
264 return rtl::math::approxEqual(fValue, rtl::math::approxFloor(fValue));
267 void fillDateGroupDimension(
273 double fSourceMin = 0.0;
274 double fSourceMax = 0.0;
283 double fVal = rItem.GetValue();
286 fSourceMin = fSourceMax = fVal;
291 if (fVal < fSourceMin)
293 if ( fVal > fSourceMax )
302 rDateInfo.
mfStart = rtl::math::approxFloor(fSourceMin);
304 rDateInfo.
mfEnd = rtl::math::approxFloor(fSourceMax) + 1;
312 case sheet::DataPilotFieldGroupBy::YEARS:
314 fSourceMin,
nullptr, sheet::DataPilotFieldGroupBy::YEARS, pFormatter);
317 case sheet::DataPilotFieldGroupBy::QUARTERS: nStart = 1; nEnd = 4;
break;
318 case sheet::DataPilotFieldGroupBy::MONTHS: nStart = 1; nEnd = 12;
break;
319 case sheet::DataPilotFieldGroupBy::DAYS: nStart = 1; nEnd = 366;
break;
320 case sheet::DataPilotFieldGroupBy::HOURS: nStart = 0; nEnd = 23;
break;
321 case sheet::DataPilotFieldGroupBy::MINUTES: nStart = 0; nEnd = 59;
break;
322 case sheet::DataPilotFieldGroupBy::SECONDS: nStart = 0; nEnd = 59;
break;
324 OSL_FAIL(
"invalid date part");
343 if ( nSourceIndex < 0 )
357 for (
const auto& rGroup :
aGroups)
358 rGroup.AddToData(aDim);
375 fillDateGroupDimension(rCache,
aDateInfo, nSourceDim, nDim, nDatePart, pFormatter);
382 rGI.ConvertElementsToItems(pFormatter);
396 aDimensionName( rName ),
403 aDimensionName( rName ),
404 aDateInfo( rDateInfo ),
432 fillDateGroupDimension(rCache,
aDateInfo, nDim, nDim, nDatePart, pFormatter);
447 double fSourceMin = 0.0;
448 double fSourceMax = 0.0;
457 double fValue = rItem.GetValue();
460 fSourceMin = fSourceMax = fValue;
465 if (fValue < fSourceMin)
467 if (fValue > fSourceMax)
482 fSourceMin = rtl::math::approxFloor(fSourceMin);
483 fSourceMax = rtl::math::approxFloor(fSourceMax) + 1;
504 bool bFirstGroup =
true;
539 struct ScDPSaveGroupDimNameFunc
542 explicit ScDPSaveGroupDimNameFunc(
const OUString& rDimName ) : maDimName( rDimName ) {}
546 struct ScDPSaveGroupSourceNameFunc
548 OUString maSrcDimName;
549 explicit ScDPSaveGroupSourceNameFunc(
const OUString& rSrcDimName ) : maSrcDimName( rSrcDimName ) {}
567 "ScDPDimensionSaveData::AddGroupDimension - group dimension exists already" );
574 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
584 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
593 "ScDPDimensionSaveData::AddNumGroupDimension - numeric group dimension exists already" );
604 aIt->second = rGroupDim;
618 rGroupDim.AddToData( rData );
621 rEntry.second.AddToData( rData );
627 rEntry.AddToCache(rCache);
629 rEntry.second.AddToCache(rCache);
665 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
667 return (aIt ==
maGroupDims.end()) ?
nullptr : &*aIt;
672 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
674 return (aIt ==
maGroupDims.end()) ?
nullptr : &*aIt;
680 ScDPSaveGroupDimVec::iterator aIt = ::std::find_if(
684 aIt = ::std::find_if( aIt + 1,
maGroupDims.end(), ScDPSaveGroupSourceNameFunc( aIt->GetSourceDimName() ) );
685 return (aIt ==
maGroupDims.end()) ?
nullptr : &*aIt;
690 ScDPSaveNumGroupDimMap::iterator aIt =
maNumGroupDims.find( rGroupDimName );
701 sal_Int32 nParts = 0;
704 nParts |= pNumDim->GetDatePart();
707 nParts |= pGroupDim->GetDatePart();
713 const OUString& rSourceName,
const ScDPObject& rObject,
bool bAllowSource,
714 const std::vector<OUString>* pDeletedNames )
719 bool bUseSource = bAllowSource;
722 const sal_Int32 nMaxAdd = 1000;
723 while ( nAdd <= nMaxAdd )
725 OUString aDimName( rSourceName );
727 aDimName += OUString::number(nAdd);
732 return rDim.GetGroupDimName() == aDimName;
738 if ( pDeletedNames &&
739 std::find( pDeletedNames->begin(), pDeletedNames->end(), aDimName ) != pDeletedNames->end() )
755 OSL_FAIL(
"CreateGroupDimName: no valid name found");
761 const char* aDatePartIds[] =
763 STR_DPFIELD_GROUP_BY_SECONDS,
764 STR_DPFIELD_GROUP_BY_MINUTES,
765 STR_DPFIELD_GROUP_BY_HOURS,
766 STR_DPFIELD_GROUP_BY_DAYS,
767 STR_DPFIELD_GROUP_BY_MONTHS,
768 STR_DPFIELD_GROUP_BY_QUARTERS,
769 STR_DPFIELD_GROUP_BY_YEARS
774 sal_Int32 nDatePart,
const ScDPObject& rObject,
bool bAllowSource,
775 const std::vector<OUString>* pDeletedNames )
777 using namespace css::sheet::DataPilotFieldGroupBy;
781 case SECONDS: aPartName =
ScResId(aDatePartIds[0]);
break;
782 case MINUTES: aPartName =
ScResId(aDatePartIds[1]);
break;
783 case HOURS: aPartName =
ScResId(aDatePartIds[2]);
break;
784 case DAYS: aPartName =
ScResId(aDatePartIds[3]);
break;
785 case MONTHS: aPartName =
ScResId(aDatePartIds[4]);
break;
786 case QUARTERS: aPartName =
ScResId(aDatePartIds[5]);
break;
787 case YEARS: aPartName =
ScResId(aDatePartIds[6]);
break;
789 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...
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 ScResId(const char *pId)
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)