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