Class: Parse::GroupedResult

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/parse/query.rb

Overview

Wrapper class for grouped results that provides sorting capabilities. Allows sorting grouped results by keys (group names) or values (aggregation results) in ascending or descending order.

Instance Method Summary collapse

Constructor Details

#initialize(results, operation = nil) ⇒ GroupedResult

Returns a new instance of GroupedResult.

Parameters:

  • results (Hash)

    the grouped results hash

  • operation (String, nil) (defaults to: nil)

    the aggregation operation (e.g. "count", "sum", "average", "min", "max", "list")



6573
6574
6575
6576
# File 'lib/parse/query.rb', line 6573

def initialize(results, operation = nil)
  @results = results
  @operation = operation
end

Instance Method Details

#each(&block) ⇒ Object

Iterate over each key-value pair



6585
6586
6587
# File 'lib/parse/query.rb', line 6585

def each(&block)
  @results.each(&block)
end

#sort_by_key_ascArray<Array>

Sort by keys (group names) in ascending order

Returns:

  • (Array<Array>)

    array of [key, value] pairs sorted by key ascending



6591
6592
6593
# File 'lib/parse/query.rb', line 6591

def sort_by_key_asc
  @results.sort_by { |k, v| k }
end

#sort_by_key_descArray<Array>

Sort by keys (group names) in descending order

Returns:

  • (Array<Array>)

    array of [key, value] pairs sorted by key descending



6597
6598
6599
# File 'lib/parse/query.rb', line 6597

def sort_by_key_desc
  @results.sort_by { |k, v| k }.reverse
end

#sort_by_value_ascArray<Array>

Sort by values (aggregation results) in ascending order

Returns:

  • (Array<Array>)

    array of [key, value] pairs sorted by value ascending



6603
6604
6605
# File 'lib/parse/query.rb', line 6603

def sort_by_value_asc
  @results.sort_by { |k, v| v }
end

#sort_by_value_descArray<Array>

Sort by values (aggregation results) in descending order

Returns:

  • (Array<Array>)

    array of [key, value] pairs sorted by value descending



6609
6610
6611
# File 'lib/parse/query.rb', line 6609

def sort_by_value_desc
  @results.sort_by { |k, v| v }.reverse
end

#to_hHash

Return the raw hash results

Returns:

  • (Hash)

    the grouped results



6580
6581
6582
# File 'lib/parse/query.rb', line 6580

def to_h
  @results
end

#to_sorted_hash(sorted_pairs) ⇒ Hash

Convert sorted results back to a hash

Parameters:

  • sorted_pairs (Array<Array>)

    array of [key, value] pairs

Returns:

  • (Hash)

    sorted results as hash



6616
6617
6618
# File 'lib/parse/query.rb', line 6616

def to_sorted_hash(sorted_pairs)
  sorted_pairs.to_h
end

#to_table(format: :ascii, headers: nil) ⇒ String

Convert grouped results to a formatted table.

Examples:

Document.group_by(:category, sortable: true).count.to_table
Document.group_by(:category).sum(:file_size).to_table(headers: ["Category", "Total Size"])

Parameters:

  • format (Symbol) (defaults to: :ascii)

    output format (:ascii, :csv, :json)

  • headers (Array<String>, nil) (defaults to: nil)

    custom headers; if nil, defaults to ["Group", ] where the second header reflects the aggregation operation (e.g. "Average" for avg/average, "Sum" for sum, "Min"/"Max" for min/max, "Items" for list, "Count" otherwise).

Returns:

  • (String)

    formatted table



6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
# File 'lib/parse/query.rb', line 6629

def to_table(format: :ascii, headers: nil)
  headers ||= ["Group", default_value_header]
  pairs = @results.to_a

  # Build table data
  table_data = {
    headers: headers,
    rows: pairs.map { |key, value| [format_group_key(key), format_group_value(value)] },
  }

  # Format based on requested format
  case format
  when :ascii
    format_grouped_ascii_table(table_data)
  when :csv
    format_grouped_csv_table(table_data)
  when :json
    format_grouped_json_table(table_data)
  else
    raise ArgumentError, "Unsupported format: #{format}. Use :ascii, :csv, or :json"
  end
end