use nodedb_sql::types::{Filter, SqlValue};
use crate::control::planner::sql_plan_convert::convert::ConvertContext;
use crate::control::planner::sql_plan_convert::filter::serialize_filters;
use crate::control::planner::sql_plan_convert::value::sql_value_to_string;
pub(super) fn document_collection_is_edge_bearing(
ctx: &ConvertContext,
collection: &str,
) -> crate::Result<bool> {
let Some(credentials) = ctx.credentials.as_ref() else {
return Ok(false);
};
let catalog = credentials.catalog();
Ok(catalog
.get_collection(ctx.database_id, ctx.tenant_id.as_u64(), collection)?
.map(|c| c.has_implicit_edges)
.unwrap_or(false))
}
pub(super) fn pk_effective_filter(
filter_bytes: Vec<u8>,
target_keys: &[SqlValue],
) -> crate::Result<Vec<u8>> {
if !filter_bytes.is_empty() || target_keys.is_empty() {
return Ok(filter_bytes);
}
use crate::bridge::scan_filter::{FilterOp, ScanFilter};
let pk_filters: Vec<ScanFilter> = target_keys
.iter()
.map(|key| ScanFilter {
field: "id".to_string(),
op: FilterOp::Eq,
value: nodedb_types::Value::String(sql_value_to_string(key)),
clauses: Vec::new(),
expr: None,
})
.collect();
zerompk::to_msgpack_vec(&pk_filters).map_err(|e| crate::Error::Serialization {
format: "msgpack".into(),
detail: format!("pk filter encode: {e}"),
})
}
pub(super) fn delete_effective_filter(
filters: &[Filter],
target_keys: &[SqlValue],
) -> crate::Result<Vec<u8>> {
pk_effective_filter(serialize_filters(filters)?, target_keys)
}