summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-11-01 22:14:48 +0000
committerMichael Williamson <mike@zwobble.org>2026-11-01 22:14:48 +0000
commit9e3b464574de88f5783402cf13fcb7aded340c6b (patch)
tree35582b789057ede5b4fe0f33bd38e6a65aa689f5 /src/main/java
parent66855f114b4aff76634bf77ac6336d7d4b4fb2f3 (diff)
Generate SQL for queries
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sql/SqlGenerator.java28
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sqlscripts/SqlScriptsGenerator.java44
2 files changed, 66 insertions, 6 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sql/SqlGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sql/SqlGenerator.java
index be847d5..2145373 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sql/SqlGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sql/SqlGenerator.java
@@ -1,5 +1,7 @@
package org.zwobble.hobgoblin.compiler.output.generators.sql;
+import org.zwobble.hobgoblin.compiler.ast.typed.RelationTable;
+import org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode;
import org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode;
import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
import org.zwobble.hobgoblin.compiler.output.lang.sql.ast.*;
@@ -50,6 +52,32 @@ public class SqlGenerator {
}
}
+ public SqlStatement generateQueryDefinition(
+ TypedQueryDefinitionNode queryDefinition,
+ TypesInfo typesInfo
+ ) {
+ switch (queryDefinition.relation()) {
+ case RelationTable relationTable -> {
+ var table = relationTable.table();
+ var schemaInfo = typesInfo.databaseSchemaInfo(table.databaseSchema());
+ var tableInfo = schemaInfo.tables().get(table.name());
+ // TODO: handle singleton struct.
+ var fields = typesInfo.fieldsOf(tableInfo.rowType()).orElseThrow();
+ var columns = fields.stream()
+ .map(field -> {
+ var columnName = generateColumnName(field.name());
+ return new SqlResultColumn(
+ new SqlRef(columnName),
+ columnName
+ );
+ })
+ .toList();
+
+ return new SqlSelectStatement(columns, generateTableName(table.name()));
+ }
+ }
+ }
+
private SqlIdentifier generateColumnName(String fieldName) {
return new SqlIdentifier(Casing.lowerCamelCaseToSnakeCase(fieldName));
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sqlscripts/SqlScriptsGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sqlscripts/SqlScriptsGenerator.java
index b526e38..f34a629 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sqlscripts/SqlScriptsGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/sqlscripts/SqlScriptsGenerator.java
@@ -81,12 +81,33 @@ public class SqlScriptsGenerator implements Generator {
NamespaceName namespaceName,
TypesInfo typesInfo
) throws IOException {
- if (namespaceStatement instanceof TypedDatabaseSchemaDefinitionNode databaseSchemaDefinition) {
- generateDatabaseSchemaDefinition(
- databaseSchemaDefinition,
- namespaceName,
- typesInfo
- );
+ switch (namespaceStatement) {
+ case TypedDatabaseSchemaDefinitionNode databaseSchemaDefinition ->
+ generateDatabaseSchemaDefinition(
+ databaseSchemaDefinition,
+ namespaceName,
+ typesInfo
+ );
+
+ case TypedEnumDefinitionNode _ -> {
+ }
+
+ case TypedNativeTypeDefinitionNode _ -> {
+ }
+
+ case TypedQueryDefinitionNode queryDefinition -> {
+ generateQueryDefinition(
+ queryDefinition,
+ namespaceName,
+ typesInfo
+ );
+ }
+
+ case TypedStructDefinitionNode _ -> {
+ }
+
+ case TypedSumDefinitionNode _ -> {
+ }
}
}
@@ -119,6 +140,17 @@ public class SqlScriptsGenerator implements Generator {
};
}
+ private void generateQueryDefinition(
+ TypedQueryDefinitionNode queryDefinition,
+ NamespaceName namespaceName,
+ TypesInfo typesInfo
+ ) throws IOException {
+ var sqlQuery = this.sqlGenerator.generateQueryDefinition(queryDefinition, typesInfo);
+ var sqlScript = new SqlScript(List.of(sqlQuery));
+
+ write(namespaceName, queryDefinition.name(), sqlScript);
+ }
+
private void write(
NamespaceName namespaceName,
String schemaName,