From fbf6db25575729e03fc397190d1489be0604d665 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Wed, 25 Sep 2024 09:59:40 +0900 Subject: [PATCH] custom dup sort example --- heed/examples/custom-dupsort-comparator.rs | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 heed/examples/custom-dupsort-comparator.rs diff --git a/heed/examples/custom-dupsort-comparator.rs b/heed/examples/custom-dupsort-comparator.rs new file mode 100644 index 00000000..7a380acb --- /dev/null +++ b/heed/examples/custom-dupsort-comparator.rs @@ -0,0 +1,62 @@ +use std::cmp::Ordering; +use std::error::Error; +use std::fs; +use std::path::Path; + +use byteorder::BigEndian; +use heed::{DatabaseFlags, EnvOpenOptions}; +use heed_traits::Comparator; +use heed_types::{Str, U128}; + +enum DescendingIntCmp {} + +impl Comparator for DescendingIntCmp { + fn compare(a: &[u8], b: &[u8]) -> Ordering { + b.cmp(&a) + } +} + +fn main() -> Result<(), Box> { + let env_path = Path::new("target").join("custom-dupsort-cmp.mdb"); + + let _ = fs::remove_dir_all(&env_path); + + fs::create_dir_all(&env_path)?; + let env = unsafe { + EnvOpenOptions::new() + .map_size(10 * 1024 * 1024) // 10MB + .max_dbs(3) + .open(env_path)? + }; + + let mut wtxn = env.write_txn()?; + let db = env + .database_options() + .types::>() + .flags(DatabaseFlags::DUP_SORT) + .dup_sort_comparator::() + .create(&mut wtxn)?; + wtxn.commit()?; + + let mut wtxn = env.write_txn()?; + + // We fill our database with entries. + db.put(&mut wtxn, "1", &1)?; + db.put(&mut wtxn, "1", &2)?; + db.put(&mut wtxn, "1", &3)?; + db.put(&mut wtxn, "2", &4)?; + db.put(&mut wtxn, "1", &5)?; + db.put(&mut wtxn, "0", &0)?; + + // We check that the keys are in lexicographic and values in descending order. + let mut iter = db.iter(&wtxn)?; + assert_eq!(iter.next().transpose()?, Some(("0", 0))); + assert_eq!(iter.next().transpose()?, Some(("1", 5))); + assert_eq!(iter.next().transpose()?, Some(("1", 3))); + assert_eq!(iter.next().transpose()?, Some(("1", 2))); + assert_eq!(iter.next().transpose()?, Some(("1", 1))); + assert_eq!(iter.next().transpose()?, Some(("2", 4))); + drop(iter); + + Ok(()) +}