pub(super) mod add_node;
pub(super) mod count_nodes;
pub(super) mod delete_node;
pub(super) mod get_node;
pub(super) mod has_node;
pub(super) mod list_nodes;
pub(super) mod update_node;
use diesel::{
dsl::{exists, not},
prelude::*,
};
use crate::registry::diesel::schema::{splinter_nodes, splinter_nodes_metadata};
use crate::registry::MetadataPredicate;
pub struct RegistryOperations<'a, C> {
conn: &'a C,
}
impl<'a, C: diesel::Connection> RegistryOperations<'a, C> {
pub fn new(conn: &'a C) -> Self {
RegistryOperations { conn }
}
}
type BoxedNodeQuery<'a, DB> = diesel::query_builder::BoxedSelectStatement<
'a,
(diesel::sql_types::Text, diesel::sql_types::Text),
splinter_nodes::table,
DB,
>;
fn apply_predicate_filters<'a, DB: 'a>(
query: BoxedNodeQuery<'a, DB>,
predicates: &'a [MetadataPredicate],
) -> BoxedNodeQuery<'a, DB>
where
DB: diesel::backend::Backend,
{
let mut query = query;
for predicate in predicates {
match predicate {
MetadataPredicate::Eq(key, val) => {
query = query.filter(exists(
splinter_nodes_metadata::table.filter(
splinter_nodes_metadata::identity
.eq(splinter_nodes::identity)
.and(splinter_nodes_metadata::key.eq(key))
.and(splinter_nodes_metadata::value.eq(val)),
),
));
}
MetadataPredicate::Ne(key, val) => {
query = query.filter(
not(exists(
splinter_nodes_metadata::table.filter(
splinter_nodes_metadata::identity
.eq(splinter_nodes::identity)
.and(splinter_nodes_metadata::key.eq(key)),
),
))
.or(exists(
splinter_nodes_metadata::table.filter(
splinter_nodes_metadata::identity
.eq(splinter_nodes::identity)
.and(splinter_nodes_metadata::key.eq(key))
.and(splinter_nodes_metadata::value.ne(val)),
),
)),
);
}
MetadataPredicate::Gt(key, val) => {
query = query.filter(exists(
splinter_nodes_metadata::table.filter(
splinter_nodes_metadata::identity
.eq(splinter_nodes::identity)
.and(splinter_nodes_metadata::key.eq(key))
.and(splinter_nodes_metadata::value.gt(val)),
),
));
}
MetadataPredicate::Ge(key, val) => {
query = query.filter(exists(
splinter_nodes_metadata::table.filter(
splinter_nodes_metadata::identity
.eq(splinter_nodes::identity)
.and(splinter_nodes_metadata::key.eq(key))
.and(splinter_nodes_metadata::value.ge(val)),
),
));
}
MetadataPredicate::Lt(key, val) => {
query = query.filter(exists(
splinter_nodes_metadata::table.filter(
splinter_nodes_metadata::identity
.eq(splinter_nodes::identity)
.and(splinter_nodes_metadata::key.eq(key))
.and(splinter_nodes_metadata::value.lt(val)),
),
));
}
MetadataPredicate::Le(key, val) => {
query = query.filter(exists(
splinter_nodes_metadata::table.filter(
splinter_nodes_metadata::identity
.eq(splinter_nodes::identity)
.and(splinter_nodes_metadata::key.eq(key))
.and(splinter_nodes_metadata::value.le(val)),
),
));
}
}
}
query
}