@@ -15,15 +15,16 @@ import com.vaticle.typedb.client.api.connection.TypeDBTransaction
1515import com.vaticle.typedb.client.api.connection.TypeDBTransaction.Type.READ
1616import com.vaticle.typedb.client.api.logic.Explanation
1717import com.vaticle.typedb.client.common.exception.TypeDBClientException
18- import com.vaticle.typedb.studio.data.VertexEncoding.*
1918import com.vaticle.typedb.studio.data.EdgeDirection.*
19+ import com.vaticle.typedb.studio.data.EdgeEncoding.*
20+ import com.vaticle.typedb.studio.data.VertexEncoding.*
2021import com.vaticle.typeql.lang.TypeQL
2122import com.vaticle.typeql.lang.TypeQL.match
22- import java.lang.IllegalArgumentException
23- import java.lang.IllegalStateException
23+ import com.vaticle.typeql.lang.query.TypeQLQuery
2424import java.util.concurrent.CompletableFuture
2525import java.util.concurrent.ConcurrentHashMap
2626import java.util.concurrent.atomic.AtomicInteger
27+ import java.util.stream.Collectors
2728import java.util.stream.Stream
2829
2930class DB (val client : DBClient , private val dbName : String ) {
@@ -50,14 +51,14 @@ class DB(val client: DBClient, private val dbName: String) {
5051 CompletableFuture .allOf(* tasks.toTypedArray()).join()
5152 }
5253
54+ // TODO: The complexity of this function is too high - we should create some kind of ConceptMapLoader class
5355 private fun loadConceptMapAsync (conceptMap : ConceptMap , explanationID : Int? = null): CompletableFuture <Void > {
5456 val tasks: MutableList <CompletableFuture <Unit >> = mutableListOf ()
5557 conceptMap.map().entries.parallelStream().forEach { (varName: String , concept: Concept ) ->
5658 if (concept.isThing) {
5759 val thing = concept.asThing()
5860 val vertexID: Int = vertexGenerator.things.computeIfAbsent(thing.iid) {
5961 val thingVertex: VertexData = vertexGenerator.generateVertex(thing)
60- // println("Added a thing! $thingVertex")
6162 responseStream.putVertex(thingVertex)
6263 try {
6364 if (thing.isInferred) {
@@ -75,15 +76,27 @@ class DB(val client: DBClient, private val dbName: String) {
7576 println (e.message)
7677 }
7778
79+ thing.type.let { type ->
80+ val typeNodeID = vertexGenerator.types[type.label.name()]
81+ if (typeNodeID != null ) {
82+ responseStream.putEdge(EdgeData (id = vertexGenerator.nextID(), source = thingVertex.id,
83+ target = typeNodeID, encoding = ISA , label = " isa" ))
84+ } else {
85+ incompleteTypeEdges.getOrPut(type.label.name()) { mutableListOf () }
86+ .add(IncompleteEdgeData (id = vertexGenerator.nextID(), vertexID = thingVertex.id,
87+ direction = OUTGOING , encoding = ISA , label = " isa" ))
88+ }
89+ }
90+
7891 tasks + = LoadOwnedAttributesTask (thing, tx!! , thingVertex, vertexGenerator, responseStream, incompleteThingEdges).supplyAsync()
7992 if (thing.isRelation) {
8093 tasks + = LoadRoleplayersTask (thing.asRelation().asRemote(tx), thingVertex, vertexGenerator, responseStream).supplyAsync()
8194 }
8295
8396 incompleteThingEdges.remove(thing.iid)?.forEach {
8497 val edgeData = when (it.direction) {
85- INCOMING -> EdgeData (it.id, source = thingVertex.id, target = it.vertexID, it.label, it.inferred)
86- OUTGOING -> EdgeData (it.id, source = it.vertexID, target = thingVertex.id, it.label, it.inferred)
98+ INCOMING -> EdgeData (it.id, source = thingVertex.id, target = it.vertexID, it.encoding, it. label, it.inferred)
99+ OUTGOING -> EdgeData (it.id, source = it.vertexID, target = thingVertex.id, it.encoding, it. label, it.inferred)
87100 }
88101 responseStream.putEdge(edgeData)
89102 }
@@ -106,8 +119,8 @@ class DB(val client: DBClient, private val dbName: String) {
106119
107120 incompleteTypeEdges.remove(thingType.label.scopedName())?.forEach {
108121 val edgeData = when (it.direction) {
109- INCOMING -> EdgeData (it.id, source = typeVertex.id, target = it.vertexID, it.label, it.inferred)
110- OUTGOING -> EdgeData (it.id, source = it.vertexID, target = typeVertex.id, it.label, it.inferred)
122+ INCOMING -> EdgeData (it.id, source = typeVertex.id, target = it.vertexID, it.encoding, it. label, it.inferred)
123+ OUTGOING -> EdgeData (it.id, source = it.vertexID, target = typeVertex.id, it.encoding, it. label, it.inferred)
111124 }
112125 responseStream.putEdge(edgeData)
113126 }
@@ -136,6 +149,7 @@ class DB(val client: DBClient, private val dbName: String) {
136149 vertexGenerator = VertexGenerator ()
137150 CompletableFuture .supplyAsync {
138151 try {
152+ // TypeQL.parseQueries<TypeQLQuery>(query).collect(Collectors.toList())
139153 loadAnswerStream(tx!! .query().match(query))
140154 println (" Completed query: $query " )
141155 responseStream.completed = true
@@ -186,10 +200,6 @@ class DB(val client: DBClient, private val dbName: String) {
186200 }
187201 return responseStream
188202 }
189-
190- fun close () {
191- client.close()
192- }
193203}
194204
195205class VertexGenerator (val things : ConcurrentHashMap <String , Int > = ConcurrentHashMap (),
@@ -267,7 +277,7 @@ private class LoadRoleplayersTask(private val relation: Relation.Remote, vertex:
267277 return @computeIfAbsent vertex.id
268278 }
269279 responseStream.putEdge(EdgeData (id = vertexGenerator.nextID(), source = vertex.id, target = rolePlayerNodeID,
270- label = rolePlayers.key.label.name(), inferred = relation.isInferred))
280+ encoding = ROLEPLAYER , label = rolePlayers.key.label.name(), inferred = relation.isInferred))
271281 }
272282 }
273283 }
@@ -287,11 +297,11 @@ private class LoadOwnedAttributesTask(private val thing: Thing, private val tx:
287297 val attributeNodeID = vertexGenerator.things[attribute.iid]
288298 if (attributeNodeID != null ) {
289299 responseStream.putEdge(EdgeData (vertexGenerator.nextID(), source = vertex.id, target = attributeNodeID,
290- label = " has" , inferred = isEdgeInferred))
300+ encoding = HAS , label = " has" , inferred = isEdgeInferred))
291301 } else {
292302 incompleteEdges.getOrPut(attribute.iid) { mutableListOf () }
293303 .add(IncompleteEdgeData (vertexGenerator.nextID(), vertexID = vertex.id, direction = OUTGOING ,
294- label = " has" , inferred = isEdgeInferred))
304+ encoding = HAS , label = " has" , inferred = isEdgeInferred))
295305 }
296306 }
297307 }
@@ -306,10 +316,12 @@ private class LoadPlayableRolesTask(private val thingType: ThingType.Remote, ver
306316 thingType.plays.parallel().forEach { roleType ->
307317 val relationTypeNodeID = vertexGenerator.types[roleType.label.scope().get()]
308318 if (relationTypeNodeID != null ) {
309- responseStream.putEdge(EdgeData (vertexGenerator.nextID(), source = relationTypeNodeID, target = vertex.id, label = roleType.label.name()))
319+ responseStream.putEdge(EdgeData (vertexGenerator.nextID(), source = relationTypeNodeID,
320+ target = vertex.id, encoding = PLAYS , label = roleType.label.name()))
310321 } else {
311322 incompleteEdges.getOrPut(roleType.label.scope().get()) { mutableListOf () }
312- .add(IncompleteEdgeData (vertexGenerator.nextID(), vertexID = vertex.id, direction = INCOMING , label = roleType.label.name()))
323+ .add(IncompleteEdgeData (vertexGenerator.nextID(), vertexID = vertex.id, direction = INCOMING ,
324+ encoding = PLAYS , label = roleType.label.name()))
313325 }
314326 }
315327 }
@@ -324,10 +336,12 @@ private class LoadOwnedAttributeTypesTask(private val thingType: ThingType.Remot
324336 thingType.owns.parallel().forEach { attributeType ->
325337 val attributeTypeNodeID = vertexGenerator.types[attributeType.label.name()]
326338 if (attributeTypeNodeID != null ) {
327- responseStream.putEdge(EdgeData (vertexGenerator.nextID(), source = vertex.id, target = attributeTypeNodeID, label = " owns" ))
339+ responseStream.putEdge(EdgeData (vertexGenerator.nextID(), source = vertex.id,
340+ target = attributeTypeNodeID, encoding = OWNS , label = " owns" ))
328341 } else {
329342 incompleteEdges.getOrPut(attributeType.label.name()) { mutableListOf () }
330- .add(IncompleteEdgeData (vertexGenerator.nextID(), vertexID = vertex.id, direction = OUTGOING , label = " owns" ))
343+ .add(IncompleteEdgeData (vertexGenerator.nextID(), vertexID = vertex.id, direction = OUTGOING ,
344+ encoding = OWNS , label = " owns" ))
331345 }
332346 }
333347 }
@@ -342,10 +356,12 @@ private class LoadSupertypeTask(private val thingType: ThingType.Remote, vertex:
342356 thingType.supertype?.let { supertype ->
343357 val supertypeNodeID = vertexGenerator.types[supertype.label.name()]
344358 if (supertypeNodeID != null ) {
345- responseStream.putEdge(EdgeData (vertexGenerator.nextID(), source = vertex.id, target = supertypeNodeID, label = " sub" ))
359+ responseStream.putEdge(EdgeData (vertexGenerator.nextID(), source = vertex.id, target = supertypeNodeID,
360+ encoding = SUB , label = " sub" ))
346361 } else {
347362 incompleteEdges.getOrPut(supertype.label.name()) { mutableListOf () }
348- .add(IncompleteEdgeData (vertexGenerator.nextID(), vertexID = vertex.id, direction = OUTGOING , label = " sub" ))
363+ .add(IncompleteEdgeData (vertexGenerator.nextID(), vertexID = vertex.id, direction = OUTGOING ,
364+ encoding = SUB , label = " sub" ))
349365 }
350366 }
351367 }
0 commit comments