@@ -2,6 +2,7 @@ package overflowdb.codegen
2
2
3
3
import better .files ._
4
4
import overflowdb .codegen .CodeGen .ConstantContext
5
+ import overflowdb .schema .EdgeType .Cardinality
5
6
import overflowdb .schema .Property .ValueType
6
7
import overflowdb .schema ._
7
8
@@ -457,7 +458,11 @@ class CodeGen(schema: Schema) {
457
458
val neighbor = adjacentNode.neighbor
458
459
val entireNodeHierarchy : Set [AbstractNodeType ] = neighbor.subtypes(schema.allNodeTypes.toSet) ++ (neighbor.extendzRecursively :+ neighbor)
459
460
entireNodeHierarchy.map { neighbor =>
460
- val accessorName = s " _ ${camelCase(neighbor.name)}Via ${edge.className.capitalize}${camelCaseCaps(direction.toString)}"
461
+ val accessorName = {
462
+ if (adjacentNode.customStepName.isEmpty)
463
+ s " _ ${camelCase(neighbor.name)}Via ${edge.className.capitalize}${camelCaseCaps(direction.toString)}"
464
+ else adjacentNode.customStepName
465
+ }
461
466
val cardinality = adjacentNode.cardinality
462
467
val appendix = cardinality match {
463
468
case EdgeType .Cardinality .One => " .next()"
@@ -474,7 +479,6 @@ class CodeGen(schema: Schema) {
474
479
}.mkString(" \n " )
475
480
}
476
481
477
-
478
482
val companionObject = {
479
483
val propertyNames = nodeBaseType.properties.map(_.name)
480
484
val propertyNameDefs = propertyNames.map { name =>
@@ -566,7 +570,7 @@ class CodeGen(schema: Schema) {
566
570
567
571
// only edge and neighbor node matter, not the cardinality
568
572
val inheritedLookup : Set [(EdgeType , AbstractNodeType )] =
569
- inherited.map(_.adjacentNode).map { case AdjacentNode (viaEdge, neighbor, _) => (viaEdge, neighbor) }.toSet
573
+ inherited.map(_.adjacentNode).map { adjacentNode => (adjacentNode. viaEdge, adjacentNode. neighbor) }.toSet
570
574
571
575
val direct = adjacentNodes(nodeType).map { adjacentNode =>
572
576
val isInherited = inheritedLookup.contains((adjacentNode.viaEdge, adjacentNode.neighbor))
@@ -578,7 +582,7 @@ class CodeGen(schema: Schema) {
578
582
def createNeighborInfos (neighborContexts : Seq [AjacentNodeWithInheritanceStatus ], direction : Direction .Value ): Seq [NeighborInfoForEdge ] = {
579
583
neighborContexts.groupBy(_.adjacentNode.viaEdge).map { case (edge, neighborContexts) =>
580
584
val neighborInfoForNodes = neighborContexts.map { case AjacentNodeWithInheritanceStatus (adjacentNode, isInherited) =>
581
- NeighborInfoForNode (adjacentNode.neighbor, edge, direction, adjacentNode.cardinality, isInherited)
585
+ NeighborInfoForNode (adjacentNode.neighbor, edge, direction, adjacentNode.cardinality, isInherited, Option (adjacentNode.customStepName).filter(_.nonEmpty) )
582
586
}
583
587
NeighborInfoForEdge (edge, neighborInfoForNodes, nextOffsetPos)
584
588
}.toSeq
@@ -888,7 +892,7 @@ class CodeGen(schema: Schema) {
888
892
val edgeAccessorName = neighborAccessorNameForEdge(neighborInfo.edge, direction)
889
893
val nodeDelegators = neighborInfo.nodeInfos.collect {
890
894
case neighborNodeInfo if ! neighborNodeInfo.isInherited =>
891
- val accessorNameForNode = neighborNodeInfo. accessorName
895
+ val accessorNameForNode = accessorName(neighborNodeInfo)
892
896
s " def $accessorNameForNode: ${neighborNodeInfo.returnType} = get(). $accessorNameForNode"
893
897
}.mkString(" \n " )
894
898
@@ -949,7 +953,7 @@ class CodeGen(schema: Schema) {
949
953
case EdgeType .Cardinality .ZeroOrOne => s " .nextOption() "
950
954
case _ => " "
951
955
}
952
- s " def ${neighborNodeInfo. accessorName}: ${neighborNodeInfo.returnType} = $edgeAccessorName.collectAll[ ${neighborNodeInfo.neighborNode.className}] $appendix"
956
+ s " def ${accessorName(neighborNodeInfo) }: ${neighborNodeInfo.returnType} = $edgeAccessorName.collectAll[ ${neighborNodeInfo.neighborNode.className}] $appendix"
953
957
}.mkString(" \n " )
954
958
955
959
s """ def $edgeAccessorName: overflowdb.traversal.Traversal[ $neighborType] = overflowdb.traversal.Traversal(createAdjacentNodeIteratorByOffSet[ $neighborType]( $offsetPosition))
@@ -1117,13 +1121,6 @@ class CodeGen(schema: Schema) {
1117
1121
}
1118
1122
1119
1123
protected def writeNodeTraversalFiles (outputDir : File ): Seq [File ] = {
1120
- val staticHeader =
1121
- s """ package $traversalsPackage
1122
- |
1123
- |import overflowdb.traversal.Traversal
1124
- |import $nodesPackage._
1125
- | """ .stripMargin
1126
-
1127
1124
lazy val nodeTraversalImplicits = {
1128
1125
def implicitForNodeType (name : String ) = {
1129
1126
val traversalName = s " ${name}TraversalExtGen "
@@ -1152,9 +1149,25 @@ class CodeGen(schema: Schema) {
1152
1149
| """ .stripMargin
1153
1150
}
1154
1151
1155
- def generatePropertyTraversals (className : String , properties : Seq [Property [_]]): String = {
1152
+ def generateCustomStepNameTraversals (nodeType : AbstractNodeType ): String = {
1153
+ nodeType.edges
1154
+ .filter(_.customStepName.nonEmpty)
1155
+ .sortBy(_.customStepName)
1156
+ .map { case AdjacentNode (viaEdge, neighbor, cardinality, customStepName) =>
1157
+ val mapOrFlatMap = cardinality match {
1158
+ case Cardinality .One => " map"
1159
+ case Cardinality .ZeroOrOne | Cardinality .List => " flatMap"
1160
+ }
1161
+ s """ /** traverse to ${neighbor.name} via ${viaEdge.name} - this relationship was given a customStepName in the schema */
1162
+ |def $customStepName: Traversal[ ${neighbor.className}] =
1163
+ | traversal. $mapOrFlatMap(_. $customStepName)
1164
+ | """ .stripMargin
1165
+ }.mkString(" \n " )
1166
+ }
1167
+
1168
+ def generatePropertyTraversals (properties : Seq [Property [_]]): String = {
1156
1169
import Property .Cardinality
1157
- val propertyTraversals = properties.map { property =>
1170
+ properties.map { property =>
1158
1171
val nameCamelCase = camelCase(property.name)
1159
1172
val baseType = typeFor(property)
1160
1173
val cardinality = property.cardinality
@@ -1494,31 +1507,23 @@ class CodeGen(schema: Schema) {
1494
1507
| $filterSteps
1495
1508
| """ .stripMargin
1496
1509
}.mkString(" \n " )
1497
-
1498
- s """
1499
- |/** Traversal steps for $className */
1500
- |class ${className}TraversalExtGen[NodeType <: $className](val traversal: Traversal[NodeType]) extends AnyVal {
1501
- |
1502
- | $propertyTraversals
1503
- |
1504
- |} """ .stripMargin
1505
1510
}
1506
1511
1507
- def generateNodeBaseTypeSource (nodeBaseType : NodeBaseType ): String = {
1512
+ def generateNodeTraversalExt (nodeType : AbstractNodeType ): String = {
1513
+ val className = nodeType.className
1508
1514
s """ package $traversalsPackage
1509
1515
|
1510
1516
|import overflowdb.traversal.Traversal
1511
1517
|import $nodesPackage._
1512
1518
|
1513
- | ${generatePropertyTraversals(nodeBaseType.className, nodeBaseType.properties)}
1519
+ |/** Traversal steps for $className */
1520
+ |class ${className}TraversalExtGen[NodeType <: $className](val traversal: Traversal[NodeType]) extends AnyVal {
1514
1521
|
1515
- | """ .stripMargin
1516
- }
1517
-
1518
- def generateNodeSource (nodeType : NodeType ) = {
1519
- s """ $staticHeader
1520
- | ${generatePropertyTraversals(nodeType.className, nodeType.properties)}
1521
- | """ .stripMargin
1522
+ | ${generateCustomStepNameTraversals(nodeType)}
1523
+ |
1524
+ | ${generatePropertyTraversals(nodeType.properties)}
1525
+ |
1526
+ |} """ .stripMargin
1522
1527
}
1523
1528
1524
1529
val packageObject =
@@ -1532,13 +1537,8 @@ class CodeGen(schema: Schema) {
1532
1537
baseDir.createDirectories()
1533
1538
results.append(baseDir.createChild(" package.scala" ).write(packageObject))
1534
1539
results.append(baseDir.createChild(" NodeTraversalImplicits.scala" ).write(nodeTraversalImplicits))
1535
- schema.nodeBaseTypes.foreach { nodeBaseTrait =>
1536
- val src = generateNodeBaseTypeSource(nodeBaseTrait)
1537
- val srcFile = nodeBaseTrait.className + " .scala"
1538
- results.append(baseDir.createChild(srcFile).write(src))
1539
- }
1540
- schema.nodeTypes.foreach { nodeType =>
1541
- val src = generateNodeSource(nodeType)
1540
+ schema.allNodeTypes.foreach { nodeType =>
1541
+ val src = generateNodeTraversalExt(nodeType)
1542
1542
val srcFile = nodeType.className + " .scala"
1543
1543
results.append(baseDir.createChild(srcFile).write(src))
1544
1544
}
0 commit comments