From fe32a0249d668d56cf4ab0128b94b90a01d04fd4 Mon Sep 17 00:00:00 2001 From: FlameyosFlow <89988527+FlameyosSnowy@users.noreply.github.com> Date: Sun, 12 Oct 2025 13:56:20 +0300 Subject: [PATCH] Allow composite keys in primary keys --- .../connection/database/table/Table.java | 104 +++++++++++------- 1 file changed, 64 insertions(+), 40 deletions(-) diff --git a/src/main/java/me/cobeine/sqlava/connection/database/table/Table.java b/src/main/java/me/cobeine/sqlava/connection/database/table/Table.java index ef09623..a79e8ed 100644 --- a/src/main/java/me/cobeine/sqlava/connection/database/table/Table.java +++ b/src/main/java/me/cobeine/sqlava/connection/database/table/Table.java @@ -4,9 +4,7 @@ import me.cobeine.sqlava.connection.database.table.column.Column; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; /** * @author Cobeine @@ -16,9 +14,9 @@ public abstract class Table { @Getter private final String name; private final List columns; - private String primaryKey; + private List primaryKeys = new ArrayList<>(); private final List foreignKeys; - private final HashMap uniqueKeys; + private final HashMap uniqueKeys; public Table(String name) { this.name = name; @@ -36,6 +34,7 @@ public ForeignKey foreignKey(String key) { foreignKeys.add(entry); return entry; } + public void uniqueKey(String key, String... columns) { uniqueKeys.put(key, columns); } @@ -46,53 +45,78 @@ public void addColumns(@NotNull Column... columns) { } } - public void setPrimaryKey(@NotNull Column primaryKey) { - this.primaryKey = primaryKey.getName(); - } - public void setPrimaryKey(@NotNull String primaryKey) { - this.primaryKey = primaryKey; + public void setPrimaryKey(String... keys) { + primaryKeys = Arrays.asList(keys); } @Override public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("CREATE TABLE IF NOT EXISTS `").append(name).append("` ("); + StringBuilder builder = new StringBuilder("CREATE TABLE IF NOT EXISTS `" + name + "` ("); + + this.addColumns(builder); + this.addPrimaryKeys(builder); + this.addForeignKeys(builder); + this.addUniqueKeys(builder); + + builder.append(")"); + return builder.toString(); + } + + private void addColumns(StringBuilder builder) { for (Column column : columns) { builder.append(column.toString()).append(", "); } - if (primaryKey != null) { - builder.append("PRIMARY KEY (`").append(primaryKey).append("`)"); - } else { + } + + private void addPrimaryKeys(StringBuilder builder) { + if (primaryKeys.isEmpty()) { builder.deleteCharAt(builder.length() - 1); builder.deleteCharAt(builder.length() - 1); //to remove the last ", " + return; } - if (!foreignKeys.isEmpty()) { - for (ForeignKey entry : foreignKeys) { - if (entry.referencedColumn != null) { - builder.append(", FOREIGN KEY (`").append(entry.foreignKey).append("`)"); - builder.append(" REFERENCES `").append(entry.referencedTable).append("`(`").append(entry.referencedColumn).append("`)"); - if (entry.onDelete != null) { - builder.append(" ON DELETE ").append(entry.onDelete.name().replace("_"," ")); - } - } - } - } - if (!uniqueKeys.isEmpty()) { - for (String key : uniqueKeys.keySet()) { - String[] columns = uniqueKeys.get(key); - builder.append(", UNIQUE KEY `").append(key).append("` ("); - for (int i = 0; i < columns.length; i++) { - builder.append("`").append(columns[i]).append("`"); - if (i < columns.length - 1) { - builder.append(", "); - } - } - builder.append(")"); - } + + builder.append("PRIMARY KEY ("); + + int size = primaryKeys.size(); + for (int i = 0; i < size; i++) { + builder.append("`").append(primaryKeys.get(i)).append("`"); + if (i >= size - 1) return; + + builder.append(", "); } + builder.append(")"); - return builder.toString(); } + private void addForeignKeys(StringBuilder builder) { + if (foreignKeys.isEmpty()) { + return; + } + + for (ForeignKey entry : foreignKeys) { + if (entry.referencedColumn == null) continue; + builder.append(", FOREIGN KEY (`").append(entry.foreignKey).append("`)"); + builder.append(" REFERENCES `").append(entry.referencedTable).append("`(`").append(entry.referencedColumn).append("`)"); + if (entry.onDelete == null) return; + + builder.append(" ON DELETE ").append(entry.onDelete.name().replace("_"," ")); + } + } + + private void addUniqueKeys(StringBuilder builder) { + if (uniqueKeys.isEmpty()) { + return; + } -} \ No newline at end of file + for (String key : uniqueKeys.keySet()) { + String[] columns = uniqueKeys.get(key); + builder.append(", UNIQUE KEY `").append(key).append("` ("); + for (int i = 0; i < columns.length; i++) { + builder.append("`").append(columns[i]).append("`"); + if (i >= columns.length - 1) continue; + builder.append(", "); + } + builder.append(")"); + } + } +}