Пример #1
0
Status PlanExecutor::pickBestPlan(YieldPolicy policy) {
    invariant(_currentState == kUsable);
    // For YIELD_AUTO, this will both set an auto yield policy on the PlanExecutor and
    // register it to receive notifications.
    this->setYieldPolicy(policy);

    // First check if we need to do subplanning.
    PlanStage* foundStage = getStageByType(_root.get(), STAGE_SUBPLAN);
    if (foundStage) {
        SubplanStage* subplan = static_cast<SubplanStage*>(foundStage);
        return subplan->pickBestPlan(_yieldPolicy.get());
    }

    // If we didn't have to do subplanning, we might still have to do regular
    // multi plan selection...
    foundStage = getStageByType(_root.get(), STAGE_MULTI_PLAN);
    if (foundStage) {
        MultiPlanStage* mps = static_cast<MultiPlanStage*>(foundStage);
        return mps->pickBestPlan(_yieldPolicy.get());
    }

    // ...or, we might have to run a plan from the cache for a trial period, falling back on
    // regular planning if the cached plan performs poorly.
    foundStage = getStageByType(_root.get(), STAGE_CACHED_PLAN);
    if (foundStage) {
        CachedPlanStage* cachedPlan = static_cast<CachedPlanStage*>(foundStage);
        return cachedPlan->pickBestPlan(_yieldPolicy.get());
    }

    // Either we chose a plan, or no plan selection was required. In both cases,
    // our work has been successfully completed.
    return Status::OK();
}
Пример #2
0
    Status PlanExecutor::pickBestPlan(YieldPolicy policy) {
        // For YIELD_AUTO, this will both set an auto yield policy on the PlanExecutor and
        // register it to receive notifications.
        this->setYieldPolicy(policy);

        // First check if we need to do subplanning.
        PlanStage* foundStage = getStageByType(_root.get(), STAGE_SUBPLAN);
        if (foundStage) {
            SubplanStage* subplan = static_cast<SubplanStage*>(foundStage);
            return subplan->pickBestPlan(_yieldPolicy.get());
        }

        // If we didn't have to do subplanning, we might still have to do regular
        // multi plan selection.
        foundStage = getStageByType(_root.get(), STAGE_MULTI_PLAN);
        if (foundStage) {
            MultiPlanStage* mps = static_cast<MultiPlanStage*>(foundStage);
            return mps->pickBestPlan(_yieldPolicy.get());
        }

        // Either we chose a plan, or no plan selection was required. In both cases,
        // our work has been successfully completed.
        return Status::OK();
    }