fun checkIndexFields()

in dnq-transient-store/src/main/kotlin/com/jetbrains/teamsys/dnq/database/ConstraintsUtil.kt [467:503]


    fun checkIndexFields(
            tracker: TransientChangesTracker,
            modelMetaData: ModelMetaData
    ): Set<DataIntegrityViolationException> {

        return tracker.changedEntities
                .asSequence()
                .filter { !it.isRemoved }
                .mapNotNull { changedEntity ->
                    modelMetaData.getEntityMetaData(changedEntity.type)
                            ?.let { entityMetaData -> changedEntity to entityMetaData }
                }
                .flatMap { (changedEntity, entityMetaData) ->
                    val changedProperties = tracker.getChangedProperties(changedEntity)

                    entityMetaData.indexes
                            .asSequence()
                            .flatMap { index -> index.fields.asSequence() }
                            .mapNotNull { indexField ->
                                if (indexField.isProperty) {
                                    if (changedEntity.isNew || changedProperties != null && changedProperties.isNotEmpty()) {
                                        checkProperty(changedEntity, changedProperties, entityMetaData, indexField.name)
                                    } else {
                                        null
                                    }
                                } else {
                                    // link
                                    if (!checkCardinality(changedEntity, entityMetaData.getAssociationEndMetaData(indexField.name))) {
                                        CardinalityViolationException("Association [${indexField.name}] cannot be empty, because it's part of unique constraint", changedEntity, indexField.name)
                                    } else {
                                        null
                                    }
                                }
                            }
                }
                .toCollection(HashSetDecorator())
    }