void PatienceSort::add(aku_Timestamp ts, double value) { key_->timestamps.pop_back(); key_->timestamps.push_back(ts); key_->values.pop_back(); key_->values.push_back(value); auto top_element_more = [](const PSortedRun& x, const PSortedRun& y) { return y->timestamps.back() < x->timestamps.back(); }; auto begin = runs_.begin(); auto end = runs_.end(); auto insert_it = lower_bound(begin, end, key_, top_element_more); bool new_run_needed = insert_it == runs_.end(); SortedRun* run = nullptr; if (!new_run_needed) { run = insert_it->get(); } if (!new_run_needed) { run->timestamps.push_back(ts); run->values.push_back(value); } else { PSortedRun new_pile(new SortedRun()); new_pile->timestamps.push_back(ts); new_pile->values.push_back(value); runs_.push_back(move(new_pile)); } }
std::tuple<int, int> Sequencer::add(TimeSeriesValue const& value) { // FIXME: max_cache_size_ is not used int status = 0; int lock = 0; tie(status, lock) = check_timestamp_(value.get_timestamp()); if (status != AKU_SUCCESS) { return make_tuple(status, lock); } key_->pop_back(); key_->push_back(value); Lock guard(runs_resize_lock_); space_estimate_ += SPACE_PER_ELEMENT; auto begin = runs_.begin(); auto end = runs_.end(); auto insert_it = lower_bound(begin, end, key_, top_element_more<PSortedRun>); int run_ix = distance(begin, insert_it); bool new_run_needed = insert_it == runs_.end(); SortedRun* run = nullptr; if (!new_run_needed) { run = insert_it->get(); } guard.unlock(); if (!new_run_needed) { auto ix = run_ix & RUN_LOCK_FLAGS_MASK; auto& rwlock = run_locks_.at(ix); rwlock.wrlock(); run->push_back(value); rwlock.unlock(); } else { guard.lock(); PSortedRun new_pile(new SortedRun()); new_pile->push_back(value); runs_.push_back(move(new_pile)); guard.unlock(); } return make_tuple(AKU_SUCCESS, lock); }