1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*b3f79822SAndrew Rist * distributed with this work for additional information
6*b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10*b3f79822SAndrew Rist *
11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*b3f79822SAndrew Rist *
13*b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17*b3f79822SAndrew Rist * specific language governing permissions and limitations
18*b3f79822SAndrew Rist * under the License.
19*b3f79822SAndrew Rist *
20*b3f79822SAndrew Rist *************************************************************/
21*b3f79822SAndrew Rist
22*b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir
29cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
30cdf0e10cSrcweir
31cdf0e10cSrcweir #include <stdio.h>
32cdf0e10cSrcweir #include <rtl/math.hxx>
33cdf0e10cSrcweir #include <tools/debug.hxx>
34cdf0e10cSrcweir #include <tools/date.hxx>
35cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
36cdf0e10cSrcweir #include <unotools/collatorwrapper.hxx>
37cdf0e10cSrcweir
38cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
39cdf0e10cSrcweir
40cdf0e10cSrcweir #include "dptabdat.hxx"
41cdf0e10cSrcweir #include "global.hxx"
42cdf0e10cSrcweir #include "dpcachetable.hxx"
43cdf0e10cSrcweir #include "dptabres.hxx"
44cdf0e10cSrcweir #include "document.hxx"
45cdf0e10cSrcweir #include "dpobject.hxx"
46cdf0e10cSrcweir
47cdf0e10cSrcweir using namespace ::com::sun::star;
48cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
49cdf0e10cSrcweir using ::com::sun::star::uno::Any;
50cdf0e10cSrcweir using ::std::vector;
51cdf0e10cSrcweir // ---------------------------------------------------------------------------
52cdf0e10cSrcweir
CalcInfo()53cdf0e10cSrcweir ScDPTableData::CalcInfo::CalcInfo() :
54cdf0e10cSrcweir bRepeatIfEmpty(false)
55cdf0e10cSrcweir {
56cdf0e10cSrcweir }
57cdf0e10cSrcweir
58cdf0e10cSrcweir // ---------------------------------------------------------------------------
59cdf0e10cSrcweir
ScDPTableData(ScDocument * pDoc,long nCacheId)60cdf0e10cSrcweir ScDPTableData::ScDPTableData(ScDocument* pDoc, long nCacheId ) :
61cdf0e10cSrcweir mnCacheId( nCacheId ),
62cdf0e10cSrcweir mpDoc ( pDoc )
63cdf0e10cSrcweir {
64cdf0e10cSrcweir nLastDateVal = nLastHier = nLastLevel = nLastRet = -1; // invalid
65cdf0e10cSrcweir
66cdf0e10cSrcweir //! reset before new calculation (in case the base date is changed)
67cdf0e10cSrcweir }
68cdf0e10cSrcweir
~ScDPTableData()69cdf0e10cSrcweir ScDPTableData::~ScDPTableData()
70cdf0e10cSrcweir {
71cdf0e10cSrcweir }
72cdf0e10cSrcweir
GetDatePart(long nDateVal,long nHierarchy,long nLevel)73cdf0e10cSrcweir long ScDPTableData::GetDatePart( long nDateVal, long nHierarchy, long nLevel )
74cdf0e10cSrcweir {
75cdf0e10cSrcweir if ( nDateVal == nLastDateVal && nHierarchy == nLastHier && nLevel == nLastLevel )
76cdf0e10cSrcweir return nLastRet;
77cdf0e10cSrcweir
78cdf0e10cSrcweir Date aDate( 30,12,1899 ); //! get from source data (and cache here)
79cdf0e10cSrcweir aDate += nDateVal;
80cdf0e10cSrcweir
81cdf0e10cSrcweir long nRet = 0;
82cdf0e10cSrcweir switch (nHierarchy)
83cdf0e10cSrcweir {
84cdf0e10cSrcweir case SC_DAPI_HIERARCHY_QUARTER:
85cdf0e10cSrcweir switch (nLevel)
86cdf0e10cSrcweir {
87cdf0e10cSrcweir case 0: nRet = aDate.GetYear(); break;
88cdf0e10cSrcweir case 1: nRet = (aDate.GetMonth()-1) / 3 + 1; break;
89cdf0e10cSrcweir case 2: nRet = aDate.GetMonth(); break;
90cdf0e10cSrcweir case 3: nRet = aDate.GetDay(); break;
91cdf0e10cSrcweir default:
92cdf0e10cSrcweir DBG_ERROR("GetDatePart: wrong level");
93cdf0e10cSrcweir }
94cdf0e10cSrcweir break;
95cdf0e10cSrcweir case SC_DAPI_HIERARCHY_WEEK:
96cdf0e10cSrcweir switch (nLevel)
97cdf0e10cSrcweir {
98cdf0e10cSrcweir //! use settings for different definitions
99cdf0e10cSrcweir case 0: nRet = aDate.GetYear(); break; //!...
100cdf0e10cSrcweir case 1: nRet = aDate.GetWeekOfYear(); break;
101cdf0e10cSrcweir case 2: nRet = (long)aDate.GetDayOfWeek(); break;
102cdf0e10cSrcweir default:
103cdf0e10cSrcweir DBG_ERROR("GetDatePart: wrong level");
104cdf0e10cSrcweir }
105cdf0e10cSrcweir break;
106cdf0e10cSrcweir default:
107cdf0e10cSrcweir DBG_ERROR("GetDatePart: wrong hierarchy");
108cdf0e10cSrcweir }
109cdf0e10cSrcweir
110cdf0e10cSrcweir nLastDateVal = nDateVal;
111cdf0e10cSrcweir nLastHier = nHierarchy;
112cdf0e10cSrcweir nLastLevel = nLevel;
113cdf0e10cSrcweir nLastRet = nRet;
114cdf0e10cSrcweir
115cdf0e10cSrcweir return nRet;
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
IsRepeatIfEmpty()118cdf0e10cSrcweir bool ScDPTableData::IsRepeatIfEmpty()
119cdf0e10cSrcweir {
120cdf0e10cSrcweir return false;
121cdf0e10cSrcweir }
122cdf0e10cSrcweir
GetNumberFormat(long)123cdf0e10cSrcweir sal_uLong ScDPTableData::GetNumberFormat(long)
124cdf0e10cSrcweir {
125cdf0e10cSrcweir return 0; // default format
126cdf0e10cSrcweir }
127cdf0e10cSrcweir
IsBaseForGroup(long) const128cdf0e10cSrcweir sal_Bool ScDPTableData::IsBaseForGroup(long) const
129cdf0e10cSrcweir {
130cdf0e10cSrcweir return sal_False; // always false
131cdf0e10cSrcweir }
132cdf0e10cSrcweir
GetGroupBase(long) const133cdf0e10cSrcweir long ScDPTableData::GetGroupBase(long) const
134cdf0e10cSrcweir {
135cdf0e10cSrcweir return -1; // always none
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
IsNumOrDateGroup(long) const138cdf0e10cSrcweir sal_Bool ScDPTableData::IsNumOrDateGroup(long) const
139cdf0e10cSrcweir {
140cdf0e10cSrcweir return sal_False; // always false
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
IsInGroup(const ScDPItemData &,long,const ScDPItemData &,long) const143cdf0e10cSrcweir sal_Bool ScDPTableData::IsInGroup( const ScDPItemData&, long,
144cdf0e10cSrcweir const ScDPItemData&, long ) const
145cdf0e10cSrcweir {
146cdf0e10cSrcweir DBG_ERROR("IsInGroup shouldn't be called for non-group data");
147cdf0e10cSrcweir return sal_False;
148cdf0e10cSrcweir }
149cdf0e10cSrcweir
HasCommonElement(const ScDPItemData &,long,const ScDPItemData &,long) const150cdf0e10cSrcweir sal_Bool ScDPTableData::HasCommonElement( const ScDPItemData&, long,
151cdf0e10cSrcweir const ScDPItemData&, long ) const
152cdf0e10cSrcweir {
153cdf0e10cSrcweir DBG_ERROR("HasCommonElement shouldn't be called for non-group data");
154cdf0e10cSrcweir return sal_False;
155cdf0e10cSrcweir }
FillRowDataFromCacheTable(sal_Int32 nRow,const ScDPCacheTable & rCacheTable,const CalcInfo & rInfo,CalcRowData & rData)156cdf0e10cSrcweir void ScDPTableData::FillRowDataFromCacheTable(sal_Int32 nRow, const ScDPCacheTable& rCacheTable,
157cdf0e10cSrcweir const CalcInfo& rInfo, CalcRowData& rData)
158cdf0e10cSrcweir {
159cdf0e10cSrcweir // column dimensions
160cdf0e10cSrcweir GetItemData(rCacheTable, nRow, rInfo.aColLevelDims, rData.aColData);
161cdf0e10cSrcweir
162cdf0e10cSrcweir // row dimensions
163cdf0e10cSrcweir GetItemData(rCacheTable, nRow, rInfo.aRowLevelDims, rData.aRowData);
164cdf0e10cSrcweir
165cdf0e10cSrcweir // page dimensions
166cdf0e10cSrcweir GetItemData(rCacheTable, nRow, rInfo.aPageDims, rData.aPageData);
167cdf0e10cSrcweir
168cdf0e10cSrcweir long nCacheColumnCount = rCacheTable.GetCache()->GetColumnCount();
169cdf0e10cSrcweir sal_Int32 n = rInfo.aDataSrcCols.size();
170cdf0e10cSrcweir for (sal_Int32 i = 0; i < n; ++i)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir long nDim = rInfo.aDataSrcCols[i];
173cdf0e10cSrcweir rData.aValues.push_back( ScDPValueData() );
174cdf0e10cSrcweir // #i111435# GetItemData needs dimension indexes including groups,
175cdf0e10cSrcweir // so the index must be checked here (groups aren't useful as data fields).
176cdf0e10cSrcweir if ( nDim < nCacheColumnCount )
177cdf0e10cSrcweir {
178cdf0e10cSrcweir ScDPValueData& rVal = rData.aValues.back();
179cdf0e10cSrcweir rCacheTable.getValue( rVal, static_cast<SCCOL>(nDim), static_cast<SCROW>(nRow), false);
180cdf0e10cSrcweir }
181cdf0e10cSrcweir }
182cdf0e10cSrcweir }
183cdf0e10cSrcweir
ProcessRowData(CalcInfo & rInfo,CalcRowData & rData,bool bAutoShow)184cdf0e10cSrcweir void ScDPTableData::ProcessRowData(CalcInfo& rInfo, CalcRowData& rData, bool bAutoShow)
185cdf0e10cSrcweir {
186cdf0e10cSrcweir // Wang Xu Ming -- 2009-6-16
187cdf0e10cSrcweir // DataPilot Migration
188cdf0e10cSrcweir if (!bAutoShow)
189cdf0e10cSrcweir {
190cdf0e10cSrcweir LateInitParams aColParams( rInfo.aColDims, rInfo.aColLevels, sal_False );
191cdf0e10cSrcweir LateInitParams aRowParams ( rInfo.aRowDims, rInfo.aRowLevels, sal_True );
192cdf0e10cSrcweir // root always init child
193cdf0e10cSrcweir aColParams.SetInitChild( sal_True );
194cdf0e10cSrcweir aColParams.SetInitAllChildren( sal_False);
195cdf0e10cSrcweir aRowParams.SetInitChild( sal_True );
196cdf0e10cSrcweir aRowParams.SetInitAllChildren( sal_False);
197cdf0e10cSrcweir
198cdf0e10cSrcweir rInfo.pColRoot->LateInitFrom( aColParams, rData.aColData,0, *rInfo.pInitState);
199cdf0e10cSrcweir rInfo.pRowRoot->LateInitFrom( aRowParams, rData.aRowData, 0, *rInfo.pInitState);
200cdf0e10cSrcweir }
201cdf0e10cSrcweir // End Comments
202cdf0e10cSrcweir
203cdf0e10cSrcweir if ( ( !rInfo.pColRoot->GetChildDimension() || rInfo.pColRoot->GetChildDimension()->IsValidEntry(rData.aColData) ) &&
204cdf0e10cSrcweir ( !rInfo.pRowRoot->GetChildDimension() || rInfo.pRowRoot->GetChildDimension()->IsValidEntry(rData.aRowData) ) )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir //! single process method with ColMembers, RowMembers and data !!!
207cdf0e10cSrcweir if (rInfo.pColRoot->GetChildDimension())
208cdf0e10cSrcweir {
209cdf0e10cSrcweir // Wang Xu Ming -- 2009-6-10
210cdf0e10cSrcweir // DataPilot Migration
211cdf0e10cSrcweir vector</*ScDPItemData*/ SCROW > aEmptyData;
212cdf0e10cSrcweir rInfo.pColRoot->GetChildDimension()->ProcessData(rData.aColData, NULL, aEmptyData, rData.aValues);
213cdf0e10cSrcweir // End Comments
214cdf0e10cSrcweir }
215cdf0e10cSrcweir
216cdf0e10cSrcweir rInfo.pRowRoot->ProcessData(rData.aRowData, rInfo.pColRoot->GetChildDimension(),
217cdf0e10cSrcweir rData.aColData, rData.aValues);
218cdf0e10cSrcweir }
219cdf0e10cSrcweir }
220cdf0e10cSrcweir
CalcResultsFromCacheTable(const ScDPCacheTable & rCacheTable,CalcInfo & rInfo,bool bAutoShow)221cdf0e10cSrcweir void ScDPTableData::CalcResultsFromCacheTable(const ScDPCacheTable& rCacheTable, CalcInfo& rInfo, bool bAutoShow)
222cdf0e10cSrcweir {
223cdf0e10cSrcweir sal_Int32 nRowSize = rCacheTable.getRowSize();
224cdf0e10cSrcweir for (sal_Int32 nRow = 0; nRow < nRowSize; ++nRow)
225cdf0e10cSrcweir {
226cdf0e10cSrcweir if (!rCacheTable.isRowActive(nRow))
227cdf0e10cSrcweir continue;
228cdf0e10cSrcweir
229cdf0e10cSrcweir CalcRowData aData;
230cdf0e10cSrcweir FillRowDataFromCacheTable(nRow, rCacheTable, rInfo, aData);
231cdf0e10cSrcweir ProcessRowData(rInfo, aData, bAutoShow);
232cdf0e10cSrcweir }
233cdf0e10cSrcweir }
234cdf0e10cSrcweir
235cdf0e10cSrcweir // Wang Xu Ming -- 2009-6-10
236cdf0e10cSrcweir // DataPilot Migration
GetItemData(const ScDPCacheTable & rCacheTable,sal_Int32 nRow,const vector<long> & rDims,vector<SCROW> & rItemData)237cdf0e10cSrcweir void ScDPTableData::GetItemData(const ScDPCacheTable& rCacheTable, sal_Int32 nRow,
238cdf0e10cSrcweir const vector<long>& rDims, vector< SCROW/*ScDPItemData*/>& rItemData)
239cdf0e10cSrcweir // End Comments
240cdf0e10cSrcweir {
241cdf0e10cSrcweir sal_Int32 nDimSize = rDims.size();
242cdf0e10cSrcweir for (sal_Int32 i = 0; i < nDimSize; ++i)
243cdf0e10cSrcweir {
244cdf0e10cSrcweir long nDim = rDims[i];
245cdf0e10cSrcweir
246cdf0e10cSrcweir if (getIsDataLayoutDimension(nDim))
247cdf0e10cSrcweir {
248cdf0e10cSrcweir rItemData.push_back( -1 );
249cdf0e10cSrcweir continue;
250cdf0e10cSrcweir }
251cdf0e10cSrcweir
252cdf0e10cSrcweir nDim = GetSourceDim( nDim );
253cdf0e10cSrcweir if ( nDim >= rCacheTable.GetCache()->GetColumnCount() )
254cdf0e10cSrcweir continue;
255cdf0e10cSrcweir
256cdf0e10cSrcweir SCROW nId= rCacheTable.GetCache()->GetItemDataId( static_cast<SCCOL>(nDim), static_cast<SCROW>(nRow), IsRepeatIfEmpty());
257cdf0e10cSrcweir rItemData.push_back( nId );
258cdf0e10cSrcweir
259cdf0e10cSrcweir }
260cdf0e10cSrcweir }
261cdf0e10cSrcweir
262cdf0e10cSrcweir // -----------------------------------------------------------------------
263cdf0e10cSrcweir
264cdf0e10cSrcweir // Wang Xu Ming -- 2009-6-8
265cdf0e10cSrcweir // DataPilot Migration
GetMembersCount(long nDim)266cdf0e10cSrcweir long ScDPTableData::GetMembersCount( long nDim )
267cdf0e10cSrcweir {
268cdf0e10cSrcweir if ( nDim > MAXCOL )
269cdf0e10cSrcweir return 0;
270cdf0e10cSrcweir return GetCacheTable().getFieldEntries( nDim ).size();
271cdf0e10cSrcweir }
272cdf0e10cSrcweir
GetCacheId() const273cdf0e10cSrcweir long ScDPTableData::GetCacheId() const
274cdf0e10cSrcweir {
275cdf0e10cSrcweir return mnCacheId;
276cdf0e10cSrcweir }
277cdf0e10cSrcweir
GetMemberByIndex(long nDim,long nIndex)278cdf0e10cSrcweir const ScDPItemData* ScDPTableData::GetMemberByIndex( long nDim, long nIndex )
279cdf0e10cSrcweir {
280cdf0e10cSrcweir if ( nIndex >= GetMembersCount( nDim ) )
281cdf0e10cSrcweir return NULL;
282cdf0e10cSrcweir
283cdf0e10cSrcweir const ::std::vector<SCROW>& nMembers = GetCacheTable().getFieldEntries( nDim );
284cdf0e10cSrcweir
285cdf0e10cSrcweir return GetCacheTable().GetCache()->GetItemDataById( (SCCOL) nDim, (SCROW)nMembers[nIndex] );
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
GetMemberById(long nDim,long nId)288cdf0e10cSrcweir const ScDPItemData* ScDPTableData::GetMemberById( long nDim, long nId)
289cdf0e10cSrcweir {
290cdf0e10cSrcweir
291cdf0e10cSrcweir return GetCacheTable().GetCache()->GetItemDataById( (SCCOL) nDim, (SCROW)nId);
292cdf0e10cSrcweir }
293cdf0e10cSrcweir
GetIdOfItemData(long nDim,const ScDPItemData & rData)294cdf0e10cSrcweir SCROW ScDPTableData::GetIdOfItemData( long nDim, const ScDPItemData& rData )
295cdf0e10cSrcweir {
296cdf0e10cSrcweir return GetCacheTable().GetCache()->GetIdByItemData((SCCOL) nDim, rData );
297cdf0e10cSrcweir }
298cdf0e10cSrcweir
GetColumnEntries(long nColumn)299cdf0e10cSrcweir const std::vector< SCROW >& ScDPTableData::GetColumnEntries( long nColumn )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir return GetCacheTable().getFieldEntries( nColumn );
302cdf0e10cSrcweir }
303cdf0e10cSrcweir
GetSourceDim(long nDim)304cdf0e10cSrcweir long ScDPTableData::GetSourceDim( long nDim )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir return nDim;
307cdf0e10cSrcweir
308cdf0e10cSrcweir }
309cdf0e10cSrcweir
Compare(long nDim,long nDataId1,long nDataId2)310cdf0e10cSrcweir long ScDPTableData::Compare( long nDim, long nDataId1, long nDataId2)
311cdf0e10cSrcweir {
312cdf0e10cSrcweir if ( getIsDataLayoutDimension(nDim) )
313cdf0e10cSrcweir return 0;
314cdf0e10cSrcweir
315cdf0e10cSrcweir long n1 = GetCacheTable().GetCache()->GetOrder( nDim, nDataId1);
316cdf0e10cSrcweir long n2 = GetCacheTable().GetCache()->GetOrder( nDim, nDataId2);
317cdf0e10cSrcweir if ( n1 > n2 )
318cdf0e10cSrcweir return 1;
319cdf0e10cSrcweir else if ( n1 == n2 )
320cdf0e10cSrcweir return 0;
321cdf0e10cSrcweir else
322cdf0e10cSrcweir return -1;
323cdf0e10cSrcweir }
324cdf0e10cSrcweir // End Comments
325cdf0e10cSrcweir // -----------------------------------------------------------------------
326