class RailsConnector::Meta::EagerLoader

Attributes

obj_classes[R]

Public Class Methods

new() click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 10
def initialize
  # Rails.logger.debug "EagerLoader: I am eager to start working"
  @obj_classes = {}
  # Rails 3.1 contains a bug that screws attribute loading
  # attributes are set to assigned classes
  if ::Rails::VERSION::MAJOR == 3 && ::Rails::VERSION::MINOR == 1
    RailsConnector::ObjClass.all.each do |obj_class|
      obj_class.custom_attributes
      @obj_classes[obj_class.name] = obj_class
    end
  else
    RailsConnector::ObjClass.includes(:custom_attributes_raw).all.each do |obj_class|
      @obj_classes[obj_class.name] = obj_class
    end
    preload_attribute_blobs
  end
end

Public Instance Methods

forget_obj_class(name) click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 38
def forget_obj_class(name)
  @obj_classes.delete(name.to_s)
end
obj_class(name) click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 28
def obj_class(name)
  name = name.to_s
  if !@obj_classes.fetch(name, nil).nil?
    @obj_classes[name]
  else
    # TODO: preload_attribute_blobs for obj_class
    @obj_classes[name] ||= RailsConnector::ObjClass.find_by_obj_class_name(name)
  end
end

Protected Instance Methods

preload_attribute_blobs() click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 43
def preload_attribute_blobs
  attribute_names = Set.new
  @obj_classes.each do |_, obj_class|
    obj_class.custom_attributes.each do |attribute_name, _|
      attribute_names << attribute_name
    end
  end

  blob_names = attribute_names.map {|attribute_name| "#{attribute_name}.jsonAttributeDict" }
  # Fiona >= 6.8
  if RailsConnector::BlobMapping.exists?
    blob_names               = attribute_names.map {|attribute_name| "#{attribute_name}.jsonAttributeDict" }
    fingerprint_map          = RailsConnector::BlobMapping.get_fingerprint_map(blob_names)
    blob_fingerprints        = fingerprint_map.values
    # NOTE: this is correct!
    blobs                    = RailsConnector::Blob.where(:blob_name => blob_fingerprints).to_a
    blob_map                 = Hash[blobs.map {|b| [b.blob_name, b]}]

    @obj_classes.each do |_, obj_class|
      obj_class.custom_attributes.each do |_, attribute|
        blob_name   = "#{attribute.name}.jsonAttributeDict"
        fingerprint = fingerprint_map[blob_name]
        blob        = blob_map[fingerprint]

        next unless blob && blob.blob_data?
        attribute.instance_variable_set(:@blob_data, ::JSON.parse(blob.blob_data))
      end
    end
  # Fiona = 6.7
  else
    blob_names               = attribute_names.map {|attribute_name| "#{attribute_name}.jsonAttributeDict" }
    blobs                    = RailsConnector::Blob.where(:blob_name => blob_names).to_a
    blob_map                 = Hash[blobs.map {|b| [b.blob_name, b]}]

    @obj_classes.each do |_, obj_class|
      obj_class.custom_attributes.each do |_, attribute|
        blob_name   = "#{attribute.name}.jsonAttributeDict"
        blob        = blob_map[blob_name]

        next unless blob && blob.blob_data?
        attribute.instance_variable_set(:@blob_data, ::JSON.parse(blob.blob_data))
      end
    end
  end
end