diff --git a/squash-core/src/org/jetbrains/squash/definition/ColumnProperty.kt b/squash-core/src/org/jetbrains/squash/definition/ColumnProperty.kt index fb32d63..3ecd2c4 100644 --- a/squash-core/src/org/jetbrains/squash/definition/ColumnProperty.kt +++ b/squash-core/src/org/jetbrains/squash/definition/ColumnProperty.kt @@ -28,6 +28,8 @@ fun ReferenceColumn.nullable(): ReferenceColumn = addProperty(Nullabl */ fun > C.default(value: V): C = addProperty(DefaultValueProperty(value)) +fun > C.default(generate: () -> V?):C = addProperty(DefaultValueProperty(null, generate)) + object AutoIncrementProperty : ColumnProperty { override fun toString(): String = "++" } @@ -36,8 +38,20 @@ object NullableProperty : ColumnProperty { override fun toString(): String = "?" } -class DefaultValueProperty(val value: V) : ColumnProperty { - override fun toString(): String = "= $value" +class DefaultValueProperty(defaultValue: V?, private val generate:(() -> V)? = null) : ColumnProperty { + + val value:V? = defaultValue + get():V? { + return if (generate != null) { + val result = generate.invoke() + println("Generated Value 1: $result") + result ?: field + } else { + field + } + } + + override fun toString(): String = "= $value" } diff --git a/squash-core/src/org/jetbrains/squash/statements/Insert.kt b/squash-core/src/org/jetbrains/squash/statements/Insert.kt index db31f6b..1fad454 100644 --- a/squash-core/src/org/jetbrains/squash/statements/Insert.kt +++ b/squash-core/src/org/jetbrains/squash/statements/Insert.kt @@ -10,13 +10,22 @@ open class InsertValuesStatement(val table: T) : Statement { val values: MutableMap, Any?> = LinkedHashMap() operator fun set(column: Column<@Exact V>, value: S?) { + // Error if the column is being set more than once if (values.containsKey(column)) { error("$column is already initialized") } - if (column.properties.all { it !is NullableProperty } && value == null) { + + val finalValue = value ?: if (column.hasProperty>()) + column.propertyOrNull>()!!.value + else + null + + // Error if the column is not nullable and it is getting set to null + if (column.properties.none { it is NullableProperty } && finalValue == null) { error("Trying to set null to not nullable column $column") } - values[column] = value + + values[column] = finalValue } operator fun get(column: Column): Any? = values[column]