From 9e3b464574de88f5783402cf13fcb7aded340c6b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 1 Nov 2026 22:14:48 +0000 Subject: Generate SQL for queries --- .../output/generators/sql/SqlGenerator.java | 28 ++++++++++++++ .../generators/sqlscripts/SqlScriptsGenerator.java | 44 +++++++++++++++++++--- 2 files changed, 66 insertions(+), 6 deletions(-) (limited to 'src/main/java') 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, -- cgit v1.2.3