[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
This commit is contained in:
Daniil Ovchinnikov
2025-10-05 19:00:57 +00:00
committed by intellij-monorepo-bot
parent 95a38b49ef
commit 7b685a61be
@@ -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 <E : Entity> EntityType<E>.each(): SetQuery<E> = let { entityType ->
.intern("each", entityType)
}
/**
* Provides a match for every [EntityType].
*/
fun EntityType.Companion.each(): SetQuery<EntityType<*>> = let { entityType ->
@Suppress("UNCHECKED_CAST")
queryOf(entityType.eid)
.lookupAttribute(Entity.Type.attr as Attribute<EID>)
.mapNotNull { // entity type might not yet be registered
entity(it) as EntityType<*>?
}
.intern("eachEntityType", entityType)
}
/**
* Query<Maybe, Unit> can be seen as predicate.
* It yields Unit when it becomes true, and retracts it back when falsified.