in dnq/src/main/kotlin/kotlinx/dnq/link/XdParentToManyChildrenLink.kt [49:78]
override fun getValue(thisRef: R, property: KProperty<*>): XdMutableQuery<T> {
return object : XdMutableQuery<T>(oppositeEntityType) {
override val entityIterable: Iterable<Entity>
get() = try {
val queryEngine = oppositeEntityType.entityStore.queryEngine
val oppositeType = oppositeEntityType.entityType
if (thisRef.isReadOnly || queryEngine.modelMetaData?.getEntityMetaData(oppositeType)?.hasSubTypes() == true) {
thisRef.reattach().getLinks(property.dbName)
} else {
TreeKeepingEntityIterable(null, oppositeType, LinkEqual(oppositeField.oppositeDbName, thisRef.reattach()), queryEngine)
}
} catch (_: UnsupportedOperationException) {
// to support weird FakeTransientEntity
thisRef.reattach().getLinks(property.dbName)
}
override fun add(entity: T) {
val session = thisRef.threadSessionOrThrow
thisRef.reattach(session).addChild(property.dbName, oppositeField.oppositeDbName, entity.reattach(session))
}
override fun remove(entity: T) {
entity.reattach().removeFromParent(property.dbName, oppositeField.oppositeDbName)
}
override fun clear() {
thisRef.reattach().clearChildren(property.dbName)
}
}
}