override fun getValue()

in dnq/src/main/kotlin/kotlinx/dnq/link/XdManyToManyLink.kt [52:85]


    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).createManyToMany(property.dbName, oppositeField.oppositeDbName, entity.reattach(session))
            }

            override fun remove(entity: T) {
                val session = thisRef.threadSessionOrThrow
                thisRef.reattach(session).deleteLink(property.dbName, entity.reattach(session))
                entity.reattach(session).deleteLink(oppositeField.oppositeDbName, thisRef.reattach(session))
            }

            override fun clear() {
                thisRef.reattach().clearManyToMany(property.dbName, oppositeField.oppositeDbName)
            }

        }
    }