use super::Verify;
use crate::schema::app::{self, Field, FieldId, Model};
impl Verify<'_> {
pub(super) fn verify_relations_are_indexed(&self, field: &Field) {
use app::FieldTy;
match &field.ty {
FieldTy::BelongsTo(rel) => self.verify_belongs_to_is_indexed(rel),
FieldTy::HasMany(rel) => self.verify_has_many_relation_is_indexed(rel),
FieldTy::HasOne(rel) => self.verify_has_one_relation_is_indexed(rel),
_ => {}
}
}
fn verify_belongs_to_is_indexed(&self, _: &app::BelongsTo) {
}
fn verify_has_many_relation_is_indexed(&self, rel: &app::HasMany) {
self.verify_has_relation_is_indexed(rel.target(&self.schema.app), rel.pair);
}
fn verify_has_one_relation_is_indexed(&self, rel: &app::HasOne) {
self.verify_has_relation_is_indexed(rel.target(&self.schema.app), rel.pair);
}
fn verify_has_relation_is_indexed(&self, target: &Model, pair: FieldId) {
let belongs_to = self.schema.app.field(pair).ty.as_belongs_to_unwrap();
'outer: for index in &target.as_root_unwrap().indices {
assert!(!index.fields.is_empty());
if index.fields.len() < belongs_to.foreign_key.fields.len() {
continue;
}
for (i, fk_field) in belongs_to.foreign_key.fields.iter().enumerate() {
if index.fields[i].field != fk_field.source {
continue 'outer;
}
}
if index.fields.len() == belongs_to.foreign_key.fields.len() {
return;
}
if index.fields[belongs_to.foreign_key.fields.len()]
.scope
.is_local()
{
return;
}
}
panic!("failed to find relation index");
}
}