aboutsummaryrefslogtreecommitdiff
path: root/database/src/kv/index.rs
diff options
context:
space:
mode:
Diffstat (limited to 'database/src/kv/index.rs')
-rw-r--r--database/src/kv/index.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs
index 5ceab1c..2c96b48 100644
--- a/database/src/kv/index.rs
+++ b/database/src/kv/index.rs
@@ -8,6 +8,7 @@ use crate::{
MultiBehaviour, RowNum, Sort, SortOrder,
kv::{
SubtreeNum,
+ binning::BinningComponent,
helpers::{read_counter, write_counter},
index_key::{IndexKey, SortKey},
prefix_iterator::PrefixIterator,
@@ -17,6 +18,33 @@ use anyhow::{Result, bail};
use jellyobject::Object;
use std::{collections::HashSet, iter::empty};
+pub fn test_index_identical(ik: &IndexKey, before: &Object, after: &Object) -> bool {
+ let mut identical = true;
+ for b in &ik.0.0 {
+ match b {
+ BinningComponent::Has(path) => {
+ identical &= path.get_matching_value(before).is_some()
+ == path.get_matching_value(after).is_some();
+ }
+ BinningComponent::Match(path) => {
+ identical &= path.get_matching_values(before) == path.get_matching_values(after);
+ }
+ }
+ }
+ match &ik.1 {
+ SortKey::None | SortKey::Count | SortKey::Random => (),
+ SortKey::Value(path, _) => {
+ identical &= path.get_matching_values(before) == path.get_matching_values(after);
+ }
+ SortKey::Text(paths) => {
+ for p in paths {
+ identical &= p.get_matching_values(before) == p.get_matching_values(after);
+ }
+ }
+ }
+ identical
+}
+
pub fn update_index(
txn: &mut dyn jellykv::Transaction,
is: SubtreeNum,