diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/de/cccwi/Attribute.java b/src/main/java/de/cccwi/Attribute.java
index 3988c4d..4756b5d 100644
--- a/src/main/java/de/cccwi/Attribute.java
+++ b/src/main/java/de/cccwi/Attribute.java
@@ -3,17 +3,14 @@ package de.cccwi;
public record Attribute(String name, Class> type) {
+ public Attribute {
+ assert name != null;
+ assert type != null;
+ }
+
public Attribute rho(String newName) {
+ assert newName != null;
+
return new Attribute(newName, type);
}
-
- @Override
- public boolean equals(Object o) {
- return o instanceof Attribute other && name.equals(other.name);
- }
-
- @Override
- public int hashCode() {
- return name.hashCode();
- }
}
\ No newline at end of file
diff --git a/src/main/java/de/cccwi/Database.java b/src/main/java/de/cccwi/Database.java
deleted file mode 100644
index f932a1e..0000000
--- a/src/main/java/de/cccwi/Database.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package de.cccwi;
-
-import java.util.Map;
-
-public class Database {
- private Map tables;
-
- public Database(Map tables) {
- this.tables = tables;
- }
-
- public Relation executeQuery(String query) {
- return null;
- }
-}
diff --git a/src/main/java/de/cccwi/Main.java b/src/main/java/de/cccwi/Main.java
index 6c32e6a..d320ed5 100644
--- a/src/main/java/de/cccwi/Main.java
+++ b/src/main/java/de/cccwi/Main.java
@@ -2,66 +2,83 @@ package de.cccwi;
import de.cccwi.conditions.AttributeEquals;
import de.cccwi.conditions.GreaterThan;
+import de.cccwi.conditions.Not;
import de.cccwi.conditions.ValueEquals;
import java.util.List;
import java.util.UUID;
public class Main {
- public static void main(String[] args) {
+ private static Relation createUserTable() {
var idColumn = new Attribute("id", String.class);
var nameColumn = new Attribute("name", String.class);
var ageColumn = new Attribute("age", Integer.class);
- var enabledColumn = new Attribute("enabled", Boolean.class);
- var userTable = new Relation(
- "Users",
- List.of(idColumn, nameColumn, ageColumn, enabledColumn),
- List.of(
- List.of(UUID.randomUUID().toString(), "nitrix", 31, true),
- List.of(UUID.randomUUID().toString(), "oxedos", 27, true),
- List.of(UUID.randomUUID().toString(), "yubilee", 30, false)
- )
- );
- System.out.println("Users");
- System.out.println(userTable);
+ var enabledColumn = new Attribute("enabled", Boolean.class);
+ return new Relation("Users", List.of(idColumn, nameColumn, ageColumn, enabledColumn), List.of())
+ .insert(List.of(UUID.randomUUID().toString(), "nitrix", 32, true))
+ .insert(List.of(UUID.randomUUID().toString(), "oxedos", 32, true))
+ .insert(List.of(UUID.randomUUID().toString(), "yubilee", 31, false));
+ }
+ private static Relation createEventTable(Relation userTable) {
+ var idColumn = new Attribute("id", String.class);
var userIdColumn = new Attribute("userId", String.class);
var typeColumn = new Attribute("type", String.class);
var descriptionColumn = new Attribute("description", String.class);
- var eventTable = new Relation(
- "Events",
- List.of(idColumn, userIdColumn, typeColumn, descriptionColumn),
- List.of(
- List.of(UUID.randomUUID(), userTable.tuples().getFirst().getFirst(), "login", "user logged in"),
- List.of(UUID.randomUUID(), userTable.tuples().getFirst().getFirst(), "logout", "user logged out")
- )
- );
+ return new Relation("Events", List.of(idColumn, userIdColumn, typeColumn, descriptionColumn), List.of())
+ .insert(List.of(UUID.randomUUID().toString(), userTable.tuples().getFirst().getFirst(), "login", "user logged in"))
+ .insert(List.of(UUID.randomUUID().toString(), userTable.tuples().getFirst().getFirst(), "logout", "user logged out"));
+ }
+
+ public static void main(String[] args) {
+ var userTable = createUserTable();
+ System.out.println("Users");
+ System.out.println(userTable);
+
+ var eventTable = createEventTable(userTable);
System.out.println("Events");
System.out.println(eventTable);
- System.out.println("SELECT name, id, age AS howOld FROM Users WHERE age > 30");
+ System.out.println("SELECT name, id, age AS howOld FROM Users WHERE age > 31");
var resultTable = userTable
- .sigma(new GreaterThan(ageColumn, 30))
- .pi(List.of(nameColumn, idColumn, ageColumn))
- .rho(ageColumn.name(), "howOld");
+ .sigma(new GreaterThan(new Attribute("age", Integer.class), 31))
+ .pi(List.of(
+ new Attribute("name", String.class),
+ new Attribute("id", String.class),
+ new Attribute("age", Integer.class))
+ )
+ .rho("age", "howOld");
System.out.println(resultTable);
- System.out.println("SELECT name AS enabledUsers FROM Users WHERE NOT enabled");
+ System.out.println("SELECT name AS disabledUsers FROM Users WHERE enabled != true");
resultTable = userTable
- .sigma(new ValueEquals(enabledColumn, false))
- .pi(List.of(nameColumn))
- .rho(nameColumn.name(), "enabledUsers");
+ .sigma(new Not(new ValueEquals(new Attribute("enabled", Boolean.class), true)))
+ .pi(List.of(new Attribute("name", String.class)))
+ .rho("name", "disabledUsers");
System.out.println(resultTable);
System.out.println("SELECT * FROM Users u1 JOIN Users u2 ON u1.id = u2.id");
- var u1 = userTable.rho("u1");
- var u2 = userTable.rho("u2");
- resultTable = u1.join(u2, new AttributeEquals(idColumn.rho("u1.id"), idColumn.rho("u2.id")));
+ resultTable = userTable
+ .rho("u1")
+ .join(
+ userTable.rho("u2"),
+ new AttributeEquals(
+ new Attribute("u1.id", String.class),
+ new Attribute("u2.id", String.class)
+ )
+ );
System.out.println(resultTable);
System.out.println("SELECT * FROM Users u JOIN Events e ON u.id = e.userId");
- resultTable = userTable.rho("u")
- .join(eventTable.rho("e"), new AttributeEquals(idColumn.rho("u.id"), userIdColumn));
+ resultTable = userTable
+ .rho("u")
+ .join(
+ eventTable.rho("e"),
+ new AttributeEquals(
+ new Attribute("u.id", String.class),
+ new Attribute("userId", String.class)
+ )
+ );
System.out.println(resultTable);
System.out.println("SELECT * FROM Users UNION Users");
diff --git a/src/main/java/de/cccwi/Relation.java b/src/main/java/de/cccwi/Relation.java
index d5353df..a616828 100644
--- a/src/main/java/de/cccwi/Relation.java
+++ b/src/main/java/de/cccwi/Relation.java
@@ -12,7 +12,33 @@ public record Relation(
List attributes,
List> tuples
) {
+
+ public Relation {
+ assert name != null;
+ assert attributes != null && !attributes.isEmpty();
+ assert tuples != null;
+
+ for (var tuple : tuples) {
+ assert tuple.size() == attributes.size();
+ for (var i = 0; i < tuple.size(); i++) {
+ assert attributes.get(i).type().isInstance(tuple.get(i));
+ }
+ }
+ }
+
+ public Relation insert(List