Class: QueryGuard::CLI::PagedReportFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/query_guard/cli/paged_report_formatter.rb

Overview

Formats QueryGuard reports with pagination support for large finding sets.

When a report has many findings (e.g., thousands), pagination allows:

  • Chunking findings into pages for API transmission
  • Cursor-based pagination for large datasets
  • Memory-efficient processing on receiving end

Example:

# Paginate findings into pages of 100 each
paged = PagedReportFormatter.new(
report: full_report,
page_size: 100,
page: 1
)

json = paged.generate  # Returns report with findings[0..99]

Example with cursor:

paged = PagedReportFormatter.new(
report: full_report,
page_size: 100,
continuation_token: 'abc123...'
)

json = paged.generate  # Returns next batch of 100 findings

Constant Summary collapse

DEFAULT_PAGE_SIZE =
100
MAX_PAGE_SIZE =
1000

Instance Method Summary collapse

Constructor Details

#initialize(report:, page_size: DEFAULT_PAGE_SIZE, page: 1, continuation_token: nil) ⇒ PagedReportFormatter

Returns a new instance of PagedReportFormatter.



37
38
39
40
41
42
43
# File 'lib/query_guard/cli/paged_report_formatter.rb', line 37

def initialize(report:, page_size: DEFAULT_PAGE_SIZE, page: 1, continuation_token: nil)
  @report = report.dup  # Don't mutate original

  @page_size = [page_size.to_i, MAX_PAGE_SIZE].min
  @page = [page.to_i, 1].max
  @continuation_token = continuation_token
  @all_findings = @report.delete(:findings) || []
end

Instance Method Details

#build_paged_report ⇒ Object

Build the paginated report



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/query_guard/cli/paged_report_formatter.rb', line 52

def build_paged_report
  start_index = (@page - 1) * @page_size
  end_index = start_index + @page_size

  paginated_findings = @all_findings[start_index...end_index]
  has_more = end_index < @all_findings.length

  # Build the report with paginated findings

  report = @report.dup
  report[:findings] = paginated_findings

  # Add pagination metadata

  report[:pagination] = build_pagination(has_more)

  # Update summary to match paginated findings only

  report[:summary] = update_summary(paginated_findings) if report[:summary]

  report
end

#generate ⇒ Object

Generate paginated report Returns: String (JSON)



47
48
49
# File 'lib/query_guard/cli/paged_report_formatter.rb', line 47

def generate
  JSON.pretty_generate(build_paged_report)
end