use crate::db::{
access::PushdownApplicability,
query::plan::{
AccessPlannedQuery, DeterministicSecondaryOrderContract, LogicalPushdownEligibility,
PlannerRouteProfile,
},
};
fn validated_secondary_order_contract(
planner_route_profile: &PlannerRouteProfile,
) -> Option<&DeterministicSecondaryOrderContract> {
secondary_order_contract_active(planner_route_profile.logical_pushdown_eligibility())
.then_some(())?;
planner_route_profile.secondary_order_contract()
}
pub(in crate::db) fn derive_secondary_pushdown_applicability_from_contract(
plan: &AccessPlannedQuery,
planner_route_profile: &PlannerRouteProfile,
) -> PushdownApplicability {
let Some(order_contract) = validated_secondary_order_contract(planner_route_profile) else {
return PushdownApplicability::NotApplicable;
};
let access_class = plan.access_strategy().class();
access_class.secondary_order_pushdown_applicability(order_contract)
}
pub(in crate::db::executor) const fn secondary_order_contract_active(
logical_pushdown_eligibility: LogicalPushdownEligibility,
) -> bool {
logical_pushdown_eligibility.secondary_order_allowed()
&& !logical_pushdown_eligibility.requires_full_materialization()
}
pub(in crate::db::executor) fn access_order_satisfied_by_route_contract(
plan: &AccessPlannedQuery,
) -> bool {
let logical = plan.scalar_plan();
let Some(order) = logical.order.as_ref() else {
return false;
};
let access_class = plan.access_strategy().class();
let planner_route_profile = plan.planner_route_profile();
let index_prefix_details = access_class.single_path_index_prefix_details();
let index_range_details = access_class.single_path_index_range_details();
let has_index_path = index_prefix_details.is_some() || index_range_details.is_some();
let has_order_fields = !order.fields.is_empty();
let primary_key_order_satisfied = order.is_primary_key_only(plan.primary_key_name())
&& access_class.ordered()
&& !has_index_path;
let prefix_order_contract_safe =
index_prefix_details.is_none() || access_class.prefix_order_contract_safe();
let secondary_pushdown_eligible = validated_secondary_order_contract(planner_route_profile)
.is_some_and(|order_contract| {
access_class
.secondary_order_pushdown_applicability(order_contract)
.is_eligible()
});
has_order_fields
&& (primary_key_order_satisfied
|| (has_index_path && prefix_order_contract_safe && secondary_pushdown_eligible))
}