Skip to content

Commit 7e20eee

Browse files
authored
Merge pull request #67 from modelix/modelql-references-and-children
support for "references" and "referencesAndChildren" in ModelQL
2 parents c5a4fbd + 4d513db commit 7e20eee

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

light-model-server/src/main/kotlin/org/modelix/model/server/light/QueryImplementation.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ import org.modelix.model.server.api.QueryChildren
3737
import org.modelix.model.server.api.QueryDescendants
3838
import org.modelix.model.server.api.QueryParent
3939
import org.modelix.model.server.api.QueryReference
40+
import org.modelix.model.server.api.QueryReferences
41+
import org.modelix.model.server.api.QueryReferencesAndChildren
4042
import org.modelix.model.server.api.QueryRootNode
4143
import org.modelix.model.server.api.RootOrSubquery
4244
import org.modelix.model.server.api.RootQuery
@@ -52,6 +54,8 @@ fun RootOrSubquery.queryNodes(node: INode): Sequence<INode> {
5254
is QueryDescendants -> node.getDescendants(false)
5355
is QueryParent -> listOfNotNull(node.parent).asSequence()
5456
is QueryReference -> listOfNotNull(node.getReferenceTarget(this.role)).asSequence()
57+
is QueryReferences -> node.getAllReferences()
58+
is QueryReferencesAndChildren -> node.getReferencesAndChildren(recursive)
5559
is QueryById -> {
5660
val resolved = INodeReferenceSerializer.deserialize(this.nodeId).resolveNode(node.getArea())
5761
if (resolved != null) {
@@ -66,6 +70,17 @@ fun RootOrSubquery.queryNodes(node: INode): Sequence<INode> {
6670
}
6771
}
6872

73+
private fun INode.getAllReferences() = getReferenceRoles().asSequence().mapNotNull { getReferenceTarget(it) }
74+
75+
private fun INode.getReferencesAndChildren(recursive: Boolean): Sequence<INode> {
76+
val referencesAndChildren = (getAllReferences() + allChildren.asSequence())
77+
return if (recursive) {
78+
referencesAndChildren.flatMap { sequenceOf(it) + it.getReferencesAndChildren(true) }
79+
} else {
80+
referencesAndChildren
81+
}
82+
}
83+
6984
fun RootOrSubquery.applyFilters(node: INode): Boolean {
7085
return when (this) {
7186
is RootQuery -> true

model-server-api/src/commonMain/kotlin/org/modelix/model/server/api/ModelQuery.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,21 @@ data class QueryReference(
8484
override val filters: List<Filter> = emptyList()
8585
) : Subquery()
8686

87+
@Serializable
88+
@SerialName("references")
89+
data class QueryReferences(
90+
override val queries: List<Subquery> = emptyList(),
91+
override val filters: List<Filter> = emptyList()
92+
) : Subquery()
93+
94+
@Serializable
95+
@SerialName("referencesAndChildren")
96+
data class QueryReferencesAndChildren(
97+
val recursive: Boolean = false,
98+
override val queries: List<Subquery> = emptyList(),
99+
override val filters: List<Filter> = emptyList()
100+
) : Subquery()
101+
87102
@Serializable
88103
@SerialName("descendants")
89104
data class QueryDescendants(

model-server-api/src/commonMain/kotlin/org/modelix/model/server/api/ModelQueryBuilder.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ fun buildModelQuery(body: ModelQueryBuilder.() -> Unit): ModelQuery {
2020
return ModelQueryBuilder().also(body).build()
2121
}
2222

23-
2423
class ModelQueryBuilder {
2524
private val rootQueries = ArrayList<RootQuery>()
2625
fun build() = ModelQuery(rootQueries)
@@ -83,6 +82,15 @@ abstract class QueryOwnerBuilder : FilterListBuilder() {
8382
fun reference(role: String, body: ReferenceBuilder.() -> Unit) {
8483
addSubquery(ReferenceBuilder(role).also(body).build())
8584
}
85+
fun references(body: ReferencesBuilder.() -> Unit) {
86+
addSubquery(ReferencesBuilder().also(body).build())
87+
}
88+
fun referencesAndChildren(body: ReferencesAndChildrenBuilder.() -> Unit) {
89+
addSubquery(ReferencesAndChildrenBuilder(false).also(body).build())
90+
}
91+
fun referencesAndChildrenRecursive(body: ReferencesAndChildrenBuilder.() -> Unit) {
92+
addSubquery(ReferencesAndChildrenBuilder(true).also(body).build())
93+
}
8694
fun allChildren(body: AllChildrenBuilder.() -> Unit) {
8795
addSubquery(AllChildrenBuilder().also(body).build())
8896
}
@@ -121,6 +129,12 @@ class ChildrenBuilder(val role: String?) : SubqueryBuilder() {
121129
class ReferenceBuilder(val role: String) : SubqueryBuilder() {
122130
override fun build() = QueryReference(role, subqueries, filters)
123131
}
132+
class ReferencesBuilder() : SubqueryBuilder() {
133+
override fun build() = QueryReferences(subqueries, filters)
134+
}
135+
class ReferencesAndChildrenBuilder(private val recursive: Boolean) : SubqueryBuilder() {
136+
override fun build() = QueryReferencesAndChildren(recursive, subqueries, filters)
137+
}
124138

125139
class AllChildrenBuilder() : SubqueryBuilder() {
126140
override fun build() = QueryAllChildren(subqueries, filters)

0 commit comments

Comments
 (0)