Skip to content

Commit 2781707

Browse files
committed
chore: create folders only when used
1 parent 36a6da4 commit 2781707

2 files changed

Lines changed: 91 additions & 56 deletions

File tree

regresql/baseline.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ func BaselineQueries(root string, runFilter string, analyzeOverride bool) {
219219
baselineDir := filepath.Join(suite.RegressDir, "baselines")
220220

221221
fmt.Printf("Creating baselines directory: %s\n", baselineDir)
222-
if err := maybeMkdirAll(baselineDir); err != nil {
222+
if err := ensureDir(baselineDir); err != nil {
223223
fmt.Printf("Failed to create baselines directory: %s\n", err.Error())
224224
os.Exit(11)
225225
}
@@ -231,16 +231,12 @@ func BaselineQueries(root string, runFilter string, analyzeOverride bool) {
231231
fmt.Printf("\nCreating baselines for queries (%s):\n", mode)
232232

233233
for _, folder := range suite.Dirs {
234-
folderBaselineDir := filepath.Join(baselineDir, folder.Dir)
235234
folderPlanDir := filepath.Join(suite.PlanDir, folder.Dir)
236-
237-
if err := maybeMkdirAll(folderBaselineDir); err != nil {
238-
fmt.Printf("Failed to create folder baseline directory: %s\n", err.Error())
239-
os.Exit(11)
235+
dir := &lazyDir{
236+
path: filepath.Join(baselineDir, folder.Dir),
237+
header: fmt.Sprintf("\n %s/", folder.Dir),
240238
}
241239

242-
fmt.Printf("\n %s/\n", folder.Dir)
243-
244240
for _, name := range folder.Files {
245241
qfile := filepath.Join(suite.Root, folder.Dir, name)
246242

@@ -266,7 +262,12 @@ func BaselineQueries(root string, runFilter string, analyzeOverride bool) {
266262
continue
267263
}
268264

269-
if err := q.CreateBaseline(folderBaselineDir, folderPlanDir, db, useAnalyze); err != nil {
265+
if err := dir.Ensure(); err != nil {
266+
fmt.Printf("Failed to create folder baseline directory: %s\n", err.Error())
267+
os.Exit(11)
268+
}
269+
270+
if err := q.CreateBaseline(dir.path, folderPlanDir, db, useAnalyze); err != nil {
270271
fmt.Printf(" Error creating baseline for %s: %s\n", q.Name, err.Error())
271272
}
272273
}

regresql/suite.go

Lines changed: 81 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
229231
func (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.
242261
func (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
631665
func hasBaselines(q *Query, baselineDir string, names []string) bool {
632666
// If query has no parameters, check for single baseline file

0 commit comments

Comments
 (0)