Class: RivetCms::RevisionPreloader

Inherits:
Object
  • Object
show all
Defined in:
app/serializers/rivet_cms/revision_preloader.rb

Overview

Bulk-loads everything RevisionSerializer needs for a set of revisions in a constant number of queries, regardless of page size. Components cannot nest, so the owner tree is bounded: revision -> component instances -> values/relations. When populate_fields are given, target documents' revisions are loaded and preloaded the same way (one level deep).

Instance Method Summary collapse

Constructor Details

#initialize(revisions, populate_fields: [], preview: false) ⇒ RevisionPreloader

Returns a new instance of RevisionPreloader.



8
9
10
11
12
13
14
15
16
17
18
19
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 8

def initialize(revisions, populate_fields: [], preview: false)
  @revisions = Array(revisions).compact
  @populate_field_ids = populate_fields.map(&:id).to_set
  @preview = preview
  @values = {}
  @relations = {}
  @instances = {}
  @fields_by_content_type = {}
  @fields_by_component = {}
  @target_revision_by_document_id = {}
  load_all
end

Instance Method Details

#component_instances(owner, field) ⇒ Object



41
42
43
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 41

def component_instances(owner, field)
  @instances.dig(owner_key(owner), field.id) || []
end

#document_for(revision) ⇒ Object



21
22
23
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 21

def document_for(revision)
  revision.document
end

#fields_for_component(component_id) ⇒ Object



29
30
31
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 29

def fields_for_component(component_id)
  @fields_by_component[component_id] || []
end

#fields_for_content_type(content_type_id) ⇒ Object



25
26
27
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 25

def fields_for_content_type(content_type_id)
  @fields_by_content_type[content_type_id] || []
end

#relations(owner, field) ⇒ Object



37
38
39
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 37

def relations(owner, field)
  @relations.dig(owner_key(owner), field.id) || []
end

#target_revision(document_id) ⇒ Object



45
46
47
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 45

def target_revision(document_id)
  @target_revision_by_document_id[document_id]
end

#value(owner, field) ⇒ Object



33
34
35
# File 'app/serializers/rivet_cms/revision_preloader.rb', line 33

def value(owner, field)
  @values.dig(owner_key(owner), field.id)
end