Skip to content

Commit c816c92

Browse files
committed
draft approach for #35 - showing FK relationships
1 parent 89e212d commit c816c92

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

build-for-zpm/ClassExplorer/ClassView.cls

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,16 @@ ClassMethod fillClassData(oData As %ZEN.proxyObject, className As %String, level
112112
if (oData.restrictPackage) && ('..inPackage(oData.basePackageName, package)) quit oClass
113113
set oClass.Super = ..correctInheritance(oData, classDefinition, package) // now expand super names
114114

115+
// prebuild a list of properties that are part of an FK
116+
kill propToFK
117+
for i = 1:1:classDefinition.ForeignKeys.Count() {
118+
set fk = classDefinition.ForeignKeys.GetAt(i)
119+
for j = 1:1:$l(fk.Properties,",") {
120+
set prop = $piece(fk.Properties,",")
121+
set propToFK(prop) = fk
122+
}
123+
}
124+
115125
set oClass.properties = oProperties
116126
set count = classDefinition.Properties.Count()
117127
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.PropertyDefinition")
@@ -127,14 +137,26 @@ ClassMethod fillClassData(oData As %ZEN.proxyObject, className As %String, level
127137
// Skip private properties that InterSystems may add in any future versions
128138
}
129139
}
130-
if (..classExists(package _ "." _ p.Type)) {
131-
set oProp.Type = package _ "." _ p.Type
132-
do ..fillClassData(oData, package _ "." _ p.Type, level, currLevel)
133-
} elseif (..classExists(..extendClassFromType(p.Type))) {
134-
set oProp.Type = ..extendClassFromType(p.Type)
135-
do ..fillClassData(oData, ..extendClassFromType(p.Type), level, currLevel)
140+
141+
set pType = p.Type
142+
143+
// check if this property has an outgoing FK reference
144+
if $d(propToFK(p.Name), fk) {
145+
// if so, override target type and class relationship traits
146+
set pType = fk.ReferencedClass,
147+
oProp.Relationship = 1,
148+
oProp.Cardinality = "one",
149+
oProp.Inverse = "[foreign key]"
150+
}
151+
152+
if (..classExists(package _ "." _ pType)) {
153+
set oProp.Type = package _ "." _ pType
154+
do ..fillClassData(oData, package _ "." _ pType, level, currLevel)
155+
} elseif (..classExists(..extendClassFromType(pType))) {
156+
set oProp.Type = ..extendClassFromType(pType)
157+
do ..fillClassData(oData, ..extendClassFromType(pType), level, currLevel)
136158
} else {
137-
set oProp.Type = ..extendClassFromType(p.Type)
159+
set oProp.Type = ..extendClassFromType(pType)
138160
}
139161
}
140162

src/cls/ClassExplorer/ClassView.cls

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,16 @@ ClassMethod fillClassData(oData As %ZEN.proxyObject, className As %String, level
112112
if (oData.restrictPackage) && ('..inPackage(oData.basePackageName, package)) quit oClass
113113
set oClass.Super = ..correctInheritance(oData, classDefinition, package) // now expand super names
114114

115+
// prebuild a list of properties that are part of an FK
116+
kill propToFK
117+
for i = 1:1:classDefinition.ForeignKeys.Count() {
118+
set fk = classDefinition.ForeignKeys.GetAt(i)
119+
for j = 1:1:$l(fk.Properties,",") {
120+
set prop = $piece(fk.Properties,",")
121+
set propToFK(prop) = fk
122+
}
123+
}
124+
115125
set oClass.properties = oProperties
116126
set count = classDefinition.Properties.Count()
117127
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.PropertyDefinition")
@@ -127,14 +137,26 @@ ClassMethod fillClassData(oData As %ZEN.proxyObject, className As %String, level
127137
// Skip private properties that InterSystems may add in any future versions
128138
}
129139
}
130-
if (..classExists(package _ "." _ p.Type)) {
131-
set oProp.Type = package _ "." _ p.Type
132-
do ..fillClassData(oData, package _ "." _ p.Type, level, currLevel)
133-
} elseif (..classExists(..extendClassFromType(p.Type))) {
134-
set oProp.Type = ..extendClassFromType(p.Type)
135-
do ..fillClassData(oData, ..extendClassFromType(p.Type), level, currLevel)
140+
141+
set pType = p.Type
142+
143+
// check if this property has an outgoing FK reference
144+
if $d(propToFK(p.Name), fk) {
145+
// if so, override target type and class relationship traits
146+
set pType = fk.ReferencedClass,
147+
oProp.Relationship = 1,
148+
oProp.Cardinality = "one",
149+
oProp.Inverse = "[foreign key]"
150+
}
151+
152+
if (..classExists(package _ "." _ pType)) {
153+
set oProp.Type = package _ "." _ pType
154+
do ..fillClassData(oData, package _ "." _ pType, level, currLevel)
155+
} elseif (..classExists(..extendClassFromType(pType))) {
156+
set oProp.Type = ..extendClassFromType(pType)
157+
do ..fillClassData(oData, ..extendClassFromType(pType), level, currLevel)
136158
} else {
137-
set oProp.Type = ..extendClassFromType(p.Type)
159+
set oProp.Type = ..extendClassFromType(pType)
138160
}
139161
}
140162

0 commit comments

Comments
 (0)