class RailsAiAdmin::Fields::Projection
One current projection, with no cross-request/identity value cache.
Constants
- MAX_OUTPUT_BYTES
- MAX_SECONDS
- MAX_VALUE_BYTES
Public Class Methods
Source
# File lib/rails_ai_admin/fields/projection.rb, line 11 def initialize(access, record, fields) @access, @record = access, record @fields = fields.index_by(&:name) @computed = fields.any?(&:virtual?) @cache = {} @bytes = 0 @deadline = monotonic + MAX_SECONDS end
Public Instance Methods
Source
# File lib/rails_ai_admin/fields/projection.rb, line 26 def value(field) check_deadline! raise AccessDenied unless @fields[field.name].equal?(field) return @cache[field.name] if @cache.key?(field.name) unless field.virtual? scalar = @access.read_attribute(@record, field) check_deadline! return @cache[field.name] = scalar end computed = ActiveRecord::Base.while_preventing_writes do dependencies = field.dependencies.to_h { |name| [ name.to_s, snapshot(value(@fields.fetch(name))) ] }.freeze check_bound!(dependencies) field.compute(dependencies, time_zone: @access.context.time_zone) end check_deadline! @bytes += check_bound!(computed) raise ConfigurationError, "Computed projection exceeds output bound" if @bytes > MAX_OUTPUT_BYTES @cache[field.name] = computed end
Source
# File lib/rails_ai_admin/fields/projection.rb, line 20 def values(fields: @fields.values) result = fields.to_h { |field| [ field.name.to_s, value(field) ] } check_deadline! result end