Skip to content

Commit d925535

Browse files
committed
chore! EXPOSED-655 Join column default fields defaultValueFun, defaultValueInDb, isDatabaseGenerated into one field
1 parent 7e5d03f commit d925535

File tree

17 files changed

+297
-87
lines changed

17 files changed

+297
-87
lines changed

documentation-website/Writerside/topics/Breaking-Changes.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@
2424
-- Starting from version 0.57.0
2525
INSERT INTO TEST DEFAULT VALUES
2626
```
27+
28+
* The fields `defaultValueFun`, `dbDefaultValue`, and `isDatabaseGenerated` have been consolidated into a single field,
29+
`default`, of type `ColumnDefault`. The previous setup with the three separate fields often led to inconsistencies
30+
and confusion regarding their various combinations.
31+
32+
Here’s how you can migrate the common combinations:
33+
- `defaultValueFun != null && dbDefaultValue != null` (knows as `default()`) becomes `DatabaseColumnDefaultExpressionWithValue`
34+
- `dbDefaultValue != null` (knows as `defaultExpression()`) becomes `DatabaseColumnDefaultExpression`
35+
- `defaultValueFun != null` (knows as `clientDefault()`) becomes `ClientColumnDefaultValue`
36+
- `isDatabaseGenerated == true` (knows as `databaseGenerated`) becomes `DatabaseGeneratedColumnDefault`
37+
38+
If it is anticipated that a column will be transformed using `transform()`,
39+
the default value for that column should implement `TransformableColumnDefault`. However, not all defaults need to
40+
implement this interface; it is primarily necessary for columns with in-memory Kotlin values.
2741

2842
## 0.56.0
2943
* If the `distinct` parameter of `groupConcat()` is set to `true`, when using Oracle or SQL Server, this will now fail early with an

exposed-core/api/exposed-core.api

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,15 @@ public final class org/jetbrains/exposed/sql/CheckConstraint : org/jetbrains/exp
413413
public final class org/jetbrains/exposed/sql/CheckConstraint$Companion {
414414
}
415415

416+
public abstract interface class org/jetbrains/exposed/sql/ClientColumnDefault : org/jetbrains/exposed/sql/ColumnDefault {
417+
}
418+
419+
public final class org/jetbrains/exposed/sql/ClientColumnDefaultValue : org/jetbrains/exposed/sql/ClientColumnDefault, org/jetbrains/exposed/sql/ColumnDefaultValue, org/jetbrains/exposed/sql/TransformableColumnDefault {
420+
public fun <init> (Lkotlin/jvm/functions/Function0;)V
421+
public fun getValue ()Lkotlin/jvm/functions/Function0;
422+
public fun transform (Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/ColumnDefault;
423+
}
424+
416425
public final class org/jetbrains/exposed/sql/Coalesce : org/jetbrains/exposed/sql/Function {
417426
public fun <init> (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;[Lorg/jetbrains/exposed/sql/Expression;)V
418427
public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
@@ -423,32 +432,54 @@ public final class org/jetbrains/exposed/sql/Column : org/jetbrains/exposed/sql/
423432
public synthetic fun compareTo (Ljava/lang/Object;)I
424433
public fun compareTo (Lorg/jetbrains/exposed/sql/Column;)I
425434
public fun createStatement ()Ljava/util/List;
426-
public final fun defaultValueInDb ()Lorg/jetbrains/exposed/sql/Expression;
427435
public final fun descriptionDdl (Z)Ljava/lang/String;
428436
public static synthetic fun descriptionDdl$default (Lorg/jetbrains/exposed/sql/Column;ZILjava/lang/Object;)Ljava/lang/String;
429437
public fun dropStatement ()Ljava/util/List;
430438
public fun equals (Ljava/lang/Object;)Z
431439
public fun getColumnType ()Lorg/jetbrains/exposed/sql/IColumnType;
432440
public fun getDdl ()Ljava/util/List;
433-
public final fun getDefaultValueFun ()Lkotlin/jvm/functions/Function0;
441+
public final fun getDefault ()Lorg/jetbrains/exposed/sql/ColumnDefault;
434442
public final fun getForeignKey ()Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;
435443
public final fun getName ()Ljava/lang/String;
436444
public final fun getReferee ()Lorg/jetbrains/exposed/sql/Column;
437445
public final fun getTable ()Lorg/jetbrains/exposed/sql/Table;
438446
public fun hashCode ()I
439-
public final fun isDatabaseGenerated ()Z
440447
public fun modifyStatement ()Ljava/util/List;
441448
public final fun modifyStatements (Lorg/jetbrains/exposed/sql/ColumnDiff;)Ljava/util/List;
442449
public final fun nameInDatabaseCase ()Ljava/lang/String;
443450
public final fun nameUnquoted ()Ljava/lang/String;
444451
public final fun referee ()Lorg/jetbrains/exposed/sql/Column;
445-
public final fun setDefaultValueFun (Lkotlin/jvm/functions/Function0;)V
452+
public final fun setDefault (Lorg/jetbrains/exposed/sql/ColumnDefault;)V
446453
public final fun setForeignKey (Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;)V
447454
public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
448455
public fun toString ()Ljava/lang/String;
449456
public final fun withColumnType (Lorg/jetbrains/exposed/sql/IColumnType;)Lorg/jetbrains/exposed/sql/Column;
450457
}
451458

459+
public abstract interface class org/jetbrains/exposed/sql/ColumnDefault {
460+
}
461+
462+
public abstract interface class org/jetbrains/exposed/sql/ColumnDefaultExpression : org/jetbrains/exposed/sql/ColumnDefault {
463+
public abstract fun getExpression ()Lorg/jetbrains/exposed/sql/Expression;
464+
}
465+
466+
public final class org/jetbrains/exposed/sql/ColumnDefaultKt {
467+
public static final fun clientDefaultValue (Lorg/jetbrains/exposed/sql/Column;)Ljava/lang/Object;
468+
public static final fun clientDefaultValueOrExpression (Lorg/jetbrains/exposed/sql/Column;)Ljava/lang/Object;
469+
public static final fun databaseDefaultExpression (Lorg/jetbrains/exposed/sql/Column;)Lorg/jetbrains/exposed/sql/Expression;
470+
public static final fun defaultValue (Lorg/jetbrains/exposed/sql/Column;)Ljava/lang/Object;
471+
public static final fun hasClientDefault (Lorg/jetbrains/exposed/sql/Column;)Z
472+
public static final fun hasClientDefaultValue (Lorg/jetbrains/exposed/sql/Column;)Z
473+
public static final fun hasDatabaseDefault (Lorg/jetbrains/exposed/sql/Column;)Z
474+
public static final fun hasDefaultValue (Lorg/jetbrains/exposed/sql/Column;)Z
475+
public static final fun isDefaultable (Lorg/jetbrains/exposed/sql/Column;)Z
476+
public static final fun transform (Lorg/jetbrains/exposed/sql/ColumnDefault;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/ColumnDefault;
477+
}
478+
479+
public abstract interface class org/jetbrains/exposed/sql/ColumnDefaultValue : org/jetbrains/exposed/sql/ColumnDefault {
480+
public abstract fun getValue ()Lkotlin/jvm/functions/Function0;
481+
}
482+
452483
public final class org/jetbrains/exposed/sql/ColumnDiff {
453484
public static final field Companion Lorg/jetbrains/exposed/sql/ColumnDiff$Companion;
454485
public fun <init> (ZZZZZ)V
@@ -688,6 +719,21 @@ public final class org/jetbrains/exposed/sql/Database$Companion {
688719
public final fun registerJdbcDriver (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
689720
}
690721

722+
public abstract interface class org/jetbrains/exposed/sql/DatabaseColumnDefault : org/jetbrains/exposed/sql/ColumnDefault {
723+
}
724+
725+
public final class org/jetbrains/exposed/sql/DatabaseColumnDefaultExpression : org/jetbrains/exposed/sql/ColumnDefaultExpression, org/jetbrains/exposed/sql/DatabaseColumnDefault {
726+
public fun <init> (Lorg/jetbrains/exposed/sql/Expression;)V
727+
public fun getExpression ()Lorg/jetbrains/exposed/sql/Expression;
728+
}
729+
730+
public final class org/jetbrains/exposed/sql/DatabaseColumnDefaultExpressionWithValue : org/jetbrains/exposed/sql/ColumnDefaultExpression, org/jetbrains/exposed/sql/ColumnDefaultValue, org/jetbrains/exposed/sql/DatabaseColumnDefault, org/jetbrains/exposed/sql/TransformableColumnDefault {
731+
public fun <init> (Lorg/jetbrains/exposed/sql/Expression;Lkotlin/jvm/functions/Function0;)V
732+
public fun getExpression ()Lorg/jetbrains/exposed/sql/Expression;
733+
public fun getValue ()Lkotlin/jvm/functions/Function0;
734+
public fun transform (Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/ColumnDefault;
735+
}
736+
691737
public final class org/jetbrains/exposed/sql/DatabaseConfig {
692738
public static final field Companion Lorg/jetbrains/exposed/sql/DatabaseConfig$Companion;
693739
public synthetic fun <init> (Lorg/jetbrains/exposed/sql/SqlLogger;ZLjava/lang/Integer;IIJJIJJZLjava/lang/Long;IZLorg/jetbrains/exposed/sql/vendors/DatabaseDialect;Lorg/jetbrains/exposed/sql/Schema;IZLkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -761,6 +807,10 @@ public final class org/jetbrains/exposed/sql/DatabaseConfig$Companion {
761807
public abstract interface class org/jetbrains/exposed/sql/DatabaseConnectionAutoRegistration : kotlin/jvm/functions/Function1 {
762808
}
763809

810+
public final class org/jetbrains/exposed/sql/DatabaseGeneratedColumnDefault : org/jetbrains/exposed/sql/DatabaseColumnDefault {
811+
public fun <init> ()V
812+
}
813+
764814
public final class org/jetbrains/exposed/sql/DatabaseKt {
765815
public static final fun getName (Lorg/jetbrains/exposed/sql/Database;)Ljava/lang/String;
766816
}
@@ -2712,6 +2762,10 @@ public class org/jetbrains/exposed/sql/Transaction : org/jetbrains/exposed/sql/U
27122762
public final class org/jetbrains/exposed/sql/Transaction$Companion {
27132763
}
27142764

2765+
public abstract interface class org/jetbrains/exposed/sql/TransformableColumnDefault : org/jetbrains/exposed/sql/ColumnDefault {
2766+
public abstract fun transform (Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/ColumnDefault;
2767+
}
2768+
27152769
public final class org/jetbrains/exposed/sql/Trim : org/jetbrains/exposed/sql/Function {
27162770
public fun <init> (Lorg/jetbrains/exposed/sql/Expression;)V
27172771
public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
@@ -3210,7 +3264,7 @@ public class org/jetbrains/exposed/sql/statements/InsertStatement : org/jetbrain
32103264
public final fun getResultedValues ()Ljava/util/List;
32113265
public final fun getTable ()Lorg/jetbrains/exposed/sql/Table;
32123266
protected fun isColumnValuePreferredFromResultSet (Lorg/jetbrains/exposed/sql/Column;Ljava/lang/Object;)Z
3213-
protected final fun isEntityIdClientSideGeneratedUUID (Lorg/jetbrains/exposed/sql/Column;)Z
3267+
protected final fun isEntityIdClientSideGeneratedUUID (Lorg/jetbrains/exposed/sql/Column;)Ljava/lang/Boolean;
32143268
public final fun isIgnore ()Z
32153269
public fun prepareSQL (Lorg/jetbrains/exposed/sql/Transaction;Z)Ljava/lang/String;
32163270
public fun prepared (Lorg/jetbrains/exposed/sql/Transaction;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;

exposed-core/src/main/kotlin/org/jetbrains/exposed/dao/id/IdTable.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ open class CompositeIdTable(name: String = "") : IdTable<CompositeID>(name) {
140140
}
141141
)
142142
return Column(this, "composite_id", EntityIDColumnType(placeholder)).apply {
143-
defaultValueFun = null
143+
default = null
144144
}
145145
}
146146

exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Alias.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ class Alias<out T : Table>(val delegate: T, val alias: String) : Table() {
1818
val tableNameWithAlias: String = "${delegate.tableName} $alias"
1919

2020
private fun <T> Column<T>.clone() = Column<T>(this@Alias, name, columnType).also {
21-
it.defaultValueFun = defaultValueFun
22-
it.dbDefaultValue = dbDefaultValue
23-
it.isDatabaseGenerated = isDatabaseGenerated
21+
it.default = default
2422
it.foreignKey = foreignKey
2523
it.extraDefinitions = extraDefinitions
2624
}

exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Column.kt

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,10 @@ class Column<T>(
2828
@Suppress("UNCHECKED_CAST")
2929
fun <S : T> referee(): Column<S>? = referee as? Column<S>
3030

31-
/** Returns the function that calculates the default value for this column. */
32-
var defaultValueFun: (() -> T)? = null
33-
internal var dbDefaultValue: Expression<T>? = null
34-
35-
/** Returns the default value for this column on the database-side. */
36-
fun defaultValueInDb() = dbDefaultValue
37-
38-
internal var isDatabaseGenerated: Boolean = false
39-
40-
/** Returns whether this column's value will be generated in the database. */
41-
fun isDatabaseGenerated() = isDatabaseGenerated
31+
/**
32+
* The default value for this column.
33+
*/
34+
var default: ColumnDefault<T>? = null
4235

4336
internal var extraDefinitions = mutableListOf<Any>()
4437

@@ -121,12 +114,13 @@ class Column<T>(
121114
else -> append(columnType.sqlType())
122115
}
123116

124-
val defaultValue = dbDefaultValue
125-
if (defaultValue != null) {
126-
val expressionSQL = currentDialect.dataTypeProvider.processForDefaultValue(defaultValue)
127-
if (!currentDialect.isAllowedAsColumnDefault(defaultValue)) {
117+
val defaultDatabaseValue = databaseDefaultExpression()
118+
119+
if (defaultDatabaseValue != null) {
120+
val expressionSQL = currentDialect.dataTypeProvider.processForDefaultValue(defaultDatabaseValue)
121+
if (!currentDialect.isAllowedAsColumnDefault(defaultDatabaseValue)) {
128122
val clientDefault = when {
129-
defaultValueFun != null && dbDefaultValue == null -> " Expression will be evaluated on the client."
123+
hasClientDefault() -> " Expression will be evaluated on the client."
130124
!columnType.nullable -> " Column will be created with NULL marker."
131125
else -> ""
132126
}
@@ -148,7 +142,7 @@ class Column<T>(
148142
append(extraDefinitions.joinToString(separator = " ", prefix = " ") { "$it" })
149143
}
150144

151-
if (columnType.nullable || (defaultValue != null && defaultValueFun == null && !currentDialect.isAllowedAsColumnDefault(defaultValue))) {
145+
if (columnType.nullable || (defaultDatabaseValue != null && !currentDialect.isAllowedAsColumnDefault(defaultDatabaseValue))) {
152146
append(" NULL")
153147
} else if (!isPKColumn || (currentDialect is SQLiteDialect && !isSQLiteAutoIncColumn)) {
154148
append(" NOT NULL")
@@ -163,14 +157,10 @@ class Column<T>(
163157
val newColumn: Column<R> = Column(table, name, columnType)
164158
newColumn.foreignKey = foreignKey
165159
@Suppress("UNCHECKED_CAST")
166-
newColumn.dbDefaultValue = dbDefaultValue as Expression<R>?
167-
newColumn.isDatabaseGenerated = isDatabaseGenerated
160+
newColumn.default = default as ColumnDefault<R>?
168161
newColumn.extraDefinitions = extraDefinitions
169162
body?.let { newColumn.it() }
170163

171-
if (defaultValueFun != null) {
172-
require(newColumn.defaultValueFun != null) { "defaultValueFun was lost on cloning the column" }
173-
}
174164
return newColumn
175165
}
176166

@@ -183,9 +173,7 @@ class Column<T>(
183173
columnType = columnType
184174
).also {
185175
it.foreignKey = this.foreignKey
186-
it.defaultValueFun = this.defaultValueFun
187-
it.dbDefaultValue = this.dbDefaultValue
188-
it.isDatabaseGenerated = this.isDatabaseGenerated
176+
it.default = this.default
189177
it.extraDefinitions = this.extraDefinitions
190178
}
191179

0 commit comments

Comments
 (0)