@@ -47,22 +47,24 @@ type (
4747 ignoreMatcher * IgnoreMatcher
4848 }
4949
50- // createExpectedOptions controls behavior of createExpectedResults
50+ Folder struct {
51+ Dir string
52+ Files []string
53+ }
54+
55+ // lazyDir defers directory creation until Ensure() is called
56+ lazyDir struct {
57+ path string
58+ header string
59+ created bool
60+ }
61+
5162 createExpectedOptions struct {
5263 Commit bool
5364 Pending bool
5465 Interactive bool
5566 DryRun bool
56- Snapshot * SnapshotInfo // Current snapshot for baseline metadata tracking
57- }
58-
59- /*
60- Folder implements a directory from the source repository wherein we found
61- some SQL files. Folder are only implemented as part of a Suite instance.
62- */
63- Folder struct {
64- Dir string
65- Files []string
67+ Snapshot * SnapshotInfo
6668 }
6769)
6870
@@ -225,13 +227,30 @@ func (s *Suite) matchesRunFilter(fileName, queryName string) bool {
225227 return re .MatchString (fileName ) || re .MatchString (queryName )
226228}
227229
228- // Println(Suite) pretty prints the Suite instance to standard out .
230+ // Println pretty prints the Suite, respecting the run filter if set .
229231func (s * Suite ) Println () {
230232 fmt .Printf ("%s\n " , s .Root )
231233 for _ , folder := range s .Dirs {
232- fmt . Printf ( " %s/ \n " , folder . Dir )
234+ var matching [] string
233235 for _ , name := range folder .Files {
234- fmt .Printf (" %s\n " , name )
236+ if s .runFilter == "" {
237+ matching = append (matching , name )
238+ continue
239+ }
240+ qfile := filepath .Join (s .Root , folder .Dir , name )
241+ queries , _ := parseQueryFile (qfile )
242+ for _ , q := range queries {
243+ if s .matchesRunFilter (name , q .Name ) {
244+ matching = append (matching , name )
245+ break
246+ }
247+ }
248+ }
249+ if len (matching ) > 0 {
250+ fmt .Printf (" %s/\n " , folder .Dir )
251+ for _ , name := range matching {
252+ fmt .Printf (" %s\n " , name )
253+ }
235254 }
236255 }
237256}
@@ -241,11 +260,7 @@ func (s *Suite) Println() {
241260// structure in its own space.
242261func (s * Suite ) initRegressHierarchy () error {
243262 for _ , folder := range s .Dirs {
244- rdir := filepath .Join (s .PlanDir , folder .Dir )
245-
246- if err := maybeMkdirAll (rdir ); err != nil {
247- return fmt .Errorf ("Failed to create test plans directory: %s" , err )
248- }
263+ rdir := & lazyDir {path : filepath .Join (s .PlanDir , folder .Dir )}
249264
250265 for _ , name := range folder .Files {
251266 qfile := filepath .Join (s .Root , folder .Dir , name )
@@ -268,7 +283,11 @@ func (s *Suite) initRegressHierarchy() error {
268283 continue
269284 }
270285
271- if _ , err := q .CreateEmptyPlan (rdir ); err != nil {
286+ if err := rdir .Ensure (); err != nil {
287+ return fmt .Errorf ("Failed to create test plans directory: %s" , err )
288+ }
289+
290+ if _ , err := q .CreateEmptyPlan (rdir .path ); err != nil {
272291 fmt .Println ("Skipping:" , err )
273292 }
274293 }
@@ -299,26 +318,19 @@ func (s *Suite) createExpectedResults(pguri string, opts createExpectedOptions)
299318
300319 for _ , folder := range s .Dirs {
301320 rdir := filepath .Join (s .PlanDir , folder .Dir )
302- edir := filepath .Join (s .ExpectedDir , folder .Dir )
321+ edir := & lazyDir {
322+ path : filepath .Join (s .ExpectedDir , folder .Dir ),
323+ header : fmt .Sprintf (" %s" , filepath .Join (s .ExpectedDir , folder .Dir )),
324+ }
303325
304- // Build relative path for filtering
305326 relPath := folder .Dir
306-
307- // Check path filter at folder level
308327 if ! s .matchesPathFilter (relPath ) && ! s .matchesPathFilter (relPath + "/" ) {
309328 continue
310329 }
311330
312- if ! opts .DryRun {
313- maybeMkdirAll (edir )
314- fmt .Printf (" %s\n " , edir )
315- }
316-
317331 for _ , name := range folder .Files {
318332 qfile := filepath .Join (s .Root , folder .Dir , name )
319333 queryPath := filepath .Join (relPath , name )
320-
321- // Check path filter at file level
322334 if ! s .matchesPathFilter (queryPath ) {
323335 continue
324336 }
@@ -336,11 +348,9 @@ func (s *Suite) createExpectedResults(pguri string, opts createExpectedOptions)
336348 continue
337349 }
338350
339- // Check for pending-only mode
340351 if opts .Pending {
341- expectedPath := filepath .Join (edir , q .Name + ".json" )
342- if fileExists (expectedPath ) {
343- continue // Skip - already has baseline
352+ if fileExists (filepath .Join (edir .path , q .Name + ".json" )) {
353+ continue
344354 }
345355 }
346356
@@ -349,6 +359,12 @@ func (s *Suite) createExpectedResults(pguri string, opts createExpectedOptions)
349359 return err
350360 }
351361
362+ if ! opts .DryRun {
363+ if err := edir .Ensure (); err != nil {
364+ return err
365+ }
366+ }
367+
352368 // Execute query and handle results
353369 var writtenFiles []string
354370 if err := s .runInTransaction (db , opts .Commit , func (tx * sql.Tx ) error {
@@ -366,7 +382,7 @@ func (s *Suite) createExpectedResults(pguri string, opts createExpectedOptions)
366382
367383 // Interactive mode: compute diff and prompt for each change
368384 if opts .Interactive {
369- diff := p .ComputeDiffForInteractive (edir )
385+ diff := p .ComputeDiffForInteractive (edir . path )
370386 action := prompter .PromptAccept (q .Name , diff )
371387 switch action {
372388 case "skip" :
@@ -376,13 +392,13 @@ func (s *Suite) createExpectedResults(pguri string, opts createExpectedOptions)
376392 }
377393 }
378394
379- if err := p .WriteResultSets (edir ); err != nil {
395+ if err := p .WriteResultSets (edir . path ); err != nil {
380396 return err
381397 }
382398
383399 // Track written files for metadata recording
384400 for _ , rs := range p .ResultSets {
385- writtenFiles = append (writtenFiles , filepath .Join (edir , filepath .Base (rs .Filename )))
401+ writtenFiles = append (writtenFiles , filepath .Join (edir . path , filepath .Base (rs .Filename )))
386402 }
387403 return nil
388404 }); err != nil {
@@ -459,9 +475,8 @@ func (s *Suite) testQueries(pguri string, formatter OutputFormatter, outputPath
459475 for _ , folder := range s .Dirs {
460476 rdir := filepath .Join (s .PlanDir , folder .Dir )
461477 edir := filepath .Join (s .ExpectedDir , folder .Dir )
462- odir := filepath .Join (s .OutDir , folder .Dir )
478+ odir := & lazyDir { path : filepath .Join (s .OutDir , folder .Dir )}
463479 bdir := filepath .Join (s .BaselineDir , folder .Dir )
464- maybeMkdirAll (odir )
465480
466481 for _ , name := range folder .Files {
467482 qfile := filepath .Join (s .Root , folder .Dir , name )
@@ -486,11 +501,15 @@ func (s *Suite) testQueries(pguri string, formatter OutputFormatter, outputPath
486501 return nil , err
487502 }
488503
504+ if err := odir .Ensure (); err != nil {
505+ return nil , err
506+ }
507+
489508 if err := s .runInTransaction (db , commit , func (tx * sql.Tx ) error {
490509 if err := p .Execute (tx ); err != nil {
491510 return err
492511 }
493- if err := p .WriteResultSets (odir ); err != nil {
512+ if err := p .WriteResultSets (odir . path ); err != nil {
494513 return err
495514 }
496515
@@ -556,7 +575,7 @@ func (s *Suite) executeAllQueries(pguri, outputDir string, verbose bool) (int, e
556575
557576 for _ , folder := range s .Dirs {
558577 rdir := filepath .Join (s .PlanDir , folder .Dir )
559- odir := filepath .Join (outputDir , folder .Dir )
578+ odir := & lazyDir { path : filepath .Join (outputDir , folder .Dir )}
560579
561580 for _ , name := range folder .Files {
562581 qfile := filepath .Join (s .Root , folder .Dir , name )
@@ -582,14 +601,15 @@ func (s *Suite) executeAllQueries(pguri, outputDir string, verbose bool) (int, e
582601 continue
583602 }
584603
585- // Only create output directory if we have queries to run
586- maybeMkdirAll (odir )
604+ if err := odir .Ensure (); err != nil {
605+ return count , err
606+ }
587607
588608 if err := s .runInTransaction (db , false , func (tx * sql.Tx ) error {
589609 if err := p .Execute (tx ); err != nil {
590610 return err
591611 }
592- if err := p .WriteResultSets (odir ); err != nil {
612+ if err := p .WriteResultSets (odir . path ); err != nil {
593613 return err
594614 }
595615 return nil
@@ -612,8 +632,8 @@ func (s *Suite) executeAllQueries(pguri, outputDir string, verbose bool) (int, e
612632 return count , nil
613633}
614634
615- // Only create dir(s) when it doesn't exists already
616- func maybeMkdirAll (dir string ) error {
635+ // ensureDir creates directory if it doesn't exist
636+ func ensureDir (dir string ) error {
617637 stat , err := os .Stat (dir )
618638 if err != nil || ! stat .IsDir () {
619639 fmt .Printf ("Creating directory '%s'\n " , dir )
@@ -627,6 +647,20 @@ func maybeMkdirAll(dir string) error {
627647 return nil
628648}
629649
650+ func (d * lazyDir ) Ensure () error {
651+ if d .created {
652+ return nil
653+ }
654+ if err := ensureDir (d .path ); err != nil {
655+ return err
656+ }
657+ if d .header != "" {
658+ fmt .Println (d .header )
659+ }
660+ d .created = true
661+ return nil
662+ }
663+
630664// hasBaselines checks if any baseline files exist for the given query
631665func hasBaselines (q * Query , baselineDir string , names []string ) bool {
632666 // If query has no parameters, check for single baseline file
0 commit comments