From 771237f961f5148060c1d0606e4671552954176e Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 7 Oct 2024 23:53:54 +0300 Subject: Only store primary keys in secondary index sets --- log_db/src/lib.rs | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'log_db/src/lib.rs') diff --git a/log_db/src/lib.rs b/log_db/src/lib.rs index 49caabc..2e77e19 100644 --- a/log_db/src/lib.rs +++ b/log_db/src/lib.rs @@ -232,14 +232,7 @@ impl DB { let secondary_memtables = config .secondary_keys .iter() - .map(|key| { - SecondaryMemtable::new( - key, - primary_key_index, - config.memtable_capacity, - config.memtable_evict_policy.clone(), - ) - }) + .map(|key| SecondaryMemtable::new(key)) .collect(); let mut db = DB:: { @@ -507,9 +500,10 @@ impl DB { "Found suitable secondary index. Looking up key {:?} in the memtable", query_key ); - let records = self.secondary_memtables[memtable_index].find_all(&query_key); + let records = self.secondary_memtables[memtable_index] + .find_all(&self.primary_memtable, &query_key); debug!("Found matching key"); - return Ok(records.iter().map(|&record| record.clone()).collect()); + return Ok(records.iter().map(|record| record.clone()).collect()); } debug!( @@ -560,7 +554,15 @@ impl DB { if let Some(memtable_index) = found_memtable_index { debug!("Inserting result set into secondary index"); - self.secondary_memtables[memtable_index].set_all(&query_key, &result); + let primary_values: Vec = result + .iter() + .map(|r| { + r.values[self.primary_key_index] + .as_indexable() + .expect("A non-indexable value was stored at primary key index") + }) + .collect(); + self.secondary_memtables[memtable_index].set_all(&query_key, &primary_values); } Ok(result) @@ -606,10 +608,13 @@ impl DB { ); for (index, (schema_field, _)) in self.config.fields.iter().enumerate() { if schema_field == &secondary_memtable.field { + let primary_key = record.values[self.primary_key_index] + .as_indexable() + .expect("Primary key was not indexable"); let key = record.values[index] .as_indexable() .expect("Secondary index key was not indexable"); - secondary_memtable.set(&key, record); + secondary_memtable.set(&key, &primary_key); } } }); -- cgit v1.3