summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2022-05-08 00:55:12 +0200
committerAdolfo Jayme Barrientos <fitojb@ubuntu.com>2022-05-09 11:11:41 +0200
commitf52f599518b5b3aef78b7af1d3a62996eec53a1f (patch)
treeaa0cc2171f14ad9c6516ca3b9d496abb3b2f29d7
parent061fbad1e33f68726ee5605c7903f4ae219d8539 (diff)
Resolves: tdf#148948 Use QueryBy(Non)Empty for "=" and "<>" criteria
Change-Id: I94e29370076fff977b6552d10883878633bee313 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134000 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins (cherry picked from commit 920a083f3818765528899ab38170db5a2917a06c) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134054 Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
-rw-r--r--sc/source/core/tool/queryparam.cxx29
1 files changed, 25 insertions, 4 deletions
diff --git a/sc/source/core/tool/queryparam.cxx b/sc/source/core/tool/queryparam.cxx
index 918bb0d5cdab..9890b2125c07 100644
--- a/sc/source/core/tool/queryparam.cxx
+++ b/sc/source/core/tool/queryparam.cxx
@@ -229,6 +229,8 @@ void ScQueryParamBase::FillInExcelSyntax(
ScQueryEntry& rEntry = GetEntry(nIndex);
ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
+ bool bByEmpty = false;
+ bool bByNonEmpty = false;
if (rCellStr.isEmpty())
rItem.maString = svl::SharedString::getEmptyString();
@@ -242,6 +244,8 @@ void ScQueryParamBase::FillInExcelSyntax(
{
rItem.maString = rPool.intern(rCellStr.copy(2));
rEntry.eOp = SC_NOT_EQUAL;
+ if (rCellStr.getLength() == 2)
+ bByNonEmpty = true;
}
else if (rCellStr.getLength() > 1 && rCellStr[1] == '=')
{
@@ -270,7 +274,11 @@ void ScQueryParamBase::FillInExcelSyntax(
else
{
if (rCellStr[0] == '=')
+ {
rItem.maString = rPool.intern(rCellStr.copy(1));
+ if (rCellStr.getLength() == 1)
+ bByEmpty = true;
+ }
else
rItem.maString = rPool.intern(rCellStr);
rEntry.eOp = SC_EQUAL;
@@ -280,19 +288,32 @@ void ScQueryParamBase::FillInExcelSyntax(
if (!pFormatter)
return;
- sal_uInt32 nFormat = 0;
- bool bNumber = pFormatter->IsNumberFormat( rItem.maString.getString(), nFormat, rItem.mfVal);
- rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
-
/* TODO: pFormatter currently is also used as a flag whether matching
* empty cells with an empty string is triggered from the interpreter.
* This could be handled independently if all queries should support
* it, needs to be evaluated if that actually is desired. */
+ // Interpreter queries have only one query, also QueryByEmpty and
+ // QueryByNonEmpty rely on that.
+ if (nIndex != 0)
+ return;
+
// (empty = empty) is a match, and (empty <> not-empty) also is a
// match. (empty = 0) is not a match.
rItem.mbMatchEmpty = ((rEntry.eOp == SC_EQUAL && rItem.maString.isEmpty())
|| (rEntry.eOp == SC_NOT_EQUAL && !rItem.maString.isEmpty()));
+
+ // SetQueryBy override item members with special values, so do this last.
+ if (bByEmpty)
+ rEntry.SetQueryByEmpty();
+ else if (bByNonEmpty)
+ rEntry.SetQueryByNonEmpty();
+ else
+ {
+ sal_uInt32 nFormat = 0;
+ bool bNumber = pFormatter->IsNumberFormat( rItem.maString.getString(), nFormat, rItem.mfVal);
+ rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
+ }
}
ScQueryParamTable::ScQueryParamTable() :