['name', 'advertisername'], 'ads' => ['id', 'advertiser', 'adsize', 'size', 'price', 'issue', 'pageid', 'state', 'notes'], 'pages' => ['id', 'issue', 'page'], 'articles' => ['id', 'pageid', 'articlenumber', 'article', 'content', 'membername', 'author', 'dcn', 'articlewords', 'otherwords', 'othercontent', 'other'], 'issues' => ['id', 'issue', 'issuemonths', 'description'], 'invoices' => ['id', 'issue', 'issue_id', 'ad_id', 'invoice_number', 'status'], ]); $parser = new DslParser(); $validator = new DslValidator($metadata); $compiler = new DslCompiler($metadata); $cases = [ 'ads and pages where ad-in-issue(202605)' => [ 'needle' => 'p_ad_issue.`Issue` = ?', 'params' => [202605], ], 'articles and pages where page-in-issue(202605)' => [ 'needle' => 's_pages.`Issue` = ?', 'params' => [202605], ], 'advertisers and ads where selected' => [ 'needle' => 'COALESCE(s_advertisers.`Selected`, 0) <> 0', 'params' => [], ], 'invoices and ads where invoice-ids(10, 11)' => [ 'needle' => 's_invoices.`id` IN (?,?)', 'params' => [10, 11], ], ]; foreach ($cases as $dsl => $expect) { $ast = $parser->parse($dsl); $validation = $validator->validate($ast); if (($validation['errors'] ?? []) !== []) { fwrite(STDERR, "Expected valid DSL {$dsl}: " . json_encode($validation['errors']) . "\n"); exit(1); } $compiled = $compiler->compile($ast); $sql = (string) ($compiled['sql'] ?? ''); if (strpos($sql, $expect['needle']) === false) { fwrite(STDERR, "Expected SQL for {$dsl} to contain {$expect['needle']}\n{$sql}\n"); exit(1); } if (($compiled['params'] ?? []) !== $expect['params']) { fwrite(STDERR, "Unexpected params for {$dsl}: " . json_encode($compiled['params'] ?? []) . "\n"); exit(1); } } echo "DSL FEN built-in tests passed\n";