gastownhall/beads · error

CountIssues: %w

Error message

CountIssues: %w

What it means

Pass-through wrapper from CountIssues in the issue use-case: wraps errors from issueRepo.CountIssues(ctx, query, filter), which counts issues matching a free-text query plus structured filter. The count query failing in storage surfaces as 'CountIssues: <root cause>'.

Source

Thrown at internal/storage/domain/issue.go:1833

	out, err := u.issueRepo.GetBlockedIssues(ctx, filter)
	if err != nil {
		return nil, fmt.Errorf("GetBlockedIssues: %w", err)
	}
	return out, nil
}

func (u *issueUseCaseImpl) GetStatistics(ctx context.Context) (*types.Statistics, error) {
	out, err := u.issueRepo.GetStatistics(ctx)
	if err != nil {
		return nil, fmt.Errorf("GetStatistics: %w", err)
	}
	return out, nil
}

func (u *issueUseCaseImpl) CountIssues(ctx context.Context, query string, filter types.IssueFilter) (int64, error) {
	out, err := u.issueRepo.CountIssues(ctx, query, filter)
	if err != nil {
		return 0, fmt.Errorf("CountIssues: %w", err)
	}
	return out, nil
}

func (u *issueUseCaseImpl) CountIssuesByGroup(ctx context.Context, filter types.IssueFilter, groupBy string) (map[string]int, error) {
	out, err := u.issueRepo.CountIssuesByGroup(ctx, filter, groupBy)
	if err != nil {
		return nil, fmt.Errorf("CountIssuesByGroup: %w", err)
	}
	return out, nil
}

func (u *issueUseCaseImpl) History(ctx context.Context, id string) ([]*storage.HistoryEntry, error) {
	out, err := u.issueRepo.History(ctx, id)
	if err != nil {
		return nil, fmt.Errorf("History: %w", err)
	}
	return out, nil

View on GitHub (pinned to 71377f2769)

Solutions

  1. Inspect the wrapped error after 'CountIssues:' for the root cause
  2. Validate the query string syntax and IssueFilter values before calling
  3. Sanitize/escape user-supplied query input
  4. Retry on transient storage errors

Example fix

// before
count, err := uc.CountIssues(ctx, userQuery, filter)
// after
count, err := uc.CountIssues(ctx, userQuery, filter)
if err != nil {
    return fmt.Errorf("counting issues for query %q: %w", userQuery, err)
}
Defensive patterns

Strategy: validation

Validate before calling

if query == "" && filter == (types.IssueFilter{}) {
    return fmt.Errorf("empty query and filter")
}
// validate query syntax against supported operators before calling

Try / catch

count, err := uc.CountIssues(ctx, query, filter)
if err != nil {
    return fmt.Errorf("count failed for query %q: %w", query, err)
}

Prevention

When it happens

Trigger: Calling CountIssues(ctx, query, filter) when the repository count query errors — malformed free-text query syntax, invalid filter, or storage failure while executing the count SQL.

Common situations: Scripts passing user-supplied search strings with bad query syntax; filters with invalid status/priority values; database outage during batch reporting jobs.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/5ae7a784a3facd5d. Report an issue: GitHub.