compiler

package
v0.7.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 23, 2026 License: MIT Imports: 6 Imported by: 1

README

compiler

Package compiler provides public APIs for compiling OpenFGA schemas to SQL.

This is a thin wrapper around internal/sqlgen that exposes only the public types and functions needed by external consumers. For most use cases, prefer pkg/migrator which handles the full migration workflow.

Package Responsibilities

  • Expose SQL generation types for advanced use cases
  • Provide access to relation analysis for tooling
  • Enable custom SQL generation pipelines

Public API

Types
// GeneratedSQL contains all SQL generated from a schema for check functions.
type GeneratedSQL struct {
    Functions            []string // Specialized check functions per relation
    NoWildcardFunctions  []string // Check functions excluding wildcard matches
    Dispatcher           string   // Main check_permission dispatcher
    DispatcherNoWildcard string   // Dispatcher excluding wildcards
}

// ListGeneratedSQL contains all SQL generated for list functions.
type ListGeneratedSQL struct {
    ListObjectsFunctions   []string // list_objects_* functions
    ListSubjectsFunctions  []string // list_subjects_* functions
    ListObjectsDispatcher  string   // list_accessible_objects dispatcher
    ListSubjectsDispatcher string   // list_accessible_subjects dispatcher
}

// RelationAnalysis contains the analyzed features of a relation.
type RelationAnalysis struct {
    ObjectType  string
    Relation    string
    CanGenerate bool
    // Feature flags: HasDirect, HasImplied, HasWildcard, etc.
}
Functions
// AnalyzeRelations classifies all relations and gathers data needed for SQL generation.
var AnalyzeRelations func(types []schema.TypeDefinition, closure []schema.ClosureRow) []RelationAnalysis

// ComputeCanGenerate computes which relations can have functions generated.
var ComputeCanGenerate func(analyses []RelationAnalysis) []RelationAnalysis

// GenerateSQL generates specialized check_permission functions from relation analyses.
var GenerateSQL func(analyses []RelationAnalysis, inline InlineSQLData) (GeneratedSQL, error)

// GenerateListSQL generates specialized list functions from relation analyses.
var GenerateListSQL func(analyses []RelationAnalysis, inline InlineSQLData) (ListGeneratedSQL, error)

// CollectFunctionNames returns all generated function names for tracking.
var CollectFunctionNames func(analyses []RelationAnalysis) []string

// BuildInlineSQLData builds inline SQL data from closure and analyses.
var BuildInlineSQLData func(closure []schema.ClosureRow, analyses []RelationAnalysis) InlineSQLData

Usage Examples

Generate SQL for Inspection
import (
    "github.com/pthm/melange/pkg/parser"
    "github.com/pthm/melange/pkg/schema"
    "github.com/pthm/melange/pkg/compiler"
)

// Parse schema
types, _ := parser.ParseSchema("schema.fga")

// Compute closure
closure := schema.ComputeRelationClosure(types)

// Analyze relations
analyses := compiler.AnalyzeRelations(types, closure)
analyses = compiler.ComputeCanGenerate(analyses)

// Build inline data
inline := compiler.BuildInlineSQLData(closure, analyses)

// Generate SQL
sql, err := compiler.GenerateSQL(analyses, inline)
if err != nil {
    log.Fatal(err)
}

// Inspect generated functions
for i, fn := range sql.Functions {
    fmt.Printf("Function %d:\n%s\n\n", i, fn)
}

// Inspect dispatcher
fmt.Printf("Dispatcher:\n%s\n", sql.Dispatcher)
Analyze Relation Features
types, _ := parser.ParseSchema("schema.fga")
closure := schema.ComputeRelationClosure(types)
analyses := compiler.AnalyzeRelations(types, closure)

for _, a := range analyses {
    fmt.Printf("%s.%s: CanGenerate=%v\n",
        a.ObjectType, a.Relation, a.CanGenerate)
}
Custom SQL Pipeline
// For advanced use: generate SQL without applying to database
types, _ := parser.ParseSchema("schema.fga")
closure := schema.ComputeRelationClosure(types)

analyses := compiler.AnalyzeRelations(types, closure)
analyses = compiler.ComputeCanGenerate(analyses)
inline := compiler.BuildInlineSQLData(closure, analyses)

checkSQL, _ := compiler.GenerateSQL(analyses, inline)
listSQL, _ := compiler.GenerateListSQL(analyses, inline)

// Write to files for review
os.WriteFile("check_functions.sql", []byte(checkSQL.Dispatcher), 0644)
os.WriteFile("list_functions.sql", []byte(listSQL.ListObjectsDispatcher), 0644)

When to Use This Package

Use pkg/migrator instead for most use cases:

// Simple: one function handles everything
err := migrator.Migrate(ctx, db, "schema.fga")

Use pkg/compiler when you need:

  • SQL inspection - View generated SQL before applying
  • Custom pipelines - Generate SQL for non-PostgreSQL targets
  • Tooling - Build analyzers or documentation generators
  • Dry-run output - Generate migration scripts for review

Relationship to Other Packages

pkg/parser  ->  pkg/schema  ->  pkg/compiler  ->  pkg/migrator
   |               |               |                  |
   v               v               v                  v
 Parse FGA      Transform      Generate SQL      Apply to DB

The compiler package sits between schema analysis and database migration, providing the SQL generation step.

Dependency Information

This package re-exports types from lib/sqlgen. It depends on:

  • github.com/pthm/melange/lib/sqlgen - SQL generation implementation
  • github.com/pthm/melange/pkg/schema - Schema types (via sqlgen)

Documentation

Overview

Package compiler provides public APIs for compiling OpenFGA schemas to SQL.

It is a thin wrapper around lib/sqlgen that exposes only the types and functions needed by external consumers. The package covers two concerns:

  • Check and list SQL generation: AnalyzeRelations, GenerateSQL, GenerateListSQL, CollectFunctionNames, CollectNamedFunctions.
  • Migration file generation: GenerateMigrationSQL and MigrationOptions, which assemble versioned UP/DOWN SQL files from already-compiled output.

For applying generated SQL directly to a database, use pkg/migrator instead.

Index

Constants

This section is empty.

Variables

View Source
var AnalyzeRelations = sqlgen.AnalyzeRelations

AnalyzeRelations classifies all relations and gathers data needed for SQL generation.

View Source
var BuildInlineSQLData = sqlgen.BuildInlineSQLData

BuildInlineSQLData builds inline SQL data from closure and analyses.

View Source
var CollectFunctionNames = sqlgen.CollectFunctionNames

CollectFunctionNames returns all generated function names for tracking.

View Source
var CollectNamedFunctions = sqlgen.CollectNamedFunctions

CollectNamedFunctions returns specialized functions paired with their SQL.

View Source
var ComputeCanGenerate = sqlgen.ComputeCanGenerate

ComputeCanGenerate computes which relations can have functions generated.

View Source
var GenerateListSQL = sqlgen.GenerateListSQL

GenerateListSQL generates specialized list functions from relation analyses.

View Source
var GenerateSQL = sqlgen.GenerateSQL

GenerateSQL generates specialized check_permission functions from relation analyses.

Functions

This section is empty.

Types

type GeneratedSQL

type GeneratedSQL = sqlgen.GeneratedSQL

GeneratedSQL contains all SQL generated from a schema for check functions.

type InlineSQLData

type InlineSQLData = sqlgen.InlineSQLData

InlineSQLData contains inline SQL data for generated functions.

type ListGeneratedSQL

type ListGeneratedSQL = sqlgen.ListGeneratedSQL

ListGeneratedSQL contains all SQL generated for list functions.

type MigrationOptions added in v0.7.4

type MigrationOptions struct {
	// Version is the melange CLI/library version (e.g., "v0.7.3").
	Version string
	// SchemaChecksum is the SHA256 of the current schema content.
	SchemaChecksum string
	// CodegenVersion is the codegen version string.
	CodegenVersion string
	// PreviousFunctionNames enables orphan-aware output when non-nil.
	PreviousFunctionNames []string
	// PreviousSource describes where previous state came from (for header comment).
	// e.g., "database", "git:abc1234", "file:old.fga"
	PreviousSource string
	// PreviousChecksums maps function_name → SHA256(sql_body) from the previous state.
	// When set alongside NamedFunctions, only functions whose SQL body has changed (or
	// are new) are included in the UP migration. Dispatchers are always included
	// regardless. If nil, all specialized functions are emitted unconditionally.
	PreviousChecksums map[string]string
	// NamedFunctions pairs each specialized function name with its SQL body for
	// checksum comparison. Required alongside PreviousChecksums for change detection;
	// if either is absent, change detection is skipped and all functions are emitted.
	NamedFunctions []NamedFunction
}

MigrationOptions controls migration SQL generation.

type MigrationSQL added in v0.7.4

type MigrationSQL struct {
	Up   string
	Down string
}

MigrationSQL holds the UP and DOWN SQL for a single versioned migration. UP contains CREATE OR REPLACE statements for all current functions, plus DROP statements for any orphaned functions detected via comparison mode. DOWN drops all functions installed by UP; restoring a prior state requires re-applying that version's UP migration.

func GenerateMigrationSQL added in v0.7.4

func GenerateMigrationSQL(
	generatedSQL GeneratedSQL,
	listSQL ListGeneratedSQL,
	expectedFunctions []string,
	opts MigrationOptions,
) MigrationSQL

GenerateMigrationSQL is the terminal step of the generate migration pipeline. It assembles UP and DOWN SQL from functions already compiled by GenerateSQL and GenerateListSQL. Call CollectFunctionNames and CollectNamedFunctions first to populate expectedFunctions and opts.NamedFunctions respectively.

When opts.PreviousFunctionNames is nil the output includes every function (full mode). When set, orphaned functions are dropped in UP and checksum-based filtering is applied if opts.PreviousChecksums is also provided.

type NamedFunction added in v0.7.4

type NamedFunction = sqlgen.NamedFunction

NamedFunction pairs a function name with its generated SQL body.

type RelationAnalysis

type RelationAnalysis = sqlgen.RelationAnalysis

RelationAnalysis contains the analyzed features of a relation.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL