Skip to content

Commit f4b0e08

Browse files
[Backport 2.3] Support range scans on compound indexes (prefix + range) (#6210)
1 parent 419af6e commit f4b0e08

File tree

10 files changed

+620
-111
lines changed

10 files changed

+620
-111
lines changed

crates/core/src/idx/planner/executor.rs

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,16 @@ impl QueryExecutor {
424424
)?))
425425
}
426426
}
427+
IndexOperator::Range(prefix, ranges) => {
428+
Some(ThingIterator::IndexRange(IndexRangeThingIterator::compound_range(
429+
ir,
430+
opt.ns()?,
431+
opt.db()?,
432+
ix,
433+
prefix,
434+
ranges,
435+
)?))
436+
}
427437
_ => None,
428438
})
429439
}
@@ -581,11 +591,11 @@ impl QueryExecutor {
581591
vec.push(IteratorRange::new(
582592
ValueType::NumberInt,
583593
RangeValue {
584-
value: Number::Int(from).into(),
594+
value: Arc::new(Number::Int(from).into()),
585595
inclusive: from_inc,
586596
},
587597
RangeValue {
588-
value: Value::None,
598+
value: Arc::new(Value::None),
589599
inclusive: false,
590600
},
591601
));
@@ -594,11 +604,11 @@ impl QueryExecutor {
594604
vec.push(IteratorRange::new(
595605
ValueType::NumberFloat,
596606
RangeValue {
597-
value: Number::Float(from).into(),
607+
value: Arc::new(Number::Float(from).into()),
598608
inclusive: from_inc,
599609
},
600610
RangeValue {
601-
value: Value::None,
611+
value: Arc::new(Value::None),
602612
inclusive: false,
603613
},
604614
));
@@ -607,11 +617,11 @@ impl QueryExecutor {
607617
vec.push(IteratorRange::new(
608618
ValueType::NumberDecimal,
609619
RangeValue {
610-
value: Number::Decimal(from).into(),
620+
value: Arc::new(Number::Decimal(from).into()),
611621
inclusive: from_inc,
612622
},
613623
RangeValue {
614-
value: Value::None,
624+
value: Arc::new(Value::None),
615625
inclusive: false,
616626
},
617627
));
@@ -626,11 +636,11 @@ impl QueryExecutor {
626636
vec.push(IteratorRange::new(
627637
ValueType::NumberInt,
628638
RangeValue {
629-
value: Value::None,
639+
value: Arc::new(Value::None),
630640
inclusive: false,
631641
},
632642
RangeValue {
633-
value: Number::Int(to).into(),
643+
value: Arc::new(Number::Int(to).into()),
634644
inclusive: to_inc,
635645
},
636646
));
@@ -639,11 +649,11 @@ impl QueryExecutor {
639649
vec.push(IteratorRange::new(
640650
ValueType::NumberFloat,
641651
RangeValue {
642-
value: Value::None,
652+
value: Arc::new(Value::None),
643653
inclusive: false,
644654
},
645655
RangeValue {
646-
value: Number::Float(to).into(),
656+
value: Arc::new(Number::Float(to).into()),
647657
inclusive: to_inc,
648658
},
649659
));
@@ -652,11 +662,11 @@ impl QueryExecutor {
652662
vec.push(IteratorRange::new(
653663
ValueType::NumberDecimal,
654664
RangeValue {
655-
value: Value::None,
665+
value: Arc::new(Value::None),
656666
inclusive: false,
657667
},
658668
RangeValue {
659-
value: Number::Decimal(to).into(),
669+
value: Arc::new(Number::Decimal(to).into()),
660670
inclusive: to_inc,
661671
},
662672
));
@@ -677,11 +687,11 @@ impl QueryExecutor {
677687
vec.push(IteratorRange::new(
678688
ValueType::NumberInt,
679689
RangeValue {
680-
value: Number::Int(from).into(),
690+
value: Arc::new(Number::Int(from).into()),
681691
inclusive: from_inc,
682692
},
683693
RangeValue {
684-
value: Number::Int(to).into(),
694+
value: Arc::new(Number::Int(to).into()),
685695
inclusive: to_inc,
686696
},
687697
));
@@ -690,11 +700,11 @@ impl QueryExecutor {
690700
vec.push(IteratorRange::new(
691701
ValueType::NumberFloat,
692702
RangeValue {
693-
value: Number::Float(from).into(),
703+
value: Arc::new(Number::Float(from).into()),
694704
inclusive: from_inc,
695705
},
696706
RangeValue {
697-
value: Number::Float(to).into(),
707+
value: Arc::new(Number::Float(to).into()),
698708
inclusive: to_inc,
699709
},
700710
));
@@ -703,11 +713,11 @@ impl QueryExecutor {
703713
vec.push(IteratorRange::new(
704714
ValueType::NumberDecimal,
705715
RangeValue {
706-
value: Number::Decimal(from).into(),
716+
value: Arc::new(Number::Decimal(from).into()),
707717
inclusive: from_inc,
708718
},
709719
RangeValue {
710-
value: Number::Decimal(to).into(),
720+
value: Arc::new(Number::Decimal(to).into()),
711721
inclusive: to_inc,
712722
},
713723
));
@@ -769,7 +779,7 @@ impl QueryExecutor {
769779
from: &'a RangeValue,
770780
to: &'a RangeValue,
771781
) -> Option<Vec<IteratorRange<'a>>> {
772-
match (&from.value, &to.value) {
782+
match (&from.value.as_ref(), &to.value.as_ref()) {
773783
(Value::Number(from_n), Value::Number(to_n)) => {
774784
Some(Self::get_ranges_number_variants(from_n, from.inclusive, to_n, to.inclusive))
775785
}
@@ -797,7 +807,7 @@ impl QueryExecutor {
797807
ir: IteratorRef,
798808
opt: &Options,
799809
ix: &DefineIndexStatement,
800-
range: &IteratorRange<'_>,
810+
range: &IteratorRange,
801811
) -> Result<ThingIterator, Error> {
802812
let (ns, db) = opt.ns_db()?;
803813
Ok(ThingIterator::UniqueRange(UniqueRangeThingIterator::new(ir, ns, db, ix, range)?))
@@ -883,6 +893,16 @@ impl QueryExecutor {
883893
)?))
884894
}
885895
}
896+
IndexOperator::Range(prefix, ranges) => {
897+
Some(ThingIterator::UniqueRange(UniqueRangeThingIterator::compound_range(
898+
irf,
899+
opt.ns()?,
900+
opt.db()?,
901+
ixr,
902+
prefix,
903+
ranges,
904+
)?))
905+
}
886906
_ => None,
887907
})
888908
}

0 commit comments

Comments
 (0)