in dnq/src/main/kotlin/kotlinx/dnq/link/XdOneToManyLink.kt [51:82]
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
entity.reattach(session).setManyToOne(oppositeField.oppositeDbName, property.dbName, thisRef.reattach(session))
}
override fun remove(entity: T) {
val session = thisRef.threadSessionOrThrow
thisRef.reattach(session).removeOneToMany(oppositeField.oppositeDbName, property.dbName, entity.reattach(session))
}
override fun clear() {
thisRef.reattach().clearOneToMany(oppositeField.oppositeDbName, property.dbName)
}
}
}