[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/kspread/database
From:       Stefan Nikolaus <nikolaus4 () googlemail ! com>
Date:       2007-07-21 9:39:47
Message-ID: 1185010787.607406.6362.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 690494 by nikolaus:

Database	Filtering.
		Get the subfilter composition right.


 M  +63 -0     Filter.cpp  
 M  +1 -0      Filter.h  
 M  +4 -8      FilterPopup.cpp  


--- trunk/koffice/kspread/database/Filter.cpp #690493:690494
@@ -570,6 +570,69 @@
     }
 }
 
+void Filter::addSubFilter(Composition composition, const Filter& filter)
+{
+    if (!d->condition)
+    {
+        if (!filter.d->condition)
+            d->condition = 0;
+        else if (filter.d->condition->type() == AbstractCondition::And)
+            d->condition = new And(*static_cast<And*>(filter.d->condition));
+        else if (filter.d->condition->type() == AbstractCondition::Or)
+            d->condition = new Or(*static_cast<Or*>(filter.d->condition));
+        else // if (filter.d->condition->type() == AbstractCondition::Condition)
+            d->condition = new \
Condition(*static_cast<Condition*>(filter.d->condition)); +    }
+    else if (composition == AndComposition)
+    {
+        if (filter.d->condition && d->condition->type() == AbstractCondition::And)
+        {
+            if (filter.d->condition->type() == AbstractCondition::And)
+                static_cast<And*>(d->condition)->list += \
static_cast<And*>(filter.d->condition)->list; +            else if \
(filter.d->condition->type() == AbstractCondition::Or) +                \
static_cast<And*>(d->condition)->list.append(new \
Or(*static_cast<Or*>(filter.d->condition))); +            else // if \
(filter.d->condition->type() == AbstractCondition::Condition) +                \
static_cast<And*>(d->condition)->list.append(new \
Condition(*static_cast<Condition*>(filter.d->condition))); +        }
+        else if (filter.d->condition)
+        {
+            And* andComposition = new And();
+            andComposition->list.append(d->condition);
+            if (filter.d->condition->type() == AbstractCondition::And)
+                andComposition->list += \
static_cast<And*>(filter.d->condition)->list; +            else if \
(filter.d->condition->type() == AbstractCondition::Or) +                \
andComposition->list.append(new Or(*static_cast<Or*>(filter.d->condition))); +        \
else // if (filter.d->condition->type() == AbstractCondition::Condition) +            \
andComposition->list.append(new \
Condition(*static_cast<Condition*>(filter.d->condition))); +            d->condition \
= andComposition; +        }
+    }
+    else // composition == OrComposition
+    {
+        if (filter.d->condition && d->condition->type() == AbstractCondition::Or)
+        {
+            if (filter.d->condition->type() == AbstractCondition::And)
+                static_cast<Or*>(d->condition)->list.append(new \
And(*static_cast<And*>(filter.d->condition))); +            else if \
(filter.d->condition->type() == AbstractCondition::Or) +                \
static_cast<Or*>(d->condition)->list += static_cast<Or*>(filter.d->condition)->list; \
+            else // if (filter.d->condition->type() == AbstractCondition::Condition) \
+                static_cast<Or*>(d->condition)->list.append(new \
Condition(*static_cast<Condition*>(filter.d->condition))); +        }
+        else if (filter.d->condition)
+        {
+            Or* orComposition = new Or();
+            orComposition->list.append(d->condition);
+            if (filter.d->condition->type() == AbstractCondition::And)
+                orComposition->list.append(new \
And(*static_cast<And*>(filter.d->condition))); +            else if \
(filter.d->condition->type() == AbstractCondition::Or) +                \
orComposition->list += static_cast<Or*>(filter.d->condition)->list; +            else \
// if (filter.d->condition->type() == AbstractCondition::Condition) +                \
orComposition->list.append(new \
Condition(*static_cast<Condition*>(filter.d->condition))); +            d->condition \
= orComposition; +        }
+    }
+}
+
 QHash<QString, Filter::Comparison> Filter::conditions(int fieldNumber) const
 {
     return d->condition ? d->condition->conditions(fieldNumber) : QHash<QString, \
                Comparison>();
--- trunk/koffice/kspread/database/Filter.h #690493:690494
@@ -86,6 +86,7 @@
     void addCondition(Composition composition,
                       int fieldNumber, Comparison comparison, const QString& value,
                       Qt::CaseSensitivity caseSensitivity = Qt::CaseInsensitive, \
Mode mode = Text ); +    void addSubFilter(Composition composition, const Filter& \
filter);  
     QHash<QString, Comparison> conditions(int fieldNumber) const;
     void removeConditions(int fieldNumber = -1);
--- trunk/koffice/kspread/database/FilterPopup.cpp #690493:690494
@@ -188,14 +188,10 @@
                                              ? Filter::OrComposition : \
                Filter::AndComposition;
         const QList<QString> values = (comparison == Filter::Match) ? matchList : \
                notMatchList;
         kDebug() << "adding conditions for fieldNumber " << d->fieldNumber << endl;
-        // We have to append the conditions for this field with an and-composition.
-        if (!values.isEmpty())
-            filter->addCondition(Filter::AndComposition, d->fieldNumber, comparison, \
                values[0]);
-        for (int i = 1; i < values.count(); ++i)
-        {
-            // go on with the proper composition
-            filter->addCondition(composition, d->fieldNumber, comparison, \
                values[i]);
-        }
+        Filter subFilter;
+        for (int i = 0; i < values.count(); ++i)
+            subFilter.addCondition(composition, d->fieldNumber, comparison, \
values[i]); +        filter->addSubFilter(Filter::AndComposition, subFilter);
     }
 }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic