Class: SqlcachedClient::Resultset

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/sqlcached_client/resultset.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(entity_class, data, attachments = nil) ⇒ Resultset

Returns a new instance of Resultset.

Parameters:

  • entity_class (Class)
  • data (Array)

    or [ServerResponse]



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/sqlcached_client/resultset.rb', line 9

def initialize(entity_class, data, attachments = nil)
  # set entity class
  @entity_class = entity_class
  # build the entities
  ents = data.respond_to?(:entities) ? data.entities : data
  @entities = (ents || []).map do |item|
    if item.is_a?(Hash)
      entity_class.new(item)
    elsif item.is_a?(entity_class)
      item
    else
      raise "Cannot handle: #{item.inspect}"
    end
  end
  # record collection size
  @count = @entities.size
  # set up attachments
  set_entities_attachments(@entities, attachments, data.try(:attachments))
end

Instance Attribute Details

#countObject (readonly)

Returns the value of attribute count.



5
6
7
# File 'lib/sqlcached_client/resultset.rb', line 5

def count
  @count
end

#entitiesObject (readonly)

Returns the value of attribute entities.



5
6
7
# File 'lib/sqlcached_client/resultset.rb', line 5

def entities
  @entities
end

#entity_classObject (readonly)

Returns the value of attribute entity_class.



5
6
7
# File 'lib/sqlcached_client/resultset.rb', line 5

def entity_class
  @entity_class
end

Class Method Details

.build_associations(resultsets, server, session, max_depth, current_depth = 0) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/sqlcached_client/resultset.rb', line 31

def build_associations(resultsets, server, session, max_depth, current_depth = 0)
  if resultsets.any?
    batch = resultsets.map { |r| r._get_entities_association_requests }
    if batch.flatten.any?
      next_batch =
        server.run_query(
          session,
          server.build_request(
            batch
          )
        ).map.with_index do |resultset_data, i|
          resultsets[i]._fill_associations(resultset_data)
        end.flatten!
      if !max_depth || current_depth < max_depth
        build_associations(next_batch, server, session, max_depth,
          current_depth + 1)
      end
    end
  end
end

Instance Method Details

#[](i) ⇒ Object



57
58
59
# File 'lib/sqlcached_client/resultset.rb', line 57

def [](i)
  entities[i]
end

#_fill_associations(data) ⇒ Object



67
68
69
70
71
# File 'lib/sqlcached_client/resultset.rb', line 67

def _fill_associations(data)
  data.map.with_index do |entity_assoc_data, i|
    entities[i].set_associations_data(entity_assoc_data)
  end
end

#_get_entities_association_requestsObject



73
74
75
76
77
# File 'lib/sqlcached_client/resultset.rb', line 73

def _get_entities_association_requests
  entities.map do |entity|
    entity.get_association_requests
  end
end

#build_associations(max_depth = false) ⇒ Object



61
62
63
64
65
# File 'lib/sqlcached_client/resultset.rb', line 61

def build_associations(max_depth = false)
  entity_class.server_session do |server, session|
    self.class.build_associations([self], server, session, max_depth)
  end
end

#each(&block) ⇒ Object

class << self



53
54
55
# File 'lib/sqlcached_client/resultset.rb', line 53

def each(&block)
  block ? entities.each(&block) : entities.each
end

#set_entities_attachments(entities, attachments, contents) ⇒ Object



79
80
81
82
83
84
85
86
87
# File 'lib/sqlcached_client/resultset.rb', line 79

def set_entities_attachments(entities, attachments, contents)
  if attachments.is_a?(Array) && contents.is_a?(Array)
    entities.each_with_index do |entity, i|
      attachment = attachments[i]
      entity.send("#{attachment.name}=", attachment)
      attachment.content = contents[i] if attachment.respond_to?(:content=)
    end
  end
end

#store_attachments(attachment_name, server, session) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/sqlcached_client/resultset.rb', line 89

def store_attachments(attachment_name, server, session)
  entities_with_a = entities.select do |entity|
    !entity.send(attachment_name).nil?
  end
  server.store_attachments(
    session,
    server.build_store_attachments_request(
      entities_with_a.map { |e| e.attributes },
      entities_with_a.map { |e| e.send(attachment_name).to_save_format }
    )
  )
end