1
0
Fork 0

use value by reference

This commit is contained in:
Jan Steemann 2015-04-20 16:10:31 +02:00
parent 6c66320de8
commit b46db8ed20
2 changed files with 10 additions and 8 deletions

View File

@ -100,7 +100,8 @@ namespace triagens {
} }
AqlValue (int64_t low, int64_t high) AqlValue (int64_t low, int64_t high)
: _type(RANGE) { : _range(nullptr),
_type(RANGE) {
_range = new Range(low, high); _range = new Range(low, high);
} }
@ -160,7 +161,7 @@ namespace triagens {
/// is used when the AqlValue is stolen and stored in another object /// is used when the AqlValue is stolen and stored in another object
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void erase () { void erase () throw() {
_type = EMPTY; _type = EMPTY;
_json = nullptr; _json = nullptr;
} }

View File

@ -3563,7 +3563,7 @@ int HashedAggregateBlock::getOrSkipSome (size_t atLeast,
} }
std::unordered_map<std::vector<AqlValue>, size_t, GroupKeyHash, GroupKeyEqual> allGroups( std::unordered_map<std::vector<AqlValue>, size_t, GroupKeyHash, GroupKeyEqual> allGroups(
256, 1024,
GroupKeyHash(_trx, colls), GroupKeyHash(_trx, colls),
GroupKeyEqual(_trx, colls) GroupKeyEqual(_trx, colls)
); );
@ -3621,26 +3621,27 @@ int HashedAggregateBlock::getOrSkipSome (size_t atLeast,
while (skipped < atMost) { while (skipped < atMost) {
groupValues.clear(); groupValues.clear();
// for hashing simply re-use the aggregate registers, without cloning their contents
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {
groupValues.emplace_back(cur->getValueReference(_pos, _aggregateRegisters[i].second)); groupValues.emplace_back(cur->getValueReference(_pos, _aggregateRegisters[i].second));
} }
// now check if we already know this group
auto it = allGroups.find(groupValues); auto it = allGroups.find(groupValues);
if (it == allGroups.end()) { if (it == allGroups.end()) {
// new group // new group
group.clear(); group.clear();
// copy the group values // copy the group values before they get invalidated
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {
group.emplace_back(cur->getValue(_pos, _aggregateRegisters[i].second).clone()); group.emplace_back(cur->getValueReference(_pos, _aggregateRegisters[i].second).clone());
} }
allGroups.emplace(group, 1); allGroups.emplace(group, 1);
} }
else { else {
// existing group // existing group. simply increase the counter
(*it).second++; (*it).second++;
} }