Skip to content

Commit 2588351

Browse files
committed
Implemented weak entities
1 parent 483307d commit 2588351

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

src/server/cypher/erToCypher.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { ER, Rel } from "../misc/interfaces"
1+
import { Conn, ER, Rel } from "../misc/interfaces"
22
import { getTwoByTwoCombinations, generateMultivaluedAttributeTriggers,
33
generateAllAttributes, getNameForAEntRelationship, getNameForNAryRelationship } from "./helpers"
44
import { generateStrictModeTriggerForNodes, generateDisjointednessTrigger,
55
generateCompletenessTrigger, generateChildrenTrigger,
66
generatePropertyExistenceConstraints, generateStrictModeTriggerForRelationships,
77
generateCompositeAttributeTriggers, generateUnionTriggerForParent,
8-
generateUnionTriggerForChildren, generateAssociativeEntityRelationshipControl } from "./statements"
8+
generateUnionTriggerForChildren, generateAssociativeEntityRelationshipControl, generateWeakEntityTrigger } from "./statements"
99
import { generateRelationship } from "./relationships"
1010
import { getRelNameForCompAttribute, getEntNameForCompAttribute } from "../../client/utils/helpers"
1111
import { lower } from "../../shared/removeAccents"
@@ -55,6 +55,12 @@ const erToCypher = (er: string, strictMode = true): string => {
5555
if (relationship.entities.length == 2) { // Simple relationship, mapped to a Neo4j relationship.
5656
schema += generateRelationship(relationship) // This includes "generatePropertyExistenceConstraints".
5757

58+
// Check whether a weak entity exists.
59+
const weakEntity: Conn | null = relationship.entities.find(conn => conn.weak == true) ?? null
60+
61+
if (weakEntity !== null) {
62+
schema += generateWeakEntityTrigger(weakEntity, relationship)
63+
}
5864
}
5965
else if (relationship.entities.length > 2) { // Complex relationship, mapped to its own Neo4j node.
6066
schema += generatePropertyExistenceConstraints(relationship.id, relationship.attributes)

src/server/cypher/statements.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { generateTrigger, getNameForAEntRelationship, getNameForNAryRelationship
33
import { lower, normalize } from "../../shared/removeAccents"
44
import { getRelNameForCompAttribute, getEntNameForCompAttribute } from "../../client/utils/helpers"
55
import { generateRelationship } from "./relationships"
6-
import { AEnt, Ent, Rel, Union } from "../misc/interfaces"
6+
import { AEnt, Conn, Ent, Rel, Union } from "../misc/interfaces"
77

88
export const generatePropertyExistenceConstraints = (id: string, attributes: Array<string>, isRelationship = false): string => {
99
let statement = ""
@@ -230,3 +230,17 @@ export const generateAssociativeEntityRelationshipControl = (aent: AEnt | Rel, i
230230

231231
return generateTrigger(`${id} associations`, statement)
232232
}
233+
234+
export const generateWeakEntityTrigger = (conn: Conn, rel: Rel): string => {
235+
const strongEntity: Conn | null = rel.entities.find(entity => entity.weak == false) ?? null
236+
237+
if (strongEntity !== null) {
238+
let statement = `MATCH (n:${conn.id})` + "\n"
239+
statement += indentation + `WHERE NOT (:${strongEntity.id})-[:${rel.id}]-(n)` + "\n"
240+
statement += indentation + "DETACH DELETE n"
241+
242+
return generateTrigger(`Weak entity ${conn.id} in ${rel.id}`, statement)
243+
}
244+
245+
return ""
246+
}

0 commit comments

Comments
 (0)