Skip to content

Commit b6f5184

Browse files
authored
allow to override default edge accessor (#342)
* allow to override default edge accessor * fmt
1 parent b86ae12 commit b6f5184

File tree

13 files changed

+98
-19
lines changed

13 files changed

+98
-19
lines changed

domain-classes-generator/src/main/scala/flatgraph/codegen/DomainClassesGenerator.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,7 +1224,13 @@ class DomainClassesGenerator(schema: Schema) {
12241224

12251225
case class NeighborContext(adjacentNode: AdjacentNode, scaladoc: String, defaultMethodName: String, customStepName: Option[String])
12261226
case class NeighborContextsByEdge(direction: Direction.Value, edge: EdgeType, neighborContexts: Seq[NeighborContext]) {
1227-
lazy val edgeAccessorName = camelCase(edge.name + "_" + direction)
1227+
lazy val edgeAccessorName = {
1228+
val namePart = edge.defaultAccessorName.getOrElse(edge.name)
1229+
camelCase(namePart + "_" + direction)
1230+
}
1231+
1232+
lazy val edgeAccessorNameOnRootType =
1233+
camelCase(edge.name + "_" + direction)
12281234

12291235
/** common root type across neighbors via this edge */
12301236
lazy val commonNeighborClassName =
@@ -1253,7 +1259,7 @@ class DomainClassesGenerator(schema: Schema) {
12531259
val stepImplementations = Seq.newBuilder[String]
12541260
neighborContextsByEdge.foreach { case context @ NeighborContextsByEdge(direction, edge, neighborContexts) =>
12551261
stepImplementations.addOne(
1256-
s"def ${context.edgeAccessorName}: Iterator[nodes.${context.commonNeighborClassName}] = node._${context.edgeAccessorName}.cast[nodes.${context.commonNeighborClassName}]"
1262+
s"def ${context.edgeAccessorName}: Iterator[nodes.${context.commonNeighborClassName}] = node._${context.edgeAccessorNameOnRootType}.cast[nodes.${context.commonNeighborClassName}]"
12571263
)
12581264

12591265
neighborContexts.foreach { case NeighborContext(adjacentNode, scaladoc, defaultMethodName, customStepName) =>

domain-classes-generator/src/main/scala/flatgraph/schema/Schema.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -225,20 +225,23 @@ class EdgeType(val name: String, val comment: Option[String], val schemaInfo: Sc
225225
extends HasClassName
226226
with HasOptionalProtoId
227227
with HasSchemaInfo {
228-
protected var _property: Option[Property[?]] = None
228+
protected var _property: Option[Property[?]] = None
229+
protected var _defaultAccessorName: Option[String] = None
229230

230231
override def toString = s"EdgeType($name)"
231232

232-
def property: Option[Property[?]] = _property
233+
def property: Option[Property[?]] = _property
234+
def defaultAccessorName: Option[String] = _defaultAccessorName
233235

234236
def withProperty(property: Property[?]): this.type = {
235237
_property = Option(property)
236238
this
237239
}
238240

239-
@deprecated("use `withProperty` instead, edges can only have one property max", since = "0.0.49")
240-
def addProperty(property: Property[?]): this.type =
241-
withProperty(property)
241+
def withDefaultAccessorName(value: String): this.type = {
242+
_defaultAccessorName = Option(value)
243+
this
244+
}
242245
}
243246

244247
object EdgeType {

test-schemas-domain-classes/src/main/scala/testdomains/generic/EdgeTypes.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
public class EdgeTypes {
77

88

9+
public static final String ANOTHER_EDGE = "another_edge";
10+
11+
912
public static final String CONNECTED_TO = "connected_to";
1013

1114
public static Set<String> ALL = new HashSet<String>() {{
15+
add(ANOTHER_EDGE);
1216
add(CONNECTED_TO);
1317
}};
1418

test-schemas-domain-classes/src/main/scala/testdomains/generic/GraphSchema.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package testdomains.generic
33
import flatgraph.FormalQtyType
44

55
object GraphSchema extends flatgraph.Schema {
6-
private val nodeLabels = IndexedSeq("node_a", "node_b")
7-
val nodeKindByLabel = nodeLabels.zipWithIndex.toMap
8-
val edgeLabels: Array[String] = Array("connected_to")
9-
val edgeKindByLabel = edgeLabels.zipWithIndex.toMap
10-
val edgePropertyAllocators: Array[Int => Array[?]] = Array(size => Array.fill(size)("<empty>") /* label = connected_to, id = 0 */ )
6+
private val nodeLabels = IndexedSeq("node_a", "node_b")
7+
val nodeKindByLabel = nodeLabels.zipWithIndex.toMap
8+
val edgeLabels: Array[String] = Array("another_edge", "connected_to")
9+
val edgeKindByLabel = edgeLabels.zipWithIndex.toMap
10+
val edgePropertyAllocators: Array[Int => Array[?]] =
11+
Array(size => null, size => Array.fill(size)("<empty>") /* label = connected_to, id = 1 */ )
1112
val nodeFactories: Array[(flatgraph.Graph, Int) => nodes.StoredNode] =
1213
Array((g, seq) => new nodes.NodeA(g, seq), (g, seq) => new nodes.NodeB(g, seq))
1314
val edgeFactories: Array[(flatgraph.GNode, flatgraph.GNode, Int, Any) => flatgraph.Edge] =
14-
Array((s, d, subseq, p) => new edges.ConnectedTo(s, d, subseq, p))
15+
Array((s, d, subseq, p) => new edges.AnotherEdge(s, d, subseq, p), (s, d, subseq, p) => new edges.ConnectedTo(s, d, subseq, p))
1516
val nodePropertyAllocators: Array[Int => Array[?]] = Array(
1617
size => new Array[Int](size),
1718
size => new Array[Int](size),
@@ -63,7 +64,7 @@ object GraphSchema extends flatgraph.Schema {
6364
_newNodeInserters
6465
}
6566
override def getNumberOfNodeKinds: Int = 2
66-
override def getNumberOfEdgeKinds: Int = 1
67+
override def getNumberOfEdgeKinds: Int = 2
6768
override def getNodeLabel(nodeKind: Int): String = nodeLabels(nodeKind)
6869
override def getNodeKindByLabel(label: String): Int = nodeKindByLabel.getOrElse(label, flatgraph.Schema.UndefinedKind)
6970
override def getEdgeLabel(nodeKind: Int, edgeKind: Int): String = edgeLabels(edgeKind)
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package testdomains.generic.edges
22

3+
object AnotherEdge {
4+
val Label = "another_edge"
5+
6+
}
7+
8+
class AnotherEdge(src_4762: flatgraph.GNode, dst_4762: flatgraph.GNode, subSeq_4862: Int, property_4862: Any)
9+
extends flatgraph.Edge(src_4762, dst_4762, 0, subSeq_4862, property_4862) {}
10+
311
object ConnectedTo {
412
val Label = "connected_to"
513
val propertyName: Option[String] = Some("string_mandatory")
614
}
715

816
class ConnectedTo(src_4762: flatgraph.GNode, dst_4762: flatgraph.GNode, subSeq_4862: Int, property_4862: Any)
9-
extends flatgraph.Edge(src_4762, dst_4762, 0, subSeq_4862, property_4862) {
17+
extends flatgraph.Edge(src_4762, dst_4762, 1, subSeq_4862, property_4862) {
1018
override def propertyName: Option[String] = ConnectedTo.propertyName
1119
}

test-schemas-domain-classes/src/main/scala/testdomains/generic/neighboraccessors/NodeA.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ final class AccessNeighborsForNodeA(val node: nodes.NodeA) extends AnyVal {
99
*/
1010
def _nodeAViaConnectedToIn: Iterator[nodes.NodeA] = connectedToIn.collectAll[nodes.NodeA]
1111

12+
/** Traverse to node_b via another_edge OUT edge.
13+
*/
14+
def _nodeBViaAnotherEdgeOut: Iterator[nodes.NodeB] = defaultStepNameOut.collectAll[nodes.NodeB]
15+
1216
/** Connected neighbor node Traverse to node_a via connected_to OUT edge.
1317
*/
1418
@deprecated("please use connectedTo instead")
@@ -21,6 +25,8 @@ final class AccessNeighborsForNodeA(val node: nodes.NodeA) extends AnyVal {
2125
def connectedToIn: Iterator[nodes.NodeA] = node._connectedToIn.cast[nodes.NodeA]
2226

2327
def connectedToOut: Iterator[nodes.NodeA] = node._connectedToOut.cast[nodes.NodeA]
28+
29+
def defaultStepNameOut: Iterator[nodes.NodeB] = node._anotherEdgeOut.cast[nodes.NodeB]
2430
}
2531

2632
final class AccessNeighborsForNodeATraversal(val traversal: Iterator[nodes.NodeA]) extends AnyVal {
@@ -29,6 +35,10 @@ final class AccessNeighborsForNodeATraversal(val traversal: Iterator[nodes.NodeA
2935
*/
3036
def _nodeAViaConnectedToIn: Iterator[nodes.NodeA] = traversal.flatMap(_._nodeAViaConnectedToIn)
3137

38+
/** Traverse to node_b via another_edge OUT edge.
39+
*/
40+
def _nodeBViaAnotherEdgeOut: Iterator[nodes.NodeB] = traversal.flatMap(_._nodeBViaAnotherEdgeOut)
41+
3242
/** Connected neighbor node Traverse to node_a via connected_to OUT edge.
3343
*/
3444
def connectedTo: Iterator[nodes.NodeA] = traversal.flatMap(_.connectedTo)
@@ -41,4 +51,6 @@ final class AccessNeighborsForNodeATraversal(val traversal: Iterator[nodes.NodeA
4151
def connectedToIn: Iterator[nodes.NodeA] = traversal.flatMap(_.connectedToIn)
4252

4353
def connectedToOut: Iterator[nodes.NodeA] = traversal.flatMap(_.connectedToOut)
54+
55+
def defaultStepNameOut: Iterator[nodes.NodeB] = traversal.flatMap(_.defaultStepNameOut)
4456
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package testdomains.generic.neighboraccessors
2+
3+
import testdomains.generic.nodes
4+
import testdomains.generic.language.*
5+
6+
final class AccessNeighborsForNodeB(val node: nodes.NodeB) extends AnyVal {
7+
8+
/** Traverse to node_a via another_edge IN edge.
9+
*/
10+
def _nodeAViaAnotherEdgeIn: Iterator[nodes.NodeA] = defaultStepNameIn.collectAll[nodes.NodeA]
11+
12+
def defaultStepNameIn: Iterator[nodes.NodeA] = node._anotherEdgeIn.cast[nodes.NodeA]
13+
}
14+
15+
final class AccessNeighborsForNodeBTraversal(val traversal: Iterator[nodes.NodeB]) extends AnyVal {
16+
17+
/** Traverse to node_a via another_edge IN edge.
18+
*/
19+
def _nodeAViaAnotherEdgeIn: Iterator[nodes.NodeA] = traversal.flatMap(_._nodeAViaAnotherEdgeIn)
20+
21+
def defaultStepNameIn: Iterator[nodes.NodeA] = traversal.flatMap(_.defaultStepNameIn)
22+
}

test-schemas-domain-classes/src/main/scala/testdomains/generic/neighboraccessors/package.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,11 @@ package object neighboraccessors {
1212

1313
implicit def accessNeighborsForNodeATraversal(traversal: IterableOnce[nodes.NodeA]): AccessNeighborsForNodeATraversal =
1414
new AccessNeighborsForNodeATraversal(traversal.iterator)
15+
16+
implicit def accessNeighborsForNodeB(node: nodes.NodeB): AccessNeighborsForNodeB =
17+
new AccessNeighborsForNodeB(node)
18+
19+
implicit def accessNeighborsForNodeBTraversal(traversal: IterableOnce[nodes.NodeB]): AccessNeighborsForNodeBTraversal =
20+
new AccessNeighborsForNodeBTraversal(traversal.iterator)
1521
}
1622
}

test-schemas-domain-classes/src/main/scala/testdomains/generic/nodes/NewNodeA.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import scala.collection.mutable
66

77
object NewNodeA {
88
def apply(): NewNodeA = new NewNodeA
9-
private val outNeighbors: Map[String, Set[String]] = Map("connected_to" -> Set("node_a"))
9+
private val outNeighbors: Map[String, Set[String]] = Map("another_edge" -> Set("node_b"), "connected_to" -> Set("node_a"))
1010
private val inNeighbors: Map[String, Set[String]] = Map("connected_to" -> Set("node_a"))
1111

1212
object InsertionHelpers {

test-schemas-domain-classes/src/main/scala/testdomains/generic/nodes/NewNodeB.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import scala.collection.mutable
77
object NewNodeB {
88
def apply(): NewNodeB = new NewNodeB
99
private val outNeighbors: Map[String, Set[String]] = Map()
10-
private val inNeighbors: Map[String, Set[String]] = Map()
10+
private val inNeighbors: Map[String, Set[String]] = Map("another_edge" -> Set("node_a"))
1111

1212
object InsertionHelpers {
1313
object NewNodeInserter_NodeB_stringOptional extends flatgraph.NewNodePropertyInsertionHelper {

0 commit comments

Comments
 (0)