class NativesonContainer
Constants
- ALLOWED_ATTRIBUTES
- CONTAINER_TYPES
Attributes
all_columns[RW]
all_reflections_by_name[RW]
columns_string[RW]
container_type[RW]
parent[RW]
query[RW]
reflection[RW]
sql[RW]
Public Class Methods
new(container_type: , query: , parent: nil, name: nil)
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 10 def initialize(container_type: , query: , parent: nil, name: nil) @parent = parent @container_type = container_type @associations = {} @query = query query[:klass].is_a?(String) ? @klass = self.class.const_get(query[:klass]) : @klass = query[:klass] @columns = query[:columns] @name = name.to_s get_all_columns select_columns get_all_reflections get_parent_table get_foreign_key ALLOWED_ATTRIBUTES.each do |i| if i == :associations next unless query[i] query[i].each_pair { |k,v| create_association(k, v) } elsif [:klass, :columns].include?(i) next else instance_variable_set("@#{i}", query[i]) end end end
Public Instance Methods
create_association(association_name, association_query)
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 35 def create_association(association_name, association_query) @associations[association_name] = NativesonContainer.new(container_type: :association, query: association_query, parent: self, name: association_name) end
generate_association_sql(name, prefix, tmp_sql)
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 69 def generate_association_sql(name, prefix, tmp_sql) " ( SELECT JSON_AGG(tmp_#{@klass.table_name} ) FROM ( SELECT #{@columns_string} #{" , " + tmp_sql unless tmp_sql.blank?} FROM #{@klass.table_name} WHERE #{@foreign_key} = #{@parent_table} #{'AND ' + @where.to_s unless @where.blank?} #{'ORDER BY ' + @order.to_s unless @order.blank?} #{'LIMIT ' + @limit.to_s unless @limit.blank?} ) tmp_#{@klass.table_name} ) AS #{name} ".split("\n").map { |i| "#{prefix}#{i}" }.join("\n") end
generate_base_sql()
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 85 def generate_base_sql " SELECT JSON_AGG(t) FROM ( SELECT #{@columns_string} #{" , " + @sql unless @sql.blank?} FROM #{@klass.table_name} AS base_table #{'WHERE ' + @where.to_s unless @where.blank?} #{'ORDER BY ' + @order.to_s unless @order.blank?} #{'LIMIT ' + @limit.to_s unless @limit.blank?} ) t; " end
generate_sql(prefix = '')
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 100 def generate_sql(prefix = '') prefix << " " @sql = '' @associations.each_pair do |association_name,association_data| tmp_sql = association_data.generate_association_sql(association_name, prefix, association_data.generate_sql(prefix)) @sql.blank? ? @sql << tmp_sql : @sql << " , #{tmp_sql}" end @sql = generate_base_sql if @parent.nil? @sql end
get_all_columns()
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 111 def get_all_columns @all_columns = {} @klass.columns.each { |i| @all_columns[i.name] = i } end
get_all_reflections()
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 116 def get_all_reflections @all_reflections_by_name = @klass.reflections end
get_foreign_key()
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 52 def get_foreign_key @foreign_key = nil return @foreign_key if @parent.nil? raise ArgumentError.new("#{__method__} :: #{@name} can't be found in #{@parent.name} reflections") unless @parent.all_reflections_by_name.key?(@name) @foreign_key = @parent.all_reflections_by_name[@name].foreign_key end
get_parent_table()
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 59 def get_parent_table if @parent.nil? @parent_table = @klass.table_name elsif @parent.container_type == :base @parent_table = "base_table.#{@klass.primary_key}" else @parent_table = "#{@parent.klass.table_name}.#{@parent.klass.primary_key}" end end
select_columns()
click to toggle source
# File lib/nativeson/nativeson_container.rb, line 39 def select_columns @columns_string = '' if @columns.blank? @columns_string << '*' else @columns.each_with_index do |column,idx| raise ArgumentError.new("#{__method__} :: column '#{column}' wasn't found in the ActiveRecord #{@klass.name} columns") unless all_columns.key?(column) @columns_string << ' , ' if idx > 0 @columns_string << column end end end