Module: Serega::SeregaPlanPoint::InstanceMethods

Included in:
Serega::SeregaPlanPoint
Defined in:
lib/serega/plan_point.rb

Overview

SeregaPlanPoint instance methods

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#attributeSeregaAttribute (readonly)

Shows current attribute

Returns:



20
21
22
# File 'lib/serega/plan_point.rb', line 20

def attribute
  @attribute
end

#child_planSeregaPlan? (readonly)

Shows child plan if exists

Returns:

  • (SeregaPlan, nil)

    Attribute serialization plan



24
25
26
# File 'lib/serega/plan_point.rb', line 24

def child_plan
  @child_plan
end

#modifiersHash (readonly)

Child fields to serialize

Returns:

  • (Hash)

    Attributes to serialize



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

def modifiers
  @modifiers
end

#planSeregaAttribute (readonly)

Link to current plan this point belongs to

Returns:



16
17
18
# File 'lib/serega/plan_point.rb', line 16

def plan
  @plan
end

Instance Method Details

#batch_loadersObject

Attribute batch_loaders



75
76
77
# File 'lib/serega/plan_point.rb', line 75

def batch_loaders
  attribute.batch_loaders
end

#child_object_serializerClass<SeregaObjectSerializer>

Returns object serializer class for child plan.

Returns:



129
130
131
# File 'lib/serega/plan_point.rb', line 129

def child_object_serializer
  serializer::SeregaObjectSerializer
end

#child_serializer(context:, **opts) ⇒ SeregaObjectSerializer?

Builds the object serializer that serializes this point's relation, or nil when the point has no child plan (a plain attribute). The point owns the static config (child plan, serializer class, many); the caller injects the runtime context and opts.

Parameters:

  • context (Hash)

    serialization context

  • opts (Hash)

    extra object-serializer options (e.g. the level queue)

Returns:



141
142
143
144
145
# File 'lib/serega/plan_point.rb', line 141

def child_serializer(context:, **opts)
  return unless child_plan

  child_object_serializer.new(context: context, plan: child_plan, many: many, **opts)
end

#initialize(plan, attribute, modifiers = nil) ⇒ SeregaPlanPoint

Initializes plan point

Parameters:

  • plan (SeregaPlan)

    Current plan this point belongs to

  • attribute (SeregaAttribute)

    Attribute to construct plan point

  • modifiers (defaults to: nil)

    Serialization parameters

Options Hash (modifiers):

  • :only (Hash)

    The only attributes to serialize

  • :except (Hash)

    Attributes to hide

  • :with (Hash)

    Hidden attributes to serialize additionally

Returns:



42
43
44
45
46
47
# File 'lib/serega/plan_point.rb', line 42

def initialize(plan, attribute, modifiers = nil)
  @plan = plan
  @attribute = attribute
  @modifiers = modifiers
  set_normalized_vars
end

#load_batches(level) ⇒ Hash?

Loads the batch loaders this point's value needs, each once for the whole level, and returns them keyed by loader name for #value to read from.

Parameters:

Returns:

  • (Hash, nil)

    loaded data per loader name, or nil when none are needed



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/serega/plan_point.rb', line 114

def load_batches(level)
  names = batch_loaders
  return if names.empty?

  loaders = self.class.serializer_class.batch_loaders
  names.each_with_object({}) do |name, batches|
    batches[name] = level.fetch(loaders[name])
  end
rescue => error
  SeregaUtils::SerializedAttributeError.call(error, self)
end

#manyObject

Attribute many option



63
64
65
# File 'lib/serega/plan_point.rb', line 63

def many
  attribute.many
end

#nameObject

Attribute name



57
58
59
# File 'lib/serega/plan_point.rb', line 57

def name
  attribute.name
end

#preloadsObject

Attribute preloads



81
82
83
# File 'lib/serega/plan_point.rb', line 81

def preloads
  attribute.preloads
end

#run_preloads(objects) ⇒ void

This method returns an undefined value.

Runs this point's declared preloads over the given objects using the serializer's registered preload handler.

Presenters are unwrapped first, as preload handlers work with the serialized objects themselves.

Parameters:

  • objects (Array)

    objects serialized at this point's level



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/serega/plan_point.rb', line 93

def run_preloads(objects)
  return unless preloads

  serializer_class = self.class.serializer_class
  objects = objects.map(&:__getobj__) if serializer_class.presenter

  handler = serializer_class.preload_with
  unless handler
    raise SeregaError, "The :preload option requires a preload handler. Register one with `preload_with` (the :activerecord_preloads plugin does this for you)."
  end

  handler.call(objects, preloads)
rescue => error
  SeregaUtils::SerializedAttributeError.call(error, self)
end

#serializerObject

Attribute serializer option



69
70
71
# File 'lib/serega/plan_point.rb', line 69

def serializer
  attribute.serializer
end

#value(obj, ctx, batches: nil) ⇒ Object

Attribute value



51
52
53
# File 'lib/serega/plan_point.rb', line 51

def value(obj, ctx, batches: nil)
  attribute.value(obj, ctx, batches: batches)
end