diff --git a/build.gradle.kts b/build.gradle.kts index 24efc9e..fd779ca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,5 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinVersion +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.configureAllCompilersOptions import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineAllMultiplatformTargets import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineXomrkGiteaMavenRepo import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.optInContracts @@ -18,7 +19,7 @@ buildscript { } group = "ru.landgrafhomyak.serdha" -version = "v0.1" +version = "v1.0" repositories { mavenCentral() @@ -31,9 +32,19 @@ xomrk { warningsAsErrors() optInContracts() setCompatibilityWithKotlin(KotlinVersion.KOTLIN_1_7) + configureAllCompilersOptions { freeCompilerArgs.add("-Xjvm-default=all") } jvmToolchain(8) defineAllMultiplatformTargets() + + + sourceSets { + commonMain { + dependencies { + compileOnly("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1") + } + } + } } publishing { diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt new file mode 100644 index 0000000..3e1e962 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.serdha.api.v0 + +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType + +public interface Expression, OwnerBuilderUserWrapper : Any> \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/CheckConstraint.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/CheckConstraint.kt new file mode 100644 index 0000000..12887c7 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/CheckConstraint.kt @@ -0,0 +1,10 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +import ru.landgrafhomyak.serdha.api.v0.Expression + +public interface CheckConstraint { + public val name: String + public val table: Table + public val constraint: Expression + public val affectedColumns: List> +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Column.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Column.kt new file mode 100644 index 0000000..6435ef2 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Column.kt @@ -0,0 +1,9 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface Column, TableUserWrapper : Any> /*: Expression*/ { + public val name: String + + public val type: DatabaseType + + public val table: Table +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ColumnType.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ColumnType.kt new file mode 100644 index 0000000..4767027 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ColumnType.kt @@ -0,0 +1,132 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +import kotlin.jvm.JvmStatic +import kotlinx.datetime.Instant +import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.LocalTime + +@Suppress("ClassName") +public abstract class ColumnType { + public abstract val typeName: String + + abstract override fun toString(): String + + public sealed class _StandardType : ColumnType() { + override fun toString(): String = "" + } + + public abstract class _VirtualType(public val wraps: ColumnType) { + override fun toString(): String = "" + } + + public object ROW_ID : _StandardType>() { + override val typeName: String get() = "ROW_ID" + } + + public object BOOLEAN : _StandardType() { + override val typeName: String get() = "BOOLEAN" + } + + public object INT_S8 : _StandardType() { + override val typeName: String get() = "INT_S8" + } + + public object INT_U8 : _StandardType() { + override val typeName: String get() = "INT_U8" + } + + public object INT_S16 : _StandardType() { + override val typeName: String get() = "INT_S16" + } + + public object INT_U16 : _StandardType() { + override val typeName: String get() = "INT_U16" + } + + public object INT_S32 : _StandardType() { + override val typeName: String get() = "INT_S32" + } + + public object INT_U32 : _StandardType() { + override val typeName: String get() = "INT_U32" + } + + public object INT_S64 : _StandardType() { + override val typeName: String get() = "INT_S64" + } + + public object INT_U64 : _StandardType() { + override val typeName: String get() = "INT_U64" + } + + public object LOCAL_DATE : _StandardType() { + override val typeName: String get() = "LOCAL_DATE" + } + + public object LOCAL_TIME : _StandardType() { + override val typeName: String get() = "LOCAL_TIME" + } + + public object LOCAL_DATETIME : _StandardType() { + override val typeName: String get() = "LOCAL_DATETIME" + } + + public object INSTANT : _StandardType() { + override val typeName: String get() = "INSTANT" + } + + public object FLOAT_32 : _StandardType() { + override val typeName: String get() = "FLOAT_32" + } + + public object FLOAT_64 : _StandardType() { + override val typeName: String get() = "FLOAT_64" + } + + public class STRING internal constructor( + private val _size: UInt + ) : _StandardType() { + override val typeName: String = if (this._size == 0u) "STRING" else "STRING(${this._size})" + + public val size: UInt? get() = if (this._size == 0u) null else this._size + } + + public class BYTE_ARRAY internal constructor( + private val _size: UInt + ) : _StandardType() { + override val typeName: String = if (this._size == 0u) "BYTE_ARRAY" else "BYTE_ARRAY(${this._size})" + + public val size: UInt? get() = if (this._size == 0u) null else this._size + } + + public companion object DSL { + @Suppress("RemoveRedundantQualifierName") + @JvmStatic + public val STRING: STRING = ColumnType.STRING(0u) + + @Suppress("RemoveRedundantQualifierName") + @JvmStatic + public fun STRING(size: UInt): STRING { + if (size == 0u) + throw IllegalArgumentException("Size of string can't be 0") + return ColumnType.STRING(size) + } + + @Suppress("RemoveRedundantQualifierName") + @JvmStatic + public val BYTE_ARRAY: BYTE_ARRAY = ColumnType.BYTE_ARRAY(0u) + + @Suppress("RemoveRedundantQualifierName") + @JvmStatic + public fun BYTE_ARRAY(size: UInt): BYTE_ARRAY { + if (size == 0u) + throw IllegalArgumentException("Size of byte array can't be 0") + return ColumnType.BYTE_ARRAY(size) + } + + @Suppress("FunctionName", "UNCHECKED_CAST", "RemoveRedundantQualifierName") + @JvmStatic + public fun ROW_ID(): ColumnType> = ColumnType.ROW_ID as ColumnType> + } +} diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ForeignKey.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ForeignKey.kt new file mode 100644 index 0000000..358f16d --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ForeignKey.kt @@ -0,0 +1,36 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +import kotlin.jvm.JvmStatic + +public interface ForeignKey { + public val fromTable: Table + public val fromColumns: List> + public val toTable: Table + public val toColumns: List> + + public enum class OnUpdateAction { + NO_ACTION, + RESTRICT, + SET_NULL, + SET_DEFAULT, + CASCADE + } + + public enum class OnDeleteAction { + NO_ACTION, + RESTRICT, + SET_NULL, + SET_DEFAULT, + CASCADE + } + + public companion object { + @JvmStatic + public val DEFAULT_ON_UPDATE_ACTION: OnUpdateAction + inline get() = OnUpdateAction.CASCADE + + @JvmStatic + public val DEFAULT_ON_DELETE_ACTION: OnDeleteAction + inline get() = OnDeleteAction.RESTRICT + } +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Index.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Index.kt new file mode 100644 index 0000000..1b80d29 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Index.kt @@ -0,0 +1,7 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface Index { + public val name: String + public val table: Table + public val columns: List> +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/RowId.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/RowId.kt new file mode 100644 index 0000000..e14f45b --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/RowId.kt @@ -0,0 +1,3 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface RowId \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Table.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Table.kt new file mode 100644 index 0000000..d6c3c72 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Table.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface Table { + public val wrapper: UserWrapper +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt new file mode 100644 index 0000000..55a282e --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt @@ -0,0 +1,60 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +import kotlin.jvm.JvmName +import ru.landgrafhomyak.serdha.api.v0.Expression + +public interface TableCreator { + /** + * Offers column of type [D][type] with `NOT NULL` constraint named [name] and runtime type [RuntimeType]. + * + * @return Descriptor of offered column for future operations. + */ + public fun > column(name: String, type: DatabaseType): Column + + @Suppress("INAPPLICABLE_JVM_NAME") + @JvmName("nullableColumn\$notNull") + @Deprecated("This column can be not-null", replaceWith = ReplaceWith("this.column")) + public fun > nullableColumn(name: String, type: DatabaseType): Column = + this.nullableColumn(name, type) + + /** + * Offers column of type [D][type] named [name] and runtime type [R?][RuntimeType]. + * + * @return Descriptor of offered column for future operations. + */ + public fun > nullableColumn(name: String, type: DatabaseType): Column + + public fun index(name: String, vararg columns: Column<*, *, TableUserWrapper>): Index + public fun unique(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, TableUserWrapper>): UniqueConstraint + public fun check(name: String, constraint: Expression): CheckConstraint + + public fun > foreignKey( + fromColumn: Column<*, ColumnType1, TableUserWrapper>, + toTable: Table, + toColumn: Column<*, ColumnType1, TargetTableUserWrapper>, + onUpdate: ForeignKey.OnUpdateAction, + onDelete: ForeignKey.OnDeleteAction + ): ForeignKey + + public fun , ColumnType2 : ColumnType<*>> foreignKey( + fromColumn1: Column<*, ColumnType1, TableUserWrapper>, + fromColumn2: Column<*, ColumnType2, TableUserWrapper>, + toTable: Table, + toColumn1: Column<*, ColumnType1, TargetTableUserWrapper>, + toColumn2: Column<*, ColumnType2, TargetTableUserWrapper>, + onUpdate: ForeignKey.OnUpdateAction, + onDelete: ForeignKey.OnDeleteAction + ): ForeignKey + + public fun , ColumnType2 : ColumnType<*>, ColumnType3 : ColumnType<*>> foreignKey( + fromColumn1: Column<*, ColumnType1, TableUserWrapper>, + fromColumn2: Column<*, ColumnType2, TableUserWrapper>, + fromColumn3: Column<*, ColumnType3, TableUserWrapper>, + toTable: Table, + toColumn1: Column<*, ColumnType1, TargetTableUserWrapper>, + toColumn2: Column<*, ColumnType2, TargetTableUserWrapper>, + toColumn3: Column<*, ColumnType3, TargetTableUserWrapper>, + onUpdate: ForeignKey.OnUpdateAction, + onDelete: ForeignKey.OnDeleteAction + ): ForeignKey +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableUpdater.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableUpdater.kt new file mode 100644 index 0000000..da7ecfc --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableUpdater.kt @@ -0,0 +1,30 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +import ru.landgrafhomyak.serdha.api.v0.Expression + + +public interface TableUpdater : TableCreator { + public fun > keepColumn(c: Column): Column + public fun > renameColumn(c: Column, newName: String): Column + public fun > mapColumn(c: Column, newValue: Expression, where: Expression?) + public fun > mapColumn(c: Column, newValue: Expression): Unit = this.mapColumn(c, newValue, null) + public fun deleteColumn(c: Column<*, *, TableOldUserWrapper>) + + public fun keepIndex(i: Index): Index + public fun renameIndex(i: Index, newName: String): Index + public fun deleteIndex(i: Index) + + public fun keepCheck(i: CheckConstraint): CheckConstraint + public fun renameCheck(i: CheckConstraint, newName: String): CheckConstraint + public fun deleteCheck(i: CheckConstraint) + + public fun keepUnique(i: UniqueConstraint): UniqueConstraint + public fun renameUnique(i: UniqueConstraint, newName: String): UniqueConstraint + public fun deleteUnique(i: UniqueConstraint) + + public fun keepForeignKeyToUpdatedTable(i: ForeignKey, updatedTable: Table): ForeignKey + public fun keepForeignKey(i: ForeignKey): ForeignKey + public fun renameForeignKeyToUpdatedTable(i: ForeignKey, updatedTable: Table): ForeignKey + public fun renameForeignKey(i: ForeignKey): ForeignKey + public fun deleteForeignKey(i: ForeignKey) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/UniqueConstraint.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/UniqueConstraint.kt new file mode 100644 index 0000000..25b144c --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/UniqueConstraint.kt @@ -0,0 +1,7 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface UniqueConstraint { + public val name: String + public val table: Table + public val columns: List> +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InputParam.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InputParam.kt new file mode 100644 index 0000000..f1480ab --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InputParam.kt @@ -0,0 +1,9 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType + +public interface InputParam, OwnerQueryUserWrapper : Any> : Expression { + public val name: String + public val userWrapper: OwnerQueryUserWrapper +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Insert.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Insert.kt new file mode 100644 index 0000000..60adf2f --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Insert.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +public interface Insert { + public val userWrapper: UserWrapper +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt new file mode 100644 index 0000000..d628f7c --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt @@ -0,0 +1,20 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType +import ru.landgrafhomyak.serdha.api.v0.ddl.UniqueConstraint + +public interface InsertCreator { + public fun > insert(c: Column): InputParam + + public fun > selectColumn(c: Column): SelectedColumn + + public fun > returning(e: Expression): Column + + public interface UpsertCreator : UpdateCreator { + public fun > overwrittenColumn(c: Column): SelectedColumn + } + + public fun onConflict(u: UniqueConstraint, c: UpsertCreator.() -> Unit) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Select.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Select.kt new file mode 100644 index 0000000..e2e2c6f --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Select.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +public interface Select { + public val userWrapper: QueryUserWrapper +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectCreator.kt new file mode 100644 index 0000000..b9fa2ca --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectCreator.kt @@ -0,0 +1,21 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType +import ru.landgrafhomyak.serdha.api.v0.ddl.Table + +public interface SelectCreator { + public fun selectTable(t: Table): SelectedTable + public fun selectQuery(t: Select): SelectedTable + public fun where(expression: Expression) + + // default false + public var isDistinct: Boolean + + public fun > returnExpression(expression: Expression): Column + + public fun orderBy(vararg columns: Column<*, *, QueryUserWrapper>) + + public fun groupBy(vararg columns: Column<*, *, QueryUserWrapper>) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedColumn.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedColumn.kt new file mode 100644 index 0000000..e016a62 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedColumn.kt @@ -0,0 +1,8 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType + +public interface SelectedColumn, OwnerTypeUserWrapper : Any, QueryUserWrapper : Any> : Expression { + +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedTable.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedTable.kt new file mode 100644 index 0000000..564f04d --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedTable.kt @@ -0,0 +1,8 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +import ru.landgrafhomyak.serdha.api.v0.ddl.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType + +public interface SelectedTable { + public fun > selectColumn(column: Column): SelectedColumn +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Update.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Update.kt new file mode 100644 index 0000000..fb8ccd6 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Update.kt @@ -0,0 +1,4 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +public interface Update { +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt new file mode 100644 index 0000000..f092705 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt @@ -0,0 +1,15 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType + +public interface UpdateCreator { + public fun > selectColumn(c: Column): SelectedColumn + + public fun > updateColumn(c: Column, e: Expression) + + public fun > param(name: String, type: DatabaseType): InputParam + + public fun where(expression: Expression) +} \ No newline at end of file diff --git a/src/jvmMain/java/Test.java b/src/jvmMain/java/Test.java new file mode 100644 index 0000000..084dda7 --- /dev/null +++ b/src/jvmMain/java/Test.java @@ -0,0 +1,27 @@ +import org.jetbrains.annotations.NotNull; +import ru.landgrafhomyak.serdha.api.v0.Column; +import ru.landgrafhomyak.serdha.api.v0.ColumnType; +import ru.landgrafhomyak.serdha.api.v0.ForeignKey; +import ru.landgrafhomyak.serdha.api.v0.Index; +import ru.landgrafhomyak.serdha.api.v0.Table; +import ru.landgrafhomyak.serdha.api.v0.TableCreator; + +public class Test implements TableCreator { + @NotNull + @Override + public Column column(@NotNull String name, @NotNull ColumnType type) { + return null; + } + + @NotNull + @Override + public Index index(@NotNull String name, @NotNull Column[] columns) { + return null; + } + + @NotNull + @Override + public ForeignKey foreignKey(@NotNull Column fromColumn, @NotNull Table toTable, @NotNull Column toColumn, @NotNull ForeignKey.OnUpdateAction onUpdate, @NotNull ForeignKey.OnDeleteAction onDelete) { + this.foreignKey(null, null, null); + } +}