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(")");
+ }
+ }
+}