このコミットが含まれているのは:
2026-10-27 01:11:13 +09:00
コミット 30b5fe5f05
17個のファイルの変更、766行の追加、168行の削除
+37 -8
ファイルの表示
@@ -41,17 +41,29 @@ class CountsTableQuery
def call
ApplicationRecord.transaction do
metadata.merge(mode == 'summary' ? summary : details)
result = metadata.merge(mode == 'summary' ? summary : details)
visible = mode == 'summary' ? result[:visible_output_count] : result[:count]
# A scalar result has one row regardless of private attributes or predicates.
public_count = result[:excluded_count].zero? || (mode == 'summary' && axes.rows.empty?)
result.merge(visible_output_count: visible,
output_count: public_count ? visible : nil,
output_count_scope: public_count ?
'before_authorisation' : 'unavailable_private_history',
output_count_unit: 'table_body_rows',
page_grand_total_repeated: mode == 'summary' && axes.rows.any? &&
result[:group_count] > limit)
end
end
def metadata
{ population_count_scope: 'all_recorded_versions', population_count: HistoryAccess.population_count(@definition.model),
page:, limit:, execution_at: population.at.iso8601(6), at: @params['at'].presence,
definition: population.history ? 'history' : 'latest',
timezone: population.timezone.identifier, rows: axes.rows, cols: axes.columns,
fields: @definition.metadata,
count: population.scope.except(:select).optimizer_hints('MAX_EXECUTION_TIME(10000)').count }
@population_counts ||= HistoryAccess.population_counts(@definition.model)
@population_counts.merge(
population_count_scope: 'all_recorded_versions',
page:, limit:, execution_at: population.at.iso8601(6), at: @params['at'].presence,
definition: population.history ? 'history' : 'latest',
timezone: population.timezone.identifier, rows: axes.rows, cols: axes.columns,
fields: @definition.metadata,
count: population.scope.except(:select).optimizer_hints('MAX_EXECUTION_TIME(10000)').count)
end
def summary
@@ -143,7 +155,9 @@ class CountsTableQuery
column_headers = [{ values: [], kind: 'grand_total' }]
end
totals = CountsPivotTotals.new(population, axes, row_headers, column_headers).call
{ group_count: total, column_values:, row_headers:, column_headers:, pivot_totals: totals,
{ group_count: total,
visible_output_count: output_row_count(prefix, row_keys, row_depths, total),
column_values:, row_headers:, column_headers:, pivot_totals: totals,
cells: records.map do |row|
{ values: axes.all.each_index.map { row["a#{ _1 }"] }, count: row['count'].to_i }
end, axis_labels: axis_labels(records, column_values) }
@@ -192,6 +206,21 @@ class CountsTableQuery
private
def output_row_count(prefix, row_keys, depths, total)
# With no row axes the table has exactly one body row, including the zero-count case.
return 1 if row_keys.empty?
subtotals = depths.map do |depth|
keys = row_keys.first(depth).join(', ')
"(SELECT COUNT(*) FROM (SELECT #{ keys } FROM cells GROUP BY #{ keys }) subtotal_rows)"
end
expressions = [total.to_s, '1'] + subtotals
@output_row_count ||= @connection.select_value(<<~SQL).to_i
#{ prefix }
SELECT /*+ MAX_EXECUTION_TIME(10000) */ #{ expressions.join(' + ') } AS output_rows
SQL
end
def locale = @locale ||= Locale.find_by!(code: @params.fetch('locale', 'ja'))
def limited_columns(prefix)