Class: Serega::SeregaEngine::Level

Inherits:
Object
  • Object
show all
Defined in:
lib/serega/engine/level.rb

Overview

One serialization level: all objects serialized under a single plan and the result containers they fill. Objects from different parents that share a plan (e.g. every user's posts) accumulate into one level, so a named batch loader or preload runs once over the whole set. A deeper level (its own plan) loads separately.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(serializer) ⇒ Level

Returns a new instance of Level.

Parameters:



17
18
19
20
21
22
# File 'lib/serega/engine/level.rb', line 17

def initialize(serializer)
  @serializer = serializer
  @objects = []
  @containers = []
  @results = {}.compare_by_identity
end

Instance Attribute Details

#containersArray<Hash> (readonly)

Returns Result container per object (filled in place).

Returns:

  • (Array<Hash>)

    Result container per object (filled in place)



28
29
30
# File 'lib/serega/engine/level.rb', line 28

def containers
  @containers
end

#objectsArray (readonly)

Returns Objects serialized at this level.

Returns:

  • (Array)

    Objects serialized at this level



25
26
27
# File 'lib/serega/engine/level.rb', line 25

def objects
  @objects
end

Instance Method Details

#add(objects) ⇒ Array<Hash>

Accumulates a chunk of objects into this level, creating one empty result container per object. The containers are returned so the caller can hand them to its parent; they are filled in place later during #process.

Parameters:

  • objects (Array)

    objects serialized at this level

Returns:

  • (Array<Hash>)

    the created containers, aligned with objects



36
37
38
39
40
41
# File 'lib/serega/engine/level.rb', line 36

def add(objects)
  containers = Array.new(objects.size) { {} }
  @objects.concat(objects)
  @containers.concat(containers)
  containers
end

#fetch(loader) ⇒ Object

Loads a named batch loader once for this level's objects.

Parameters:

Returns:

  • (Object)

    Loaded values



52
53
54
# File 'lib/serega/engine/level.rb', line 52

def fetch(loader)
  @results[loader] ||= loader.load(@objects, @serializer.context)
end

#processvoid

This method returns an undefined value.

Resolves every attribute of this level onto the containers.



45
46
47
# File 'lib/serega/engine/level.rb', line 45

def process
  @serializer.process(self)
end