1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "xmlfilti.hxx"
21 #include "xmlimprt.hxx"
22 #include "xmldrani.hxx"
23 #include "xmldpimp.hxx"
24 #include <rangeutl.hxx>
25 #include <queryentry.hxx>
26 #include <document.hxx>
28 #include <o3tl/safeint.hxx>
29 #include <svl/sharedstringpool.hxx>
30 #include <xmloff/xmltoken.hxx>
31 #include <xmloff/xmlnamespace.hxx>
33 using namespace com::sun::star
;
34 using namespace xmloff::token
;
36 using ::com::sun::star::uno::Reference
;
38 ScXMLFilterContext::ConnStackItem::ConnStackItem(bool bOr
) : mbOr(bOr
), mnCondCount(0) {}
40 ScXMLFilterContext::ScXMLFilterContext( ScXMLImport
& rImport
,
41 const rtl::Reference
<sax_fastparser::FastAttributeList
>& rAttrList
,
43 ScXMLDatabaseRangeContext
* pTempDatabaseRangeContext
) :
44 ScXMLImportContext( rImport
),
46 pDatabaseRangeContext(pTempDatabaseRangeContext
),
47 bSkipDuplicates(false),
48 bCopyOutputData(false),
49 bConditionSourceRange(false)
51 ScDocument
* pDoc(GetScImport().GetDocument());
54 if ( !rAttrList
.is() )
57 for (auto &aIter
: *rAttrList
)
59 switch (aIter
.getToken())
61 case XML_ELEMENT( TABLE
, XML_TARGET_RANGE_ADDRESS
):
65 if (ScRangeStringConverter::GetRangeFromString( aScRange
, aIter
.toString(), *pDoc
, ::formula::FormulaGrammar::CONV_OOO
, nOffset
))
67 aOutputPosition
= aScRange
.aStart
;
68 bCopyOutputData
= true;
72 case XML_ELEMENT( TABLE
, XML_CONDITION_SOURCE_RANGE_ADDRESS
):
75 if (ScRangeStringConverter::GetRangeFromString( aConditionSourceRangeAddress
, aIter
.toString(), *pDoc
, ::formula::FormulaGrammar::CONV_OOO
, nOffset
) )
76 bConditionSourceRange
= true;
79 case XML_ELEMENT( TABLE
, XML_CONDITION_SOURCE
):
81 // not supported by StarOffice
84 case XML_ELEMENT( TABLE
, XML_DISPLAY_DUPLICATES
):
86 bSkipDuplicates
= !IsXMLToken(aIter
, XML_TRUE
);
93 ScXMLFilterContext::~ScXMLFilterContext()
97 uno::Reference
< xml::sax::XFastContextHandler
> SAL_CALL
ScXMLFilterContext::createFastChildContext(
98 sal_Int32 nElement
, const uno::Reference
< xml::sax::XFastAttributeList
>& xAttrList
)
100 SvXMLImportContext
*pContext(nullptr);
101 sax_fastparser::FastAttributeList
*pAttribList
=
102 &sax_fastparser::castToFastAttributeList( xAttrList
);
106 case XML_ELEMENT( TABLE
, XML_FILTER_AND
):
108 pContext
= new ScXMLAndContext(
109 GetScImport(), mrQueryParam
, this);
112 case XML_ELEMENT( TABLE
, XML_FILTER_OR
):
114 pContext
= new ScXMLOrContext(
115 GetScImport(), mrQueryParam
, this);
118 case XML_ELEMENT( TABLE
, XML_FILTER_CONDITION
):
120 pContext
= new ScXMLConditionContext(
121 GetScImport(), nElement
, pAttribList
, mrQueryParam
, this);
129 void SAL_CALL
ScXMLFilterContext::endFastElement( sal_Int32
/*nElement*/ )
131 mrQueryParam
.bInplace
= !bCopyOutputData
;
132 mrQueryParam
.bDuplicate
= !bSkipDuplicates
;
136 mrQueryParam
.nDestCol
= aOutputPosition
.Col();
137 mrQueryParam
.nDestRow
= aOutputPosition
.Row();
138 mrQueryParam
.nDestTab
= aOutputPosition
.Tab();
141 if (bConditionSourceRange
)
142 pDatabaseRangeContext
->SetFilterConditionSourceRangeAddress(aConditionSourceRangeAddress
);
145 void ScXMLFilterContext::OpenConnection(bool b
)
147 maConnStack
.emplace_back(b
);
150 void ScXMLFilterContext::CloseConnection()
152 maConnStack
.pop_back();
155 bool ScXMLFilterContext::GetConnection()
157 // For condition items in each stack, the first one gets the connection of
158 // the last stack, while the rest of them get that of the current stack.
160 if (maConnStack
.empty())
161 // This should never happen.
164 ConnStackItem
& rItem
= maConnStack
.back();
165 if (rItem
.mnCondCount
)
166 // secondary item gets the current connection.
169 // The next condition of this stack will get the current connection.
172 if (maConnStack
.size() < 2)
173 // There is no last stack. Likely the first condition in the first
174 // stack whose connection is not used. Default in
175 // ScQueryEntry::eConnect is SC_AND, so return false (AND instead of
176 // OR) here. Otherwise, when saving the document again, we'd write a
178 // <table:filter-or><table:filter-and>...</table:filter-and></table:filter-or>
179 // for two conditions connected with AND.
182 std::vector
<ConnStackItem
>::reverse_iterator itr
= maConnStack
.rbegin();
184 return itr
->mbOr
; // connection of the last stack.
187 ScXMLAndContext::ScXMLAndContext( ScXMLImport
& rImport
,
188 ScQueryParam
& rParam
,
189 ScXMLFilterContext
* pTempFilterContext
) :
190 ScXMLImportContext( rImport
),
191 mrQueryParam(rParam
),
192 pFilterContext(pTempFilterContext
)
194 pFilterContext
->OpenConnection(false);
197 ScXMLAndContext::~ScXMLAndContext()
201 uno::Reference
< xml::sax::XFastContextHandler
> SAL_CALL
ScXMLAndContext::createFastChildContext(
202 sal_Int32 nElement
, const uno::Reference
< xml::sax::XFastAttributeList
>& xAttrList
)
204 SvXMLImportContext
*pContext(nullptr);
205 sax_fastparser::FastAttributeList
*pAttribList
=
206 &sax_fastparser::castToFastAttributeList( xAttrList
);
210 case XML_ELEMENT( TABLE
, XML_FILTER_OR
):
212 // not supported in StarOffice
215 case XML_ELEMENT( TABLE
, XML_FILTER_CONDITION
):
217 pContext
= new ScXMLConditionContext(
218 GetScImport(), nElement
, pAttribList
, mrQueryParam
, pFilterContext
);
226 void SAL_CALL
ScXMLAndContext::endFastElement( sal_Int32
/*nElement*/ )
228 pFilterContext
->CloseConnection();
231 ScXMLOrContext::ScXMLOrContext( ScXMLImport
& rImport
,
232 ScQueryParam
& rParam
,
233 ScXMLFilterContext
* pTempFilterContext
) :
234 ScXMLImportContext( rImport
),
235 mrQueryParam(rParam
),
236 pFilterContext(pTempFilterContext
)
238 pFilterContext
->OpenConnection(true);
241 ScXMLOrContext::~ScXMLOrContext()
245 uno::Reference
< xml::sax::XFastContextHandler
> SAL_CALL
ScXMLOrContext::createFastChildContext(
246 sal_Int32 nElement
, const uno::Reference
< xml::sax::XFastAttributeList
>& xAttrList
)
248 SvXMLImportContext
*pContext(nullptr);
249 sax_fastparser::FastAttributeList
*pAttribList
=
250 &sax_fastparser::castToFastAttributeList( xAttrList
);
254 case XML_ELEMENT( TABLE
, XML_FILTER_AND
):
256 pContext
= new ScXMLAndContext(
257 GetScImport(), mrQueryParam
, pFilterContext
);
260 case XML_ELEMENT( TABLE
, XML_FILTER_CONDITION
):
262 pContext
= new ScXMLConditionContext(
263 GetScImport(), nElement
, pAttribList
, mrQueryParam
, pFilterContext
);
271 void SAL_CALL
ScXMLOrContext::endFastElement( sal_Int32
/*nElement*/ )
273 pFilterContext
->CloseConnection();
276 ScXMLConditionContext::ScXMLConditionContext(
277 ScXMLImport
& rImport
, sal_Int32
/*nElement*/,
278 const rtl::Reference
<sax_fastparser::FastAttributeList
>& rAttrList
,
279 ScQueryParam
& rParam
,
280 ScXMLFilterContext
* pTempFilterContext
) :
281 ScXMLImportContext( rImport
),
282 mrQueryParam(rParam
),
283 pFilterContext(pTempFilterContext
),
284 sDataType(GetXMLToken(XML_TEXT
)),
286 bIsCaseSensitive(false)
289 if ( !rAttrList
.is() )
292 for (auto &aIter
: *rAttrList
)
294 switch (aIter
.getToken())
296 case XML_ELEMENT( TABLE
, XML_FIELD_NUMBER
):
298 nField
= aIter
.toInt32();
301 case XML_ELEMENT( TABLE
, XML_CASE_SENSITIVE
):
303 bIsCaseSensitive
= IsXMLToken(aIter
, XML_TRUE
);
306 case XML_ELEMENT( TABLE
, XML_DATA_TYPE
):
308 sDataType
= aIter
.toString();
311 case XML_ELEMENT( TABLE
, XML_VALUE
):
313 sConditionValue
= aIter
.toString();
316 case XML_ELEMENT( TABLE
, XML_OPERATOR
):
318 sOperator
= aIter
.toString();
325 ScXMLConditionContext::~ScXMLConditionContext()
329 uno::Reference
< xml::sax::XFastContextHandler
> SAL_CALL
ScXMLConditionContext::createFastChildContext(
330 sal_Int32 nElement
, const uno::Reference
< xml::sax::XFastAttributeList
>& xAttrList
)
332 SvXMLImportContext
*pContext
= nullptr;
333 sax_fastparser::FastAttributeList
*pAttribList
=
334 &sax_fastparser::castToFastAttributeList( xAttrList
);
338 case XML_ELEMENT( TABLE
, XML_FILTER_SET_ITEM
):
340 pContext
= new ScXMLSetItemContext(
341 GetScImport(), nElement
, pAttribList
, *this);
349 void ScXMLConditionContext::GetOperator(
350 const OUString
& aOpStr
, ScQueryParam
& rParam
, ScQueryEntry
& rEntry
)
352 rParam
.eSearchType
= utl::SearchParam::SearchType::Normal
;
353 if (IsXMLToken(aOpStr
, XML_MATCH
))
355 rParam
.eSearchType
= utl::SearchParam::SearchType::Regexp
;
356 rEntry
.eOp
= SC_EQUAL
;
358 else if (IsXMLToken(aOpStr
, XML_NOMATCH
))
360 rParam
.eSearchType
= utl::SearchParam::SearchType::Regexp
;
361 rEntry
.eOp
= SC_NOT_EQUAL
;
363 else if (aOpStr
== "=")
364 rEntry
.eOp
= SC_EQUAL
;
365 else if (aOpStr
== "!=")
366 rEntry
.eOp
= SC_NOT_EQUAL
;
367 else if (IsXMLToken(aOpStr
, XML_BOTTOM_PERCENT
))
368 rEntry
.eOp
= SC_BOTPERC
;
369 else if (IsXMLToken(aOpStr
, XML_BOTTOM_VALUES
))
370 rEntry
.eOp
= SC_BOTVAL
;
371 else if (IsXMLToken(aOpStr
, XML_EMPTY
))
372 rEntry
.SetQueryByEmpty();
373 else if (aOpStr
== ">")
374 rEntry
.eOp
= SC_GREATER
;
375 else if (aOpStr
== ">=")
376 rEntry
.eOp
= SC_GREATER_EQUAL
;
377 else if (aOpStr
== "<")
378 rEntry
.eOp
= SC_LESS
;
379 else if (aOpStr
== "<=")
380 rEntry
.eOp
= SC_LESS_EQUAL
;
381 else if (IsXMLToken(aOpStr
, XML_NOEMPTY
))
382 rEntry
.SetQueryByNonEmpty();
383 else if (IsXMLToken(aOpStr
, XML_TOP_PERCENT
))
384 rEntry
.eOp
= SC_TOPPERC
;
385 else if (IsXMLToken(aOpStr
, XML_TOP_VALUES
))
386 rEntry
.eOp
= SC_TOPVAL
;
387 else if (IsXMLToken(aOpStr
, XML_CONTAINS
))
388 rEntry
.eOp
= SC_CONTAINS
;
389 else if (IsXMLToken(aOpStr
, XML_DOES_NOT_CONTAIN
))
390 rEntry
.eOp
= SC_DOES_NOT_CONTAIN
;
391 else if (IsXMLToken(aOpStr
, XML_BEGINS_WITH
))
392 rEntry
.eOp
= SC_BEGINS_WITH
;
393 else if (IsXMLToken(aOpStr
, XML_DOES_NOT_BEGIN_WITH
))
394 rEntry
.eOp
= SC_DOES_NOT_BEGIN_WITH
;
395 else if (IsXMLToken(aOpStr
, XML_ENDS_WITH
))
396 rEntry
.eOp
= SC_ENDS_WITH
;
397 else if (IsXMLToken(aOpStr
, XML_DOES_NOT_END_WITH
))
398 rEntry
.eOp
= SC_DOES_NOT_END_WITH
;
401 void ScXMLConditionContext::AddSetItem(const ScQueryEntry::Item
& rItem
)
403 maQueryItems
.push_back(rItem
);
406 void SAL_CALL
ScXMLConditionContext::endFastElement( sal_Int32
/*nElement*/ )
408 ScQueryEntry
& rEntry
= mrQueryParam
.AppendEntry();
410 // We currently don't support per-condition case sensitivity.
411 mrQueryParam
.bCaseSens
= bIsCaseSensitive
;
413 rEntry
.bDoQuery
= true;
414 rEntry
.eConnect
= pFilterContext
->GetConnection() ? SC_OR
: SC_AND
;
416 GetOperator(sOperator
, mrQueryParam
, rEntry
);
417 SCCOLROW nStartPos
= mrQueryParam
.bByRow
? mrQueryParam
.nCol1
: mrQueryParam
.nRow1
;
418 rEntry
.nField
= o3tl::saturating_add(nField
, nStartPos
);
420 if (maQueryItems
.empty())
422 ScQueryEntry::Item
& rItem
= rEntry
.GetQueryItem();
423 if (IsXMLToken(sDataType
, XML_NUMBER
))
425 rItem
.mfVal
= sConditionValue
.toDouble();
426 rItem
.meType
= ScQueryEntry::ByValue
;
430 svl::SharedStringPool
& rPool
= GetScImport().GetDocument()->GetSharedStringPool();
431 rItem
.maString
= rPool
.intern(sConditionValue
);
432 rItem
.meType
= ScQueryEntry::ByString
;
436 rEntry
.GetQueryItems().swap(maQueryItems
);
439 ScXMLSetItemContext::ScXMLSetItemContext(
440 ScXMLImport
& rImport
, sal_Int32
/*nElement*/,
441 const rtl::Reference
<sax_fastparser::FastAttributeList
>& rAttrList
, ScXMLConditionContext
& rParent
) :
442 ScXMLImportContext(rImport
)
444 if ( !rAttrList
.is() )
447 for (auto &aIter
: *rAttrList
)
449 switch (aIter
.getToken())
451 case XML_ELEMENT( TABLE
, XML_VALUE
):
453 svl::SharedStringPool
& rPool
= GetScImport().GetDocument()->GetSharedStringPool();
454 ScQueryEntry::Item aItem
;
455 aItem
.maString
= rPool
.intern(aIter
.toString());
456 aItem
.meType
= ScQueryEntry::ByString
;
458 rParent
.AddSetItem(aItem
);
465 ScXMLSetItemContext::~ScXMLSetItemContext()
469 ScXMLDPFilterContext::ScXMLDPFilterContext( ScXMLImport
& rImport
,
470 const rtl::Reference
<sax_fastparser::FastAttributeList
>& rAttrList
,
471 ScXMLDataPilotTableContext
* pTempDataPilotTableContext
) :
472 ScXMLImportContext( rImport
),
473 pDataPilotTable(pTempDataPilotTableContext
),
475 eSearchType(utl::SearchParam::SearchType::Normal
),
476 nFilterFieldCount(0),
477 bSkipDuplicates(false),
478 bIsCaseSensitive(false),
480 bNextConnectionOr(true)
482 if ( !rAttrList
.is() )
485 for (auto &aIter
: *rAttrList
)
487 switch (aIter
.getToken())
489 case XML_ELEMENT( TABLE
, XML_TARGET_RANGE_ADDRESS
):
494 case XML_ELEMENT( TABLE
, XML_CONDITION_SOURCE_RANGE_ADDRESS
):
499 case XML_ELEMENT( TABLE
, XML_CONDITION_SOURCE
):
501 // not supported by StarOffice
504 case XML_ELEMENT( TABLE
, XML_DISPLAY_DUPLICATES
):
506 bSkipDuplicates
= !IsXMLToken(aIter
, XML_TRUE
);
513 ScXMLDPFilterContext::~ScXMLDPFilterContext()
517 uno::Reference
< xml::sax::XFastContextHandler
> SAL_CALL
ScXMLDPFilterContext::createFastChildContext(
518 sal_Int32 nElement
, const uno::Reference
< xml::sax::XFastAttributeList
>& xAttrList
)
520 SvXMLImportContext
*pContext(nullptr);
521 sax_fastparser::FastAttributeList
*pAttribList
=
522 &sax_fastparser::castToFastAttributeList( xAttrList
);
526 case XML_ELEMENT( TABLE
, XML_FILTER_AND
):
528 pContext
= new ScXMLDPAndContext( GetScImport(), this);
531 case XML_ELEMENT( TABLE
, XML_FILTER_OR
):
533 pContext
= new ScXMLDPOrContext( GetScImport(), this);
536 case XML_ELEMENT( TABLE
, XML_FILTER_CONDITION
):
538 pContext
= new ScXMLDPConditionContext( GetScImport(), nElement
, pAttribList
, this);
546 void SAL_CALL
ScXMLDPFilterContext::endFastElement( sal_Int32
/*nElement*/ )
548 aFilterFields
.eSearchType
= eSearchType
;
549 aFilterFields
.bCaseSens
= bIsCaseSensitive
;
550 aFilterFields
.bDuplicate
= !bSkipDuplicates
;
552 pDataPilotTable
->SetSourceQueryParam(aFilterFields
);
555 void ScXMLDPFilterContext::AddFilterField (const ScQueryEntry
& aFilterField
)
557 aFilterFields
.Resize(nFilterFieldCount
+ 1);
558 ScQueryEntry
& rEntry(aFilterFields
.GetEntry(nFilterFieldCount
));
559 rEntry
= aFilterField
;
560 rEntry
.bDoQuery
= true;
564 ScXMLDPAndContext::ScXMLDPAndContext( ScXMLImport
& rImport
,
565 ScXMLDPFilterContext
* pTempFilterContext
) :
566 ScXMLImportContext( rImport
)
568 pFilterContext
= pTempFilterContext
;
569 pFilterContext
->OpenConnection(false);
572 ScXMLDPAndContext::~ScXMLDPAndContext()
576 uno::Reference
< xml::sax::XFastContextHandler
> SAL_CALL
ScXMLDPAndContext::createFastChildContext(
577 sal_Int32 nElement
, const uno::Reference
< xml::sax::XFastAttributeList
>& xAttrList
)
579 SvXMLImportContext
*pContext(nullptr);
580 sax_fastparser::FastAttributeList
*pAttribList
=
581 &sax_fastparser::castToFastAttributeList( xAttrList
);
585 case XML_ELEMENT( TABLE
, XML_FILTER_OR
):
587 // not supported in StarOffice
590 case XML_ELEMENT( TABLE
, XML_FILTER_CONDITION
):
592 pContext
= new ScXMLDPConditionContext( GetScImport(), nElement
, pAttribList
, pFilterContext
);
600 void SAL_CALL
ScXMLDPAndContext::endFastElement( sal_Int32
/*nElement*/ )
602 pFilterContext
->CloseConnection();
605 ScXMLDPOrContext::ScXMLDPOrContext( ScXMLImport
& rImport
,
606 ScXMLDPFilterContext
* pTempFilterContext
) :
607 ScXMLImportContext( rImport
),
608 pFilterContext(pTempFilterContext
)
610 pFilterContext
->OpenConnection(true);
613 ScXMLDPOrContext::~ScXMLDPOrContext()
617 uno::Reference
< xml::sax::XFastContextHandler
> SAL_CALL
ScXMLDPOrContext::createFastChildContext(
618 sal_Int32 nElement
, const uno::Reference
< xml::sax::XFastAttributeList
>& xAttrList
)
620 SvXMLImportContext
*pContext(nullptr);
621 sax_fastparser::FastAttributeList
*pAttribList
=
622 &sax_fastparser::castToFastAttributeList( xAttrList
);
626 case XML_ELEMENT( TABLE
, XML_FILTER_AND
):
628 pContext
= new ScXMLDPAndContext( GetScImport(), pFilterContext
);
631 case XML_ELEMENT( TABLE
, XML_FILTER_CONDITION
):
633 pContext
= new ScXMLDPConditionContext( GetScImport(), nElement
, pAttribList
, pFilterContext
);
641 void SAL_CALL
ScXMLDPOrContext::endFastElement( sal_Int32
/*nElement*/ )
643 pFilterContext
->CloseConnection();
646 ScXMLDPConditionContext::ScXMLDPConditionContext( ScXMLImport
& rImport
,
647 sal_Int32
/*nElement*/,
648 const rtl::Reference
<sax_fastparser::FastAttributeList
>& rAttrList
,
649 ScXMLDPFilterContext
* pTempFilterContext
) :
650 ScXMLImportContext( rImport
),
651 pFilterContext(pTempFilterContext
),
652 sDataType(GetXMLToken(XML_TEXT
)),
654 bIsCaseSensitive(false)
657 if ( !rAttrList
.is() )
660 for (auto &aIter
: *rAttrList
)
662 switch (aIter
.getToken())
664 case XML_ELEMENT( TABLE
, XML_FIELD_NUMBER
):
666 nField
= aIter
.toInt32();
669 case XML_ELEMENT( TABLE
, XML_CASE_SENSITIVE
):
671 bIsCaseSensitive
= IsXMLToken(aIter
, XML_TRUE
);
674 case XML_ELEMENT( TABLE
, XML_DATA_TYPE
):
676 sDataType
= aIter
.toString();
679 case XML_ELEMENT( TABLE
, XML_VALUE
):
681 sConditionValue
= aIter
.toString();
684 case XML_ELEMENT( TABLE
, XML_OPERATOR
):
686 sOperator
= aIter
.toString();
693 ScXMLDPConditionContext::~ScXMLDPConditionContext()
697 void ScXMLDPConditionContext::getOperatorXML(
698 const OUString
& sTempOperator
, ScQueryOp
& aFilterOperator
, utl::SearchParam::SearchType
& rSearchType
)
700 rSearchType
= utl::SearchParam::SearchType::Normal
;
701 if (IsXMLToken(sTempOperator
, XML_MATCH
))
703 rSearchType
= utl::SearchParam::SearchType::Regexp
;
704 aFilterOperator
= SC_EQUAL
;
706 else if (IsXMLToken(sTempOperator
, XML_NOMATCH
))
708 rSearchType
= utl::SearchParam::SearchType::Regexp
;
709 aFilterOperator
= SC_NOT_EQUAL
;
711 else if (sTempOperator
== "=")
712 aFilterOperator
= SC_EQUAL
;
713 else if (sTempOperator
== "!=")
714 aFilterOperator
= SC_NOT_EQUAL
;
715 else if (IsXMLToken(sTempOperator
, XML_BOTTOM_PERCENT
))
716 aFilterOperator
= SC_BOTPERC
;
717 else if (IsXMLToken(sTempOperator
, XML_BOTTOM_VALUES
))
718 aFilterOperator
= SC_BOTVAL
;
719 else if (sTempOperator
== ">")
720 aFilterOperator
= SC_GREATER
;
721 else if (sTempOperator
== ">=")
722 aFilterOperator
= SC_GREATER_EQUAL
;
723 else if (sTempOperator
== "<")
724 aFilterOperator
= SC_LESS
;
725 else if (sTempOperator
== "<=")
726 aFilterOperator
= SC_LESS_EQUAL
;
727 else if (IsXMLToken(sTempOperator
, XML_TOP_PERCENT
))
728 aFilterOperator
= SC_TOPPERC
;
729 else if (IsXMLToken(sTempOperator
, XML_TOP_VALUES
))
730 aFilterOperator
= SC_TOPVAL
;
733 void SAL_CALL
ScXMLDPConditionContext::endFastElement( sal_Int32
/*nElement*/ )
735 ScQueryEntry aFilterField
;
736 if (pFilterContext
->GetConnection())
737 aFilterField
.eConnect
= SC_OR
;
739 aFilterField
.eConnect
= SC_AND
;
740 pFilterContext
->SetIsCaseSensitive(bIsCaseSensitive
);
741 if (IsXMLToken(sOperator
, XML_EMPTY
))
742 aFilterField
.SetQueryByEmpty();
743 else if (IsXMLToken(sOperator
, XML_NOEMPTY
))
744 aFilterField
.SetQueryByNonEmpty();
747 utl::SearchParam::SearchType eSearchType
= utl::SearchParam::SearchType::Normal
;
748 getOperatorXML(sOperator
, aFilterField
.eOp
, eSearchType
);
749 pFilterContext
->SetSearchType(eSearchType
);
750 aFilterField
.nField
= nField
;
751 ScQueryEntry::Item
& rItem
= aFilterField
.GetQueryItem();
752 svl::SharedStringPool
& rPool
= GetScImport().GetDocument()->GetSharedStringPool();
754 if (IsXMLToken(sDataType
, XML_NUMBER
))
756 rItem
.mfVal
= sConditionValue
.toDouble();
757 rItem
.maString
= rPool
.intern(sConditionValue
);
758 rItem
.meType
= ScQueryEntry::ByValue
;
762 rItem
.maString
= rPool
.intern(sConditionValue
);
763 rItem
.meType
= ScQueryEntry::ByString
;
767 pFilterContext
->AddFilterField(aFilterField
);
770 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */