xref: /trunk/main/sc/source/core/data/dptabdat.cxx (revision b3f79822)
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