MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / apply_limit

Function apply_limit

nodedb-sql/src/planner/select/entry.rs:336–392  ·  view source on GitHub ↗

Apply LIMIT and OFFSET to a plan.

(mut plan: SqlPlan, limit_clause: &Option<ast::LimitClause>)

Source from the content-addressed store, hash-verified

334
335/// Apply LIMIT and OFFSET to a plan.
336fn apply_limit(mut plan: SqlPlan, limit_clause: &Option<ast::LimitClause>) -> SqlPlan {
337 let (limit_val, offset_val) = match limit_clause {
338 None => (None, 0usize),
339 Some(ast::LimitClause::LimitOffset { limit, offset, .. }) => {
340 let lv = limit
341 .as_ref()
342 .and_then(crate::coerce::expr_as_usize_literal);
343 let ov = offset
344 .as_ref()
345 .and_then(|o| crate::coerce::expr_as_usize_literal(&o.value))
346 .unwrap_or(0);
347 (lv, ov)
348 }
349 Some(ast::LimitClause::OffsetCommaLimit { offset, limit }) => {
350 let lv = crate::coerce::expr_as_usize_literal(limit);
351 let ov = crate::coerce::expr_as_usize_literal(offset).unwrap_or(0);
352 (lv, ov)
353 }
354 };
355
356 match plan {
357 SqlPlan::Scan {
358 ref mut limit,
359 ref mut offset,
360 ..
361 } => {
362 *limit = limit_val;
363 *offset = offset_val;
364 }
365 SqlPlan::Aggregate {
366 limit: ref mut l, ..
367 } => {
368 if let Some(lv) = limit_val {
369 *l = lv;
370 }
371 }
372 SqlPlan::VectorSearch {
373 top_k: ref mut k,
374 ef_search: ref mut ef,
375 ann_options: ref opts,
376 ..
377 } => {
378 // Fused VectorSearch (e.g. ORDER BY vector_distance + JOIN
379 // ARRAY_SLICE) inherits its outer LIMIT here. Without this,
380 // a join-derived VectorSearch carries the join's default
381 // 10000 limit instead of the user's `LIMIT N`.
382 if let Some(lv) = limit_val {
383 *k = lv;
384 *ef = opts
385 .ef_search_override
386 .unwrap_or(lv * DEFAULT_EF_SEARCH_MULTIPLIER);
387 }
388 }
389 _ => {}
390 }
391 plan
392}
393

Callers 1

plan_queryFunction · 0.85

Calls 2

expr_as_usize_literalFunction · 0.85
as_refMethod · 0.45

Tested by

no test coverage detected