@@ -75,6 +75,18 @@ class CodeGen(schema: Schema) {
75
75
}.mkString(" " )
76
76
}
77
77
78
+ val starters = mutable.ArrayBuffer [String ]()
79
+ for (typ <- schema.nodeTypes if typ.starterName.isDefined){
80
+ starters.append(
81
+ s """ @overflowdb.traversal.help.Doc(info = "All nodes of type ${typ.className}, i.e. with label ${typ.name}")
82
+ |def ${typ.starterName.get}: Iterator[nodes. ${typ.className}] = overflowdb.traversal.InitialTraversal.from[nodes. ${typ.className}](wrapper.graph, " ${typ.name}") """ .stripMargin)
83
+ }
84
+ for (typ <- schema.nodeBaseTypes if typ.starterName.isDefined) {
85
+ val types = schema.nodeTypes.filter{_.extendzRecursively.contains(typ)}
86
+ starters.append(
87
+ s """ @overflowdb.traversal.help.Doc(info = "All nodes of type ${typ.className}, i.e. with label in ${types.map{_.name}.sorted.mkString(" , " )}")
88
+ |def ${typ.starterName.get}: Iterator[nodes. ${typ.className}] = wrapper.graph.nodes( ${types.map{concrete => " \" " + concrete.name + " \" " }.mkString(" , " ) }).asScala.asInstanceOf[Iterator[nodes. ${typ.className}]] """ .stripMargin)
89
+ }
78
90
val domainMain = baseDir.createChild(s " $domainShortName.scala " ).write(
79
91
s """ package $basePackage
80
92
|
@@ -143,6 +155,26 @@ class CodeGen(schema: Schema) {
143
155
| String.format(" $domainShortName (%s)", graph)
144
156
|}
145
157
|
158
+ |class GeneratedNodeStarterExt(val wrapper: ${domainShortName}) extends AnyVal {
159
+ |import scala.jdk.CollectionConverters.IteratorHasAsScala
160
+ | ${starters.mkString(" \n\n " )}
161
+ |}
162
+ |
163
+ |/**
164
+ | * Domain-specific version of diffgraph builder. This is to allow schema checking before diffgraph application
165
+ | * in the future, as well as a schema-aware point for providing backwards compatibility in odbv2.
166
+ | */
167
+ |class DiffGraphBuilder extends overflowdb.BatchedUpdate.DiffGraphBuilder {
168
+ | override def absorb(other: overflowdb.BatchedUpdate.DiffGraphBuilder): this.type = {super.absorb(other); this}
169
+ | override def addNode(node: overflowdb.DetachedNodeData): this.type = {super.addNode(node); this}
170
+ | override def addNode(label: String, keyvalues:Any*): this.type = {super.addNode(label, keyvalues:_*); this}
171
+ | override def addEdge(src: overflowdb.NodeOrDetachedNode, dst: overflowdb.NodeOrDetachedNode, label: String): this.type = {super.addEdge(src, dst, label); this}
172
+ | override def addEdge(src: overflowdb.NodeOrDetachedNode, dst: overflowdb.NodeOrDetachedNode, label: String, properties: Any*): this.type = {super.addEdge(src, dst, label, properties:_*); this}
173
+ | override def setNodeProperty(node: overflowdb.Node, label: String, property: Any): this.type = {super.setNodeProperty(node, label, property); this}
174
+ | override def removeNode(node: overflowdb.Node): this.type = {super.removeNode(node); this}
175
+ | override def removeEdge(edge: overflowdb.Edge): this.type = {super.removeEdge(edge); this}
176
+ |}
177
+ |
146
178
| """ .stripMargin
147
179
)
148
180
results.append(domainMain)
@@ -387,8 +419,10 @@ class CodeGen(schema: Schema) {
387
419
| def isRegex(pattern: String): Boolean = pattern.exists(reChars.contains(_))
388
420
|}
389
421
|
422
+ |trait StaticType[+T]
423
+ |
390
424
|/** Abstract supertype for overflowdb.Node and NewNode */
391
- |trait AbstractNode extends overflowdb.NodeOrDetachedNode {
425
+ |trait AbstractNode extends overflowdb.NodeOrDetachedNode with StaticType[AnyRef] {
392
426
| def label: String
393
427
|}
394
428
|
@@ -1199,29 +1233,44 @@ class CodeGen(schema: Schema) {
1199
1233
1200
1234
protected def writeNodeTraversalFiles (outputDir : File ): Seq [File ] = {
1201
1235
lazy val nodeTraversalImplicits = {
1202
- def implicitForNodeType (name : String ) = {
1236
+ def implicitForNodeType (name : String ): String = {
1203
1237
val traversalName = s " ${name}TraversalExtGen "
1204
- s " implicit def to $traversalName[NodeType <: $name](trav: IterableOnce[NodeType]): ${traversalName}[NodeType] = new $traversalName(trav) "
1238
+ s " implicit def to $traversalName[NodeType <: $name](trav: IterableOnce[NodeType]): ${traversalName}[NodeType] = new $traversalName(trav.iterator ) "
1205
1239
}
1206
1240
1207
1241
val implicitsForNodeTraversals =
1208
1242
schema.nodeTypes.map(_.className).sorted.map(implicitForNodeType).mkString(lineSeparator)
1209
1243
1210
1244
val implicitsForNodeBaseTypeTraversals =
1211
1245
schema.nodeBaseTypes.map(_.className).sorted.map(implicitForNodeType).mkString(lineSeparator)
1246
+ val implicitsForAnyNodeTraversals = implicitForNodeType(" StoredNode" )
1247
+ // todo: Relocate to specific file?
1248
+ val edgeExt = schema.edgeTypes.map{et =>
1249
+ val acc = s " ${Helpers .camelCase(et.name)}"
1250
+ s """ def _ ${acc}Out: Iterator[StoredNode] = traversal.flatMap{_._ ${acc}Out}
1251
+ |def _ ${acc}In: Iterator[StoredNode] = traversal.flatMap{_._ ${acc}In} """ .stripMargin
1252
+ }.mkString(" \n " )
1253
+ val anyNodeExtClass =
1254
+ s """ class StoredNodeTraversalExtGen[NodeType <: StoredNode](val traversal: Iterator[NodeType]) extends AnyVal {
1255
+ | ${edgeExt}
1256
+ |} """ .stripMargin
1212
1257
1213
1258
s """ package $traversalsPackage
1214
1259
|
1215
1260
|import $nodesPackage._
1216
1261
|
1217
1262
|trait NodeTraversalImplicits extends NodeBaseTypeTraversalImplicits {
1263
+ | $implicitsForAnyNodeTraversals
1264
+ |
1218
1265
| $implicitsForNodeTraversals
1219
1266
|}
1220
1267
|
1221
1268
|// lower priority implicits for base types
1222
1269
|trait NodeBaseTypeTraversalImplicits extends overflowdb.traversal.Implicits {
1223
1270
| $implicitsForNodeBaseTypeTraversals
1224
1271
|}
1272
+ |
1273
+ | $anyNodeExtClass
1225
1274
| """ .stripMargin
1226
1275
}
1227
1276
@@ -1598,7 +1647,7 @@ class CodeGen(schema: Schema) {
1598
1647
|import $nodesPackage._
1599
1648
|
1600
1649
|/** Traversal steps for $className */
1601
- |class ${className}TraversalExtGen[NodeType <: $className](val traversal: IterableOnce [NodeType]) extends AnyVal {
1650
+ |class ${className}TraversalExtGen[NodeType <: $className](val traversal: Iterator [NodeType]) extends AnyVal {
1602
1651
|
1603
1652
| ${customStepNameTraversals.mkString(System .lineSeparator)}
1604
1653
|
0 commit comments