Module: Lore::Table_Selector

Defined in:
lib/lore/table_selector.rb

Overview

:nodoc:

Constant Summary collapse

@@logger =
Lore.logger

Class Method Summary collapse

Class Method Details

.build_joined_query(accessor, query_string = '', joined_tables = []) ⇒ Object

Extracted, recursive method for building the JOIN-part of a SELECT query.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/lore/table_selector.rb', line 16

def self.build_joined_query(accessor, query_string='', joined_tables=[])

  top_table        = accessor.table_name
  is_a_hierarchy   = accessor.get_joins()
  own_primary_keys = accessor.get_primary_keys()
  own_foreign_keys = accessor.get_foreign_keys()

  joined_accessors = (accessor.get_is_a_klasses).dup
  joined_accessors.update(accessor.get_aggregate_klasses)

  # predefine
  own_p_keys     = Hash.new
  foreign_p_keys = Hash.new
  on_string      = String.new
  field_counter  = 0

  is_a_hierarchy.each_pair { |foreign_table, foreign_base_tables|
    # JOIN base.table ON ( 
    if !(joined_tables.include?(foreign_table)) then

         foreign_p_keys = own_primary_keys[foreign_table]
         
         own_p_keys = own_foreign_keys[foreign_table]

         if !own_p_keys.nil? then
           
           joined_tables << foreign_table
           query_string << "\n JOIN #{foreign_table} on ("
           
           field_counter = 0
           on_string = ''
           foreign_p_keys.uniq.each { |foreign_field|
             
             # base.table.foreign_field = 
             on_string << "#{foreign_table}.#{foreign_field} = #{top_table}.#{own_p_keys[field_counter]}"
             # this.table.own_field
             
             if field_counter > 0 then   query_string << ", #{on_string}"
             else                        query_string << on_string
             end
             
             field_counter += 1
           } 
           
           query_string << ')'

         end
         
         # sub-joins of joined table:   
         query_string = build_joined_query(joined_accessors["#{top_table}.#{own_p_keys.first}"], 
                                           query_string, 
                                           joined_tables)
       end
  }
  return query_string
end