Skip to content

Commit

Permalink
rename referential_actions to reflect that it only works for foreign_…
Browse files Browse the repository at this point in the history
…keys

add new referential_actions fn that matches on relation_mode and defers to the FK / emulated actions
  • Loading branch information
Druue committed Apr 29, 2024
1 parent 264f24c commit 46e102f
Show file tree
Hide file tree
Showing 11 changed files with 24 additions and 15 deletions.
2 changes: 1 addition & 1 deletion prisma-fmt/src/actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ pub(crate) fn run(schema: &str) -> String {
} else if let Some(datasource) = validated_configuration.datasources.first() {
let available_referential_actions = datasource
.active_connector
.referential_actions()
.referential_actions(&datasource.relation_mode())
.iter()
.map(|act| format!("{act:?}"))
.collect::<Vec<_>>();
Expand Down
7 changes: 6 additions & 1 deletion prisma-fmt/src/text_document_completion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,17 @@ impl<'a> CompletionContext<'a> {
}

fn push_ast_completions(ctx: CompletionContext<'_>, completion_list: &mut CompletionList) {
let relation_mode = match ctx.config.map(|c| c.relation_mode()) {
Some(Some(rm)) => rm,
_ => ctx.connector().default_relation_mode(),
};

match ctx.db.ast_assert_single().find_at_position(ctx.position) {
ast::SchemaPosition::Model(
_model_id,
ast::ModelPosition::Field(_, ast::FieldPosition::Attribute("relation", _, Some(attr_name))),
) if attr_name == "onDelete" || attr_name == "onUpdate" => {
for referential_action in ctx.connector().referential_actions().iter() {
for referential_action in ctx.connector().referential_actions(&relation_mode).iter() {
completion_list.items.push(CompletionItem {
label: referential_action.as_str().to_owned(),
kind: Some(CompletionItemKind::ENUM),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ impl Connector for CockroachDatamodelConnector {
63
}

fn referential_actions(&self) -> BitFlags<ReferentialAction> {
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction> {
use ReferentialAction::*;

NoAction | Restrict | Cascade | SetNull | SetDefault
Expand Down
2 changes: 1 addition & 1 deletion psl/psl-core/src/builtin_connectors/mongodb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ impl Connector for MongoDbDatamodelConnector {
&[ConstraintScope::ModelKeyIndex]
}

fn referential_actions(&self) -> BitFlags<ReferentialAction> {
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction> {
BitFlags::empty()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ impl Connector for MsSqlDatamodelConnector {
128
}

fn referential_actions(&self) -> BitFlags<ReferentialAction> {
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction> {
use ReferentialAction::*;

NoAction | Cascade | SetNull | SetDefault
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ impl Connector for MySqlDatamodelConnector {
64
}

fn referential_actions(&self) -> BitFlags<ReferentialAction> {
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction> {
use ReferentialAction::*;

Restrict | Cascade | SetNull | NoAction | SetDefault
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ impl Connector for PostgresDatamodelConnector {
63
}

fn referential_actions(&self) -> BitFlags<ReferentialAction> {
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction> {
use ReferentialAction::*;

NoAction | Restrict | Cascade | SetNull | SetDefault
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ impl Connector for SqliteDatamodelConnector {
10000
}

fn referential_actions(&self) -> BitFlags<ReferentialAction> {
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction> {
use ReferentialAction::*;

SetNull | SetDefault | Cascade | Restrict | NoAction
Expand Down
14 changes: 9 additions & 5 deletions psl/psl-core/src/datamodel_connector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,15 @@ pub trait Connector: Send + Sync {
RelationMode::ForeignKeys
}

fn referential_actions(&self, relation_mode: &RelationMode) -> BitFlags<ReferentialAction> {
match relation_mode {
RelationMode::ForeignKeys => self.foreign_key_referential_actions(),
RelationMode::Prisma => self.emulated_referential_actions(),
}
}

/// The referential actions supported by the connector.
fn referential_actions(&self) -> BitFlags<ReferentialAction>;
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction>;

/// The referential actions supported when using relationMode = "prisma" by the connector.
/// There are in fact scenarios in which the set of emulated referential actions supported may change
Expand All @@ -101,10 +108,7 @@ pub trait Connector: Send + Sync {
}

fn supports_referential_action(&self, relation_mode: &RelationMode, action: ReferentialAction) -> bool {
match relation_mode {
RelationMode::ForeignKeys => self.referential_actions().contains(action),
RelationMode::Prisma => self.emulated_referential_actions().contains(action),
}
self.referential_actions(relation_mode).contains(action)
}

/// This is used by the query engine schema builder.
Expand Down
2 changes: 1 addition & 1 deletion psl/psl-core/src/datamodel_connector/empty_connector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ impl Connector for EmptyDatamodelConnector {
std::any::type_name::<EmptyDatamodelConnector>()
}

fn referential_actions(&self) -> BitFlags<ReferentialAction> {
fn foreign_key_referential_actions(&self) -> BitFlags<ReferentialAction> {
BitFlags::all()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ pub(super) fn referential_actions(field: RelationFieldWalker<'_>, ctx: &mut Cont

// validation template for relationMode = "foreignKeys"
let msg_foreign_keys = |action: ReferentialAction| {
let allowed_actions = connector.referential_actions();
let allowed_actions = connector.referential_actions(&relation_mode);

format!(
"Invalid referential action: `{}`. Allowed values: ({})",
Expand Down

0 comments on commit 46e102f

Please sign in to comment.