From 7b685a61beddbcea2c8ab68616da98d5fd7603ab Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Sun, 5 Oct 2025 18:26:06 +0200 Subject: [PATCH] [rhizome] add and use a query for entity types This fixes the following: ``` java.lang.IllegalStateException: entity does not exist for rhizomedb.EntityType at fleet.kernel.rete.QueriesKt$each$1$1.invoke(Queries.kt:114) at fleet.kernel.rete.QueriesKt$each$1$1.invoke(Queries.kt:112) at fleet.kernel.rete.QueriesKt$rawMap$2$1.invoke(Queries.kt:433) at fleet.kernel.rete.QueriesKt$rawMap$2$1.invoke(Queries.kt:432) at fleet.kernel.rete.QueriesKt.transform$lambda$1$0$0(Queries.kt:461) at fleet.kernel.rete.impl.LookupKt.lookupAttribute_bBVBO88$lambda$0$1(Lookup.kt:110) at fleet.kernel.rete.impl.ReteNetworkImplKt$subscriptionScope$1$1.collect(ReteNetworkImpl.kt:65) at fleet.kernel.rete.QueriesKt.transform$lambda$1$0(Queries.kt:461) at fleet.kernel.rete.impl.ReteNetworkImplKt$subscriptionScope$1$1.collect(ReteNetworkImpl.kt:65) at fleet.kernel.rete.impl.ReteNetworkImplKt.catching$lambda$0(ReteNetworkImpl.kt:456) at fleet.kernel.rete.impl.ReteNetworkImplKt$subscriptionScope$1$1.collect(ReteNetworkImpl.kt:65) at fleet.kernel.rete.impl.ReteNetworkImpl$queryScope$1.producer$lambda$0$0(ReteNetworkImpl.kt:280) at fleet.kernel.rete.impl.ReteNetworkImplKt$subscriptionScope$1$1.collect(ReteNetworkImpl.kt:65) at fleet.kernel.rete.impl.ReteNetworkImpl$queryScope$1.collect(ReteNetworkImpl.kt) at fleet.kernel.rete.impl.FlatMapKt.flatMap(FlatMap.kt:20) at fleet.kernel.rete.QueriesKt.flatMap$lambda$0$0(Queries.kt:183) at fleet.kernel.rete.impl.ReteNetworkImpl$queryScope$1.producer(ReteNetworkImpl.kt:290) at fleet.kernel.rete.impl.ObservableMatchKt.observable__emGRDg$lambda$0(ObservableMatch.kt:137) at fleet.kernel.rete.impl.ReteNetworkImpl.safeProducer(ReteNetworkImpl.kt:212) at fleet.kernel.rete.impl.ReteNetworkImpl$observeQuery$producer$1.invoke(ReteNetworkImpl.kt:320) at fleet.kernel.rete.impl.ReteNetworkImpl$observeQuery$producer$1.invoke(ReteNetworkImpl.kt:319) at com.jetbrains.rhizomedb.DbContextKt.asOf(DbContext.kt:135) at fleet.kernel.rete.impl.ReteNetworkImpl.observeQuery(ReteNetworkImpl.kt:319) at fleet.kernel.rete.impl.PosponedVarsKt.postponedVars$addTerminal(PosponedVars.kt:22) at fleet.kernel.rete.impl.PosponedVarsKt.access$postponedVars$addTerminal(PosponedVars.kt:1) at fleet.kernel.rete.impl.PosponedVarsKt$postponedVars$1.command(PosponedVars.kt:42) at fleet.kernel.rete.ReteKt$withRete$2$1$1$1$1$2$1$1.invokeSuspend(Rete.kt:119) at fleet.kernel.rete.ReteKt$withRete$2$1$1$1$1$2$1$1.invoke(Rete.kt) at fleet.kernel.rete.ReteKt$withRete$2$1$1$1$1$2$1$1.invoke(Rete.kt) at kotlinx.coroutines.selects.SelectImplementation$ClauseData.invokeBlock(Select.kt:846) at kotlinx.coroutines.selects.SelectImplementation.processResultAndInvokeBlockRecoveringException(Select.kt:729) at kotlinx.coroutines.selects.SelectImplementation.complete(Select.kt:722) at kotlinx.coroutines.selects.SelectImplementation.doSelectSuspend(Select.kt:456) at kotlinx.coroutines.selects.SelectImplementation.access$doSelectSuspend(Select.kt:251) at kotlinx.coroutines.selects.SelectImplementation$doSelectSuspend$1.invokeSuspend(Select.kt) ... 9 more ``` GitOrigin-RevId: ceb29353cc07d71281295a5b80a9d08da5a79d31 --- .../srcCommonMain/fleet/kernel/rete/Queries.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/fleet/kernel/srcCommonMain/fleet/kernel/rete/Queries.kt b/fleet/kernel/srcCommonMain/fleet/kernel/rete/Queries.kt index 3909a160d53d..59e4192a4fbc 100644 --- a/fleet/kernel/srcCommonMain/fleet/kernel/rete/Queries.kt +++ b/fleet/kernel/srcCommonMain/fleet/kernel/rete/Queries.kt @@ -1,10 +1,8 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package fleet.kernel.rete import com.jetbrains.rhizomedb.* import fleet.kernel.rete.impl.* -import fleet.kernel.rete.impl.DummyQueryScope -import fleet.kernel.rete.impl.distinct import fleet.util.async.firstNotNull import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.first @@ -116,6 +114,19 @@ fun EntityType.each(): SetQuery = let { entityType -> .intern("each", entityType) } +/** + * Provides a match for every [EntityType]. + */ +fun EntityType.Companion.each(): SetQuery> = let { entityType -> + @Suppress("UNCHECKED_CAST") + queryOf(entityType.eid) + .lookupAttribute(Entity.Type.attr as Attribute) + .mapNotNull { // entity type might not yet be registered + entity(it) as EntityType<*>? + } + .intern("eachEntityType", entityType) +} + /** * Query can be seen as predicate. * It yields Unit when it becomes true, and retracts it back when falsified.