void Sequencer::search(std::shared_ptr<QP::IQueryProcessor> query, int sequence_number) const { int seq_id = sequence_number_.load(); if (seq_id % 2 != 0 || sequence_number != seq_id) { query->set_error(AKU_EBUSY); return; } std::vector<PSortedRun> filtered; std::vector<PSortedRun> pruns; Lock runs_guard(runs_resize_lock_); pruns = runs_; runs_guard.unlock(); int run_ix = 0; for (auto const& run: pruns) { auto ix = run_ix & RUN_LOCK_FLAGS_MASK; auto& rwlock = run_locks_.at(ix); rwlock.rdlock(); filter(run, query, &filtered); rwlock.unlock(); run_ix++; } auto consumer = [query](TimeSeriesValue const& val) { auto f = query->filter().apply(val.get_paramid()); if (f == QP::IQueryFilter::PROCESS) { return query->put(val.to_result()); } return true; }; if (!query->range().is_backward()) { kway_merge<TimeOrderMergePredicate, AKU_CURSOR_DIR_FORWARD>(filtered, consumer); } else { kway_merge<TimeOrderMergePredicate, AKU_CURSOR_DIR_BACKWARD>(filtered, consumer); } if (seq_id != sequence_number_.load()) { query->set_error(AKU_EBUSY); return; } }
void Sequencer::search(Caller& caller, InternalCursor* cur, SearchQuery query, int sequence_number) const { int seq_id = sequence_number_.load(); if (seq_id % 2 != 0 || sequence_number != seq_id) { cur->set_error(caller, AKU_EBUSY); return; } std::vector<PSortedRun> filtered; std::vector<PSortedRun> pruns; Lock runs_guard(runs_resize_lock_); pruns = runs_; runs_guard.unlock(); int run_ix = 0; for (auto const& run: pruns) { auto ix = run_ix & RUN_LOCK_FLAGS_MASK; auto& rwlock = run_locks_.at(ix); rwlock.rdlock(); filter(run, query, &filtered); rwlock.unlock(); run_ix++; } auto page = page_; auto consumer = [&caller, cur, page](TimeSeriesValue const& val) { aku_Sample result = val.to_result(page); return cur->put(caller, result); }; if (query.direction == AKU_CURSOR_DIR_FORWARD) { kway_merge<TimeOrderMergePredicate, AKU_CURSOR_DIR_FORWARD>(filtered, consumer); } else { kway_merge<TimeOrderMergePredicate, AKU_CURSOR_DIR_BACKWARD>(filtered, consumer); } if (seq_id != sequence_number_.load()) { cur->set_error(caller, AKU_EBUSY); return; } else { cur->complete(caller); } }
void Sequencer::searchV2(std::shared_ptr<QP::IQueryProcessor> query, int sequence_number) const { int seq_id = sequence_number_.load(); if (seq_id % 2 != 0 || sequence_number != seq_id) { query->set_error(AKU_EBUSY); return; } std::vector<PSortedRun> filtered; std::vector<PSortedRun> pruns; Lock runs_guard(runs_resize_lock_); pruns = runs_; runs_guard.unlock(); int run_ix = 0; for (auto const& run: pruns) { auto ix = run_ix & RUN_LOCK_FLAGS_MASK; auto& rwlock = run_locks_.at(ix); rwlock.rdlock(); filterV2(run, query, &filtered); rwlock.unlock(); run_ix++; } auto page = page_; auto consumer = [query, page](TimeSeriesValue const& val) { aku_Sample result = val.to_result(page); return query->put(result); }; if (query->direction() == AKU_CURSOR_DIR_FORWARD) { kway_merge<TimeOrderMergePredicate, AKU_CURSOR_DIR_FORWARD>(filtered, consumer); } else { kway_merge<TimeOrderMergePredicate, AKU_CURSOR_DIR_BACKWARD>(filtered, consumer); } if (seq_id != sequence_number_.load()) { query->set_error(AKU_EBUSY); return; } }