override fun getValue()

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)
            }

        }
    }