over-datanamelen-bug fixed
This commit is contained in:
parent
3ba285548c
commit
f6b9579073
1 changed files with 37 additions and 13 deletions
|
@ -32,13 +32,36 @@ class SmqlToAR
|
||||||
end
|
end
|
||||||
|
|
||||||
class Aliases < Hash
|
class Aliases < Hash
|
||||||
def self.new prefix, *a, &e
|
attr_accessor :counter, :prefix
|
||||||
e ||= lambda do |h, k|
|
|
||||||
j = Array.wrap( k).compact
|
def initialize prefix, *a, &e
|
||||||
h[k] = h.key?(j) ? h[j] : "#{prefix},#{j.collect( &:to_alias).join( ',')}"
|
@counter, @prefix = 0, prefix || 'smql'
|
||||||
end
|
|
||||||
super *a, &e
|
super *a, &e
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def format name
|
||||||
|
pre, suf = name.split( ',', 2)
|
||||||
|
return name unless suf
|
||||||
|
pre += ",#{@counter += 1},"
|
||||||
|
l = 60-pre.length
|
||||||
|
n = suf[(suf.length<=l ? 0 : -l)..-1]
|
||||||
|
n == suf ? pre+n : "#{pre},,,#{n}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def name n
|
||||||
|
n.collect( &:to_alias).join ','
|
||||||
|
end
|
||||||
|
|
||||||
|
def [] k
|
||||||
|
n = name k
|
||||||
|
v = super n
|
||||||
|
v = self[k] = format( "#{prefix},#{n}") unless v
|
||||||
|
v
|
||||||
|
end
|
||||||
|
|
||||||
|
def []= k, v
|
||||||
|
super name( k), v
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
attr_reader :table_alias, :model, :table_model, :base_table, :_where, :_select, :_wobs, :_joins, :prefix, :_vid
|
attr_reader :table_alias, :model, :table_model, :base_table, :_where, :_select, :_wobs, :_joins, :prefix, :_vid
|
||||||
|
@ -48,7 +71,7 @@ class SmqlToAR
|
||||||
@prefix = "smql"
|
@prefix = "smql"
|
||||||
@logger = SmqlToAR.logger
|
@logger = SmqlToAR.logger
|
||||||
@table_alias = Aliases.new @prefix
|
@table_alias = Aliases.new @prefix
|
||||||
@_vid, @_where, @_wobs, @model, @quoter = 0, SmqlToAR::And[], {}, model, model.connection
|
@_vid, @_where, @_wobs, @model, @quote = 0, SmqlToAR::And[], {}, model, model.connection
|
||||||
@base_table = [Column::Col.new( model.table_name)]
|
@base_table = [Column::Col.new( model.table_name)]
|
||||||
@table_alias[ @base_table] = @base_table.first
|
@table_alias[ @base_table] = @base_table.first
|
||||||
t = quote_table_name @base_table.first.col
|
t = quote_table_name @base_table.first.col
|
||||||
|
@ -77,7 +100,7 @@ class SmqlToAR
|
||||||
end
|
end
|
||||||
|
|
||||||
def quote_column_name name
|
def quote_column_name name
|
||||||
@quoter.quote_column_name( name).gsub /"\."/, ','
|
@quote.quote_column_name( name).gsub /"\."/, ','
|
||||||
end
|
end
|
||||||
|
|
||||||
def quote_table_name name
|
def quote_table_name name
|
||||||
|
@ -85,7 +108,7 @@ class SmqlToAR
|
||||||
when Array, Column::Col then @table_alias[Array.wrap name]
|
when Array, Column::Col then @table_alias[Array.wrap name]
|
||||||
else name.to_s
|
else name.to_s
|
||||||
end
|
end
|
||||||
@quoter.quote_table_name( name).gsub /"\."/, ','
|
@quote.quote_table_name name
|
||||||
end
|
end
|
||||||
|
|
||||||
def column table, name
|
def column table, name
|
||||||
|
@ -93,7 +116,7 @@ class SmqlToAR
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_join orig, pretable, table, prekey, key
|
def build_join orig, pretable, table, prekey, key
|
||||||
" LEFT JOIN #{orig} AS #{quote_table_name table} ON #{column pretable, prekey} = #{column table, key} "
|
"\tLEFT JOIN #{orig} AS #{quote_table_name table}\n\tON #{column pretable, prekey} = #{column table, key}\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
def sub_joins table, col, model, query
|
def sub_joins table, col, model, query
|
||||||
|
@ -104,7 +127,8 @@ class SmqlToAR
|
||||||
def join_ table, model, query, pretable = nil
|
def join_ table, model, query, pretable = nil
|
||||||
pretable ||= table[0...-1]
|
pretable ||= table[0...-1]
|
||||||
@table_model[ table] = model
|
@table_model[ table] = model
|
||||||
premodel = @table_model[ pretable]
|
@table_model.rehash
|
||||||
|
premodel = @table_model.find {|k,v| pretable == k }[1]
|
||||||
t = @table_alias[ table]
|
t = @table_alias[ table]
|
||||||
pt = quote_table_name table[ 0...-1]
|
pt = quote_table_name table[ 0...-1]
|
||||||
refl = premodel.reflections[table.last.to_sym]
|
refl = premodel.reflections[table.last.to_sym]
|
||||||
|
@ -124,7 +148,7 @@ class SmqlToAR
|
||||||
when :belongs_to
|
when :belongs_to
|
||||||
@_joins += build_join query, pretable, t, refl.primary_key_name, premodel.primary_key
|
@_joins += build_join query, pretable, t, refl.primary_key_name, premodel.primary_key
|
||||||
when :has_and_belongs_to_many
|
when :has_and_belongs_to_many
|
||||||
jointable = [Column::Col.new('')] + table
|
jointable = [','] + table
|
||||||
@_joins += build_join refl.options[:join_table], pretable, @table_alias[jointable], premodel.primary_key, refl.primary_key_name
|
@_joins += build_join refl.options[:join_table], pretable, @table_alias[jointable], premodel.primary_key, refl.primary_key_name
|
||||||
@_joins += build_join query, jointable, t, refl.association_foreign_key, refl.association_primary_key
|
@_joins += build_join query, jointable, t, refl.association_foreign_key, refl.association_primary_key
|
||||||
else raise BuilderError, "Unkown reflection macro: #{refl.macro.inspect}"
|
else raise BuilderError, "Unkown reflection macro: #{refl.macro.inspect}"
|
||||||
|
@ -195,7 +219,7 @@ class SmqlToAR
|
||||||
|
|
||||||
class SubBuilder < Array
|
class SubBuilder < Array
|
||||||
attr_reader :parent, :_where
|
attr_reader :parent, :_where
|
||||||
delegate :wobs, :joins, :includes, :sub_joins, :vid, :quote_column_name, :quoter, :quote_table_name, :column, :to => :parent
|
delegate :wobs, :joins, :includes, :sub_joins, :vid, :quote_column_name, :quote, :quote_table_name, :column, :to => :parent
|
||||||
|
|
||||||
def initialize parent, tmp = false
|
def initialize parent, tmp = false
|
||||||
@parent = parent
|
@parent = parent
|
||||||
|
@ -244,7 +268,7 @@ class SmqlToAR
|
||||||
def default() SmqlToAR::And end
|
def default() SmqlToAR::And end
|
||||||
def default_new( parent) default.new self, parent, false end
|
def default_new( parent) default.new self, parent, false end
|
||||||
def collect_build_where
|
def collect_build_where
|
||||||
collect {|x| "( #{x.respond_to?( :build_where) ? x.build_where : x.to_s } )" }
|
collect {|x| x.respond_to?( :build_where) ? x.build_where : x.to_s }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue