Class: DatabaseCore::V2::QueryRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/database-core/v2/query_runner.rb

Class Method Summary collapse

Class Method Details

.query(models_query) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/database-core/v2/query_runner.rb', line 5

def self.query models_query

  models_values = {}

  models_query.each do |model, query|

    sql = Query.build(model, query)

    values = ActiveRecord::Base.connection.exec_query(sql).map(&:as_json)

    if values.present?

      setup_relation values, query["has_one"], true
      setup_relation values, query["has_many"], false
    end

    models_values[model] = values
  end

  serialize(models_values)
end

.serialize(target) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/database-core/v2/query_runner.rb', line 81

def self.serialize(target)

  case target
  when Integer
    target > 2**32 ? target.to_s : target
  when String
    encodings = [Encoding::US_ASCII, Encoding::UTF_8]
    encodings.include?(target.encoding) ? target : target.bytes.to_a
  when Array
    target.map { |value| serialize(value) }
  when Hash
    target.transform_values { |value| serialize(value) }
  else
    target
  end
end

.setup_relation(parents, models_query, relation) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/database-core/v2/query_runner.rb', line 27

def self.setup_relation parents, models_query, relation

  return unless models_query.present?

  setup_relation_query(parents, models_query, relation)
  setup_relation_value(parents, models_query, relation)
end

.setup_relation_query(parents, models_query, relation) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/database-core/v2/query_runner.rb', line 35

def self.setup_relation_query parents, models_query, relation

  models_query.each do |model, query|

    next if query["has_one_key"].nil? && relation == true
    next if query["has_many_key"].nil? && relation == false

    foreign_key = relation ? "id" : query["has_many_key"]
    primary_key = relation ? query["has_one_key"] : "id"

    keys = parents.map{ |parent| parent[primary_key] }.uniq.compact

    next if keys.empty?

    query["in_value"] = {} if query["in_value"].nil?

    if query["in_value"][foreign_key]
      query["in_value"][foreign_key] << keys
      query["in_value"][foreign_key].flatten
    else
      query["in_value"][foreign_key] = keys
    end
  end
end

.setup_relation_value(parents, models_query, relation) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/database-core/v2/query_runner.rb', line 60

def self.setup_relation_value parents, models_query, relation

  models_values = query(models_query)

  parents.each do |parent|

    models_query.each do |model, query|

      next if query["has_one_key"].nil? && relation == true
      next if query["has_many_key"].nil? && relation == false

      foreign_key = relation ? "id" : query["has_many_key"]
      primary_key = relation ? query["has_one_key"] : "id"

      values = models_values[model].select{ |value| value[foreign_key] == parent[primary_key] }

      parent[model] = relation ? values.first : values
    end
  end
end