Skip to content

Commit

Permalink
Partial Key Search Tested
Browse files Browse the repository at this point in the history
Secondary indices work
  • Loading branch information
Umur Ozkul committed Apr 7, 2023
1 parent 4a351e8 commit 39362f9
Show file tree
Hide file tree
Showing 18 changed files with 261 additions and 120 deletions.
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"cSpell.words": [
"deindexing",
"Llanfairpwll",
"mockall",
"ondo",
"proto",
Expand Down
48 changes: 48 additions & 0 deletions src/db/enums/index_iterator_requests_factory.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
use crate::db::reference::requests::IndexIteratorRequests;
use crate::db::server::rocks_db_accessor::DbArc;
use crate::db::server::rocks_db_accessor::DbReadLockGuardWrapper;
use crate::db::DbResult;

pub(crate) enum IndexIteratorRequestsFactoryEnum {
DbArc(DbArc),
Mock, // todo!{}: Replace with the actual mock type when it's available
}

impl IndexIteratorRequestsFactoryEnum {
pub(crate) fn new_db_arc(db_arc: DbArc) -> Self {
IndexIteratorRequestsFactoryEnum::DbArc(db_arc)
}

pub(crate) fn new_mock() -> Self {
IndexIteratorRequestsFactoryEnum::Mock
}
pub(crate) fn create_read_locked_requests<'a>(
&'a self,
) -> DbResult<IndexIteratorRequestsEnum<'a>> {
match self {
IndexIteratorRequestsFactoryEnum::DbArc(db_arc) => {
let db_wrapper = DbReadLockGuardWrapper::new(db_arc)?;
Ok(IndexIteratorRequestsEnum::DbWrapper(db_wrapper))
}
IndexIteratorRequestsFactoryEnum::Mock => {
todo!()
}
}
}
}

pub(crate) enum IndexIteratorRequestsEnum<'a> {
DbWrapper(DbReadLockGuardWrapper<'a>),
MockWrapper, // todo!: Replace with the actual mock type when it's available
}

impl<'a> IndexIteratorRequestsEnum<'a> {
pub(crate) fn as_trait(&'a self) -> &'a dyn IndexIteratorRequests<'a> {
match self {
IndexIteratorRequestsEnum::DbWrapper(db_wrapper) => db_wrapper,
IndexIteratorRequestsEnum::MockWrapper => {
todo!()
}
}
}
}
2 changes: 2 additions & 0 deletions src/db/enums/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub(crate) mod index_iterator_requests_factory;
pub(crate) mod table_stored_iterator_requests_factory;
File renamed without changes.
98 changes: 97 additions & 1 deletion src/db/reference/index_reference.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
//index_reference.rs
//TODO: validate index name
use crate::db::entity::table_value::do_index_table_value;
use crate::db::enums::TableStoredIteratorRequestsFactoryEnum;
use crate::db::enums::table_stored_iterator_requests_factory::TableStoredIteratorRequestsFactoryEnum;
use crate::db::enums::index_iterator_requests_factory::IndexIteratorRequestsFactoryEnum;
use crate::db::{
entity::{Index, OndoKey, TableValue},
reference::{
Expand Down Expand Up @@ -56,6 +57,31 @@ pub(crate) trait IndexReferenceTrait {
end_key_prefix: OndoKey,
requests: &'a dyn IndexIteratorRequests<'a>,
) -> DbResult<Box<dyn Iterator<Item = DbResult<OndoKey>> + 'a>>;

fn all_values_with_key_prefix_vec<'a>(
&self,
key_prefix: OndoKey,
table_value_requests: &'a dyn TableValueRequests,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<TableValue>>>;
fn all_index_values_with_key_prefix_vec<'a>(
&self,
key_prefix: OndoKey,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<OndoKey>>>;
fn all_values_with_key_range_vec<'a>(
&self,
start_key_prefix: OndoKey,
end_key_prefix: OndoKey,
table_value_requests: &'a dyn TableValueRequests,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<TableValue>>>;
fn all_index_values_with_key_range_vec<'a>(
&self,
start_key_prefix: OndoKey,
end_key_prefix: OndoKey,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<OndoKey>>>;
}

#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
Expand Down Expand Up @@ -299,6 +325,76 @@ impl IndexReferenceTrait for IndexReference {
});
Ok(Box::new(index_value_iterator))
}

fn all_values_with_key_prefix_vec<'a>(
&self,
key_prefix: OndoKey,
table_value_requests: &'a dyn TableValueRequests,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<TableValue>>> {
let index_iterator_requests_enum =
index_iterator_requests_factory.create_read_locked_requests()?;
let index_iterator_requests = index_iterator_requests_enum.as_trait();

let iterator = self.all_values_with_key_prefix(
key_prefix,
table_value_requests,
index_iterator_requests,
)?;
Ok(iterator.collect())
}

fn all_index_values_with_key_prefix_vec<'a>(
&self,
key_prefix: OndoKey,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<OndoKey>>> {
let index_iterator_requests_enum =
index_iterator_requests_factory.create_read_locked_requests()?;
let index_iterator_requests = index_iterator_requests_enum.as_trait();

let iterator =
self.all_index_values_with_key_prefix(key_prefix, index_iterator_requests)?;
Ok(iterator.collect())
}

fn all_values_with_key_range_vec<'a>(
&self,
start_key_prefix: OndoKey,
end_key_prefix: OndoKey,
table_value_requests: &'a dyn TableValueRequests,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<TableValue>>> {
let index_iterator_requests_enum =
index_iterator_requests_factory.create_read_locked_requests()?;
let index_iterator_requests = index_iterator_requests_enum.as_trait();

let iterator = self.all_values_with_key_range(
start_key_prefix,
end_key_prefix,
table_value_requests,
index_iterator_requests,
)?;
Ok(iterator.collect())
}

fn all_index_values_with_key_range_vec<'a>(
&self,
start_key_prefix: OndoKey,
end_key_prefix: OndoKey,
index_iterator_requests_factory: &'a IndexIteratorRequestsFactoryEnum,
) -> DbResult<Vec<DbResult<OndoKey>>> {
let index_iterator_requests_enum =
index_iterator_requests_factory.create_read_locked_requests()?;
let index_iterator_requests = index_iterator_requests_enum.as_trait();

let iterator = self.all_index_values_with_key_range(
start_key_prefix,
end_key_prefix,
index_iterator_requests,
)?;
Ok(iterator.collect())
}
}

#[cfg(test)]
Expand Down
1 change: 1 addition & 0 deletions src/db/reference/table_reference/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ pub(crate) trait TableReferenceTrait {
requests: &'a dyn TableStoredIteratorRequests<'a>,
) -> DbResult<Box<dyn Iterator<Item = DbResult<TableValue>> + 'a>>;
}
// FIXME use factory instead of iterator requests.

pub type TableName = String;
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
Expand Down
Loading

0 comments on commit 39362f9

Please sign in to comment.