Skip to content

Commit da58caa

Browse files
authored
Merge pull request #131 from modelix/modelql2
MODELIX-443 ModelQL v2
2 parents 680ec45 + 190698d commit da58caa

File tree

178 files changed

+13033
-136
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

178 files changed

+13033
-136
lines changed

.idea/copyright/Modelix.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/copyright/profiles_settings.xml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

commitlint.config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,13 @@ module.exports = {
1515
"model-client",
1616
"model-server",
1717
"model-sync-lib",
18+
"modelql",
19+
"mps-model-adapters",
20+
"mps-model-server",
21+
"mps-model-server-plugin",
1822
"ts-model-api",
1923
],
2024
],
25+
"subject-case": [0, 'never']
2126
},
2227
};

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ apacheCxf="3.5.5"
2929
[libraries]
3030

3131
kotlin-stdlib-common = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-common", version.ref = "kotlin" }
32+
kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" }
3233
kotlin-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinSerialization" }
3334
kotlin-serialization-yaml = { group = "com.charleskorn.kaml", name = "kaml", version = "0.55.0" }
3435
kotlin-logging = { group = "io.github.microutils", name = "kotlin-logging", version = "3.0.5" }

light-model-client/build.gradle.kts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,15 @@ kotlin {
2323
implementation(project(":model-api"))
2424
implementation(project(":model-api-gen-runtime"))
2525
implementation(project(":model-server-api"))
26+
implementation(project(":modelql-core"))
27+
implementation(project(":modelql-untyped"))
28+
implementation(project(":modelql-client"))
29+
2630
implementation(libs.ktor.client.websockets)
2731
implementation(libs.kotlin.stdlib.common)
2832
implementation(libs.kotlin.logging)
2933
implementation(libs.kotlin.coroutines.core)
34+
implementation(libs.kotlin.serialization.json)
3035

3136
// implementation("io.ktor:ktor-client-core:$ktorVersion")
3237
// implementation("io.ktor:ktor-client-cio:$ktorVersion")
@@ -50,10 +55,12 @@ kotlin {
5055
val jvmTest by getting {
5156
dependencies {
5257
implementation(kotlin("test"))
53-
implementation(kotlin("test-junit"))
5458

55-
implementation(project(":model-server"))
5659
implementation(project(":authorization"))
60+
// implementation(project(":model-client"))
61+
implementation(project(":model-server"))
62+
implementation(project(":model-server-lib"))
63+
5764
implementation(libs.ktor.server.core)
5865
implementation(libs.ktor.server.cors)
5966
implementation(libs.ktor.server.netty)

light-model-client/src/commonMain/kotlin/org/modelix/client/light/LightModelClient.kt

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,52 @@
11
package org.modelix.client.light
22

3-
import io.ktor.client.*
4-
import io.ktor.client.engine.*
5-
import io.ktor.client.plugins.websocket.*
3+
import io.ktor.client.HttpClient
4+
import io.ktor.client.engine.HttpClientEngine
5+
import io.ktor.client.engine.HttpClientEngineFactory
6+
import io.ktor.client.plugins.websocket.WebSockets
67
import kotlinx.coroutines.delay
7-
import org.modelix.model.api.*
8-
import org.modelix.model.area.*
9-
import org.modelix.model.server.api.*
8+
import org.modelix.model.api.ConceptReference
9+
import org.modelix.model.api.IBranch
10+
import org.modelix.model.api.IConcept
11+
import org.modelix.model.api.IConceptReference
12+
import org.modelix.model.api.INode
13+
import org.modelix.model.api.INodeEx
14+
import org.modelix.model.api.INodeReference
15+
import org.modelix.model.api.INodeReferenceSerializer
16+
import org.modelix.model.api.INodeReferenceSerializerEx
17+
import org.modelix.model.api.NodeReferenceById
18+
import org.modelix.model.api.SerializedNodeReference
19+
import org.modelix.model.api.getAncestors
20+
import org.modelix.model.api.resolve
21+
import org.modelix.model.area.IArea
22+
import org.modelix.model.area.IAreaChangeEvent
23+
import org.modelix.model.area.IAreaChangeList
24+
import org.modelix.model.area.IAreaListener
25+
import org.modelix.model.area.IAreaReference
26+
import org.modelix.model.server.api.AddNewChildNodeOpData
27+
import org.modelix.model.server.api.ChangeSetId
28+
import org.modelix.model.server.api.DeleteNodeOpData
29+
import org.modelix.model.server.api.ExceptionData
30+
import org.modelix.model.server.api.MessageFromClient
31+
import org.modelix.model.server.api.MessageFromServer
32+
import org.modelix.model.server.api.ModelQuery
33+
import org.modelix.model.server.api.MoveNodeOpData
34+
import org.modelix.model.server.api.NodeData
35+
import org.modelix.model.server.api.NodeId
36+
import org.modelix.model.server.api.NodeUpdateData
37+
import org.modelix.model.server.api.OperationData
38+
import org.modelix.model.server.api.QueryRootNode
39+
import org.modelix.model.server.api.SetPropertyOpData
40+
import org.modelix.model.server.api.SetReferenceOpData
41+
import org.modelix.model.server.api.VersionData
42+
import org.modelix.model.server.api.merge
43+
import org.modelix.model.server.api.replaceChildren
44+
import org.modelix.model.server.api.replaceContainment
45+
import org.modelix.model.server.api.replaceId
46+
import org.modelix.model.server.api.replaceReferences
47+
import org.modelix.modelql.client.ModelQLClient
48+
import org.modelix.modelql.core.IQueryExecutor
49+
import org.modelix.modelql.untyped.ISupportsModelQL
1050
import kotlin.jvm.JvmStatic
1151
import kotlin.time.Duration
1252
import kotlin.time.Duration.Companion.milliseconds
@@ -18,7 +58,8 @@ class LightModelClient internal constructor(
1858
val connection: IConnection,
1959
private val transactionManager: ITransactionManager,
2060
val autoFilterNonLoadedNodes: Boolean,
21-
val debugName: String = ""
61+
val debugName: String = "",
62+
val modelQLClient: ModelQLClient? = null
2263
) {
2364

2465
private val nodes: MutableMap<NodeId, NodeData> = HashMap()
@@ -324,7 +365,7 @@ class LightModelClient internal constructor(
324365
}
325366
}
326367

327-
inner class NodeAdapter(var nodeId: NodeId) : INodeEx {
368+
inner class NodeAdapter(var nodeId: NodeId) : INodeEx, ISupportsModelQL {
328369
fun getData() = requiresRead { getNodeData(nodeId) }
329370

330371
override fun usesRoleIds(): Boolean = usesRoleIds
@@ -562,6 +603,11 @@ class LightModelClient internal constructor(
562603
override fun toString(): String {
563604
return nodeId
564605
}
606+
607+
override fun createQueryExecutor(): IQueryExecutor<INode> {
608+
val client = modelQLClient ?: throw UnsupportedOperationException("Connection doesn't support ModelQL: $connection")
609+
return client.getNode(SerializedNodeReference(nodeId))
610+
}
565611
}
566612

567613
inner class Area : IArea {
@@ -732,6 +778,7 @@ abstract class LightModelClientBuilder {
732778
private var debugName: String = ""
733779
private var transactionManager: ITransactionManager = ReadWriteLockTransactionManager()
734780
private var autoFilterNonLoadedNodes: Boolean = false
781+
private var modelQLClient: ModelQLClient? = null
735782

736783
protected abstract fun getDefaultEngineFactory(): HttpClientEngineFactory<*>
737784

@@ -749,7 +796,8 @@ abstract class LightModelClientBuilder {
749796
),
750797
transactionManager,
751798
autoFilterNonLoadedNodes = autoFilterNonLoadedNodes,
752-
debugName = debugName
799+
debugName = debugName,
800+
modelQLClient = modelQLClient
753801
)
754802
}
755803
fun autoFilterNonLoadedNodes(value: Boolean = true): LightModelClientBuilder {
@@ -795,6 +843,10 @@ abstract class LightModelClientBuilder {
795843
this.httpEngineFactory = httpEngineFactory
796844
return this
797845
}
846+
fun modelQLClient(c: ModelQLClient): LightModelClientBuilder {
847+
this.modelQLClient = c
848+
return this
849+
}
798850
}
799851

800852
class LightClientNodeReference(val nodeId: NodeId) : INodeReference {

light-model-client/src/commonMain/kotlin/org/modelix/client/light/ServerSideException.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,3 @@
1-
/*
2-
* Licensed under the Apache License, Version 2.0 (the "License");
3-
* you may not use this file except in compliance with the License.
4-
* You may obtain a copy of the License at
5-
*
6-
* http://www.apache.org/licenses/LICENSE-2.0
7-
*
8-
* Unless required by applicable law or agreed to in writing, software
9-
* distributed under the License is distributed on an "AS IS" BASIS,
10-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11-
* See the License for the specific language governing permissions and
12-
* limitations under the License.
13-
*/
141
/*
152
* Licensed under the Apache License, Version 2.0 (the "License");
163
* you may not use this file except in compliance with the License.

light-model-client/src/commonMain/kotlin/org/modelix/client/light/WebsocketConnection.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,22 @@
1616

1717
package org.modelix.client.light
1818

19-
import io.ktor.client.*
20-
import io.ktor.client.plugins.websocket.*
21-
import io.ktor.websocket.*
19+
import io.ktor.client.HttpClient
20+
import io.ktor.client.plugins.websocket.webSocket
21+
import io.ktor.websocket.CloseReason
22+
import io.ktor.websocket.Frame
23+
import io.ktor.websocket.WebSocketSession
24+
import io.ktor.websocket.close
25+
import io.ktor.websocket.readText
26+
import io.ktor.websocket.send
2227
import kotlinx.coroutines.CoroutineScope
2328
import kotlinx.coroutines.Dispatchers
24-
import kotlinx.coroutines.GlobalScope
25-
import kotlinx.coroutines.cancel
2629
import kotlinx.coroutines.channels.Channel
2730
import kotlinx.coroutines.channels.ClosedReceiveChannelException
2831
import kotlinx.coroutines.launch
2932
import org.modelix.model.server.api.MessageFromClient
3033
import org.modelix.model.server.api.MessageFromServer
34+
import org.modelix.modelql.client.ModelQLClient
3135

3236
class WebsocketConnection(val httpClient: HttpClient, val url: String) : LightModelClient.IConnection {
3337
val coroutineScope = CoroutineScope(Dispatchers.Default)
@@ -73,5 +77,4 @@ class WebsocketConnection(val httpClient: HttpClient, val url: String) : LightMo
7377
}
7478
}
7579
}
76-
7780
}

model-api-gen-gradle-test/build.gradle.kts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,39 @@ val mpsDir = buildDir.resolve("mps")
3838

3939
val modelixCoreVersion: String = projectDir.resolve("../version.txt").readText()
4040

41+
val kotlinGenDir = buildDir.resolve("metamodel/kotlin_gen")
42+
4143
dependencies {
4244
mps("com.jetbrains:mps:2021.1.4")
4345
implementation("org.modelix:model-api-gen-runtime:$modelixCoreVersion")
46+
implementation("org.modelix:modelql-typed:$modelixCoreVersion")
47+
implementation("org.modelix:modelql-untyped:$modelixCoreVersion")
48+
49+
testImplementation(kotlin("test-common"))
50+
testImplementation(kotlin("test-annotations-common"))
4451
testImplementation(kotlin("test"))
52+
testImplementation(kotlin("reflect"))
53+
4554
testImplementation("org.modelix:model-api:$modelixCoreVersion")
4655
testImplementation("org.modelix:model-client:$modelixCoreVersion")
47-
testImplementation(files("$buildDir/metamodel/kotlin_gen") {
56+
testImplementation("org.modelix:model-server-lib:$modelixCoreVersion")
57+
testImplementation("org.modelix:modelql-client:$modelixCoreVersion")
58+
59+
testImplementation(libs.ktor.server.core)
60+
testImplementation(libs.ktor.server.cors)
61+
testImplementation(libs.ktor.server.netty)
62+
testImplementation(libs.ktor.server.html.builder)
63+
testImplementation(libs.ktor.server.auth)
64+
testImplementation(libs.ktor.server.auth.jwt)
65+
testImplementation(libs.ktor.server.status.pages)
66+
testImplementation(libs.ktor.server.forwarded.header)
67+
testImplementation(libs.ktor.server.websockets)
68+
testImplementation(libs.ktor.server.test.host)
69+
testImplementation(libs.logback.classic)
70+
71+
testImplementation(files(kotlinGenDir) {
4872
builtBy("generateMetaModelSources")
4973
})
50-
testImplementation(kotlin("reflect"))
5174
}
5275

5376
tasks.test {
@@ -59,7 +82,6 @@ val resolveMps by tasks.registering(Sync::class) {
5982
into(mpsDir)
6083
}
6184

62-
val kotlinGenDir = buildDir.resolve("metamodel/kotlin_gen")
6385
sourceSets["main"].kotlin {
6486
srcDir(kotlinGenDir)
6587
}
@@ -80,6 +102,7 @@ metamodel {
80102
typedNode.prefix = ""
81103
typedNodeImpl.suffix = "Impl"
82104
}
105+
registrationHelperName = "org.modelix.apigen.test.ApigenTestLanguages"
83106
}
84107

85108
node {

model-api-gen-gradle-test/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)