Exemplo n.º 1
0
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;
    }
}
Exemplo n.º 2
0
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);
    }
}
Exemplo n.º 3
0
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;
    }
}