Kaydet (Commit) 5b63983e authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Record sort order during the first sort by the value, and use it the 2nd time.

This avoids comparison of raw values (ScDPItemData) during the 2nd sort.
Comparison of raw values can be expensive especially when the item sets mostly
consist of string values.
üst 101aa287
...@@ -247,8 +247,9 @@ struct Bucket ...@@ -247,8 +247,9 @@ struct Bucket
ScDPItemData maValue; ScDPItemData maValue;
SCROW mnOrderIndex; SCROW mnOrderIndex;
SCROW mnDataIndex; SCROW mnDataIndex;
SCROW mnValueSortIndex;
Bucket(const ScDPItemData& rValue, SCROW nOrder, SCROW nData) : Bucket(const ScDPItemData& rValue, SCROW nOrder, SCROW nData) :
maValue(rValue), mnOrderIndex(nOrder), mnDataIndex(nData) {} maValue(rValue), mnOrderIndex(nOrder), mnDataIndex(nData), mnValueSortIndex(0) {}
}; };
struct LessByValue : std::binary_function<Bucket, Bucket, bool> struct LessByValue : std::binary_function<Bucket, Bucket, bool>
...@@ -259,6 +260,14 @@ struct LessByValue : std::binary_function<Bucket, Bucket, bool> ...@@ -259,6 +260,14 @@ struct LessByValue : std::binary_function<Bucket, Bucket, bool>
} }
}; };
struct LessByValueSortIndex : std::binary_function<Bucket, Bucket, bool>
{
bool operator() (const Bucket& left, const Bucket& right) const
{
return left.mnValueSortIndex < right.mnValueSortIndex;
}
};
struct LessByDataIndex : std::binary_function<Bucket, Bucket, bool> struct LessByDataIndex : std::binary_function<Bucket, Bucket, bool>
{ {
bool operator() (const Bucket& left, const Bucket& right) const bool operator() (const Bucket& left, const Bucket& right) const
...@@ -297,6 +306,17 @@ public: ...@@ -297,6 +306,17 @@ public:
} }
}; };
class TagValueSortOrder : std::unary_function<Bucket, void>
{
SCROW mnCurIndex;
public:
TagValueSortOrder() : mnCurIndex(0) {}
void operator() (Bucket& v)
{
v.mnValueSortIndex = mnCurIndex++;
}
};
void processBuckets(std::vector<Bucket>& aBuckets, ScDPCache::Field& rField) void processBuckets(std::vector<Bucket>& aBuckets, ScDPCache::Field& rField)
{ {
if (aBuckets.empty()) if (aBuckets.empty())
...@@ -305,6 +325,9 @@ void processBuckets(std::vector<Bucket>& aBuckets, ScDPCache::Field& rField) ...@@ -305,6 +325,9 @@ void processBuckets(std::vector<Bucket>& aBuckets, ScDPCache::Field& rField)
// Sort by the value. // Sort by the value.
std::sort(aBuckets.begin(), aBuckets.end(), LessByValue()); std::sort(aBuckets.begin(), aBuckets.end(), LessByValue());
// Remember this sort order.
std::for_each(aBuckets.begin(), aBuckets.end(), TagValueSortOrder());
{ {
// Set order index such that unique values have identical index value. // Set order index such that unique values have identical index value.
SCROW nCurIndex = 0; SCROW nCurIndex = 0;
...@@ -329,7 +352,7 @@ void processBuckets(std::vector<Bucket>& aBuckets, ScDPCache::Field& rField) ...@@ -329,7 +352,7 @@ void processBuckets(std::vector<Bucket>& aBuckets, ScDPCache::Field& rField)
std::for_each(aBuckets.begin(), aBuckets.end(), PushBackOrderIndex(rField.maData)); std::for_each(aBuckets.begin(), aBuckets.end(), PushBackOrderIndex(rField.maData));
// Sort by the value again. // Sort by the value again.
std::sort(aBuckets.begin(), aBuckets.end(), LessByValue()); std::sort(aBuckets.begin(), aBuckets.end(), LessByValueSortIndex());
// Unique by value. // Unique by value.
std::vector<Bucket>::iterator itUniqueEnd = std::vector<Bucket>::iterator itUniqueEnd =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment