v0.0.5.2. build-methods renamed to an underscored class-name with suffix _build and aliases build to these methods created. equal_join_build fixed; it never use col.joins.each. #foreigh_key

master v0.0.5.2
Denis Knauf 2012-01-17 10:52:31 +01:00
parent fbf5a7019c
commit ce81d21bd8
3 changed files with 33 additions and 23 deletions

View File

@ -1 +1 @@
0.0.5.1
0.0.5.2

View File

@ -153,7 +153,7 @@ class SmqlToAR
# 2) {"givenname=", ["Peter", "Hans"]} #=> ( givenname = 'Peter' OR givenname = 'Hans' )
# 3) {"givenname|surname=", ["Peter", "Mueller"]}
# #=> ( givenname = 'Peter' OR surname = 'Peter' ) AND ( givenname = 'Mueller' OR surname = 'Mueller' )
def build builder, table
def condition_build builder, table
values = Hash[ @value.collect {|value| [ builder.vid, value ] } ]
values.each {|k, v| builder.wobs k.to_sym => v }
if 1 == @cols.length
@ -174,6 +174,7 @@ class SmqlToAR
end
self
end
alias build condition_build
end
class NotInRange < Condition
@ -190,7 +191,7 @@ class SmqlToAR
super model, cols, val
end
def build builder, table
def not_in_range_build builder, table
builder.wobs (v1 = builder.vid).to_sym => @value.begin, (v2 = builder.vid).to_sym => @value.end
@cols.each do |col|
col.joins builder, table
@ -198,11 +199,12 @@ class SmqlToAR
end
self
end
alias build not_in_range_build
end
InRange = simple_condition NotInRange, '..', '%s BETWEEN %s AND %s'
class NotOverlaps < Condition
Operator, Where = '<!>', 'NOT (%s, %s) OVERLAPS (%s, %s)'
class Overlaps < Condition
Operator, Where = '<=>', '(%s, %s) OVERLAPS (%s, %s)'
Expected = [Range, lambda {|val|
Array === val && 2 == val.length &&
[Time, Date, String].any? {|v|v===val[0]} &&
@ -225,7 +227,7 @@ class SmqlToAR
super model, cols, val
end
def build builder, table
def overlaps_build builder, table
builder.wobs (v1 = builder.vid).to_sym => @value.begin, (v2 = builder.vid).to_sym => @value.end
v1 = "TIMESTAMP #{v1}"
v2 = "TIMESTAMP #{v2}"
@ -236,15 +238,16 @@ class SmqlToAR
builder.column( table+f.path, f.col), builder.column( table+s.path, s.col), v1, v2]
end
end
alias build overlaps_build
end
Overlaps = simple_condition NotOverlaps, '<=>', '(%s, %s) OVERLAPS (%s, %s)'
NotOverlaps = simple_condition Overlaps, '<=>', 'NOT (%s, %s) OVERLAPS (%s, %s)'
class NotIn < Condition
Operator = '!|='
Where = "%s NOT IN (%s)"
Expected = [Array]
def build builder, table
def not_in_build builder, table
builder.wobs (v = builder.vid).to_sym => @value
@cols.each do |col|
col.joins builder, table
@ -252,6 +255,7 @@ class SmqlToAR
end
self
end
alias build not_in_build
end
In = simple_condition NotIn, '|=', '%s IN (%s)', [Array]
@ -290,7 +294,7 @@ class SmqlToAR
raise_unless col.relation, NonExistingRelationError.new( %w[Relation], col)
end
def build builder, table
def equal_join_build builder, table
if 2 < @cols.first.second.length
b2, b3 = And, Or
else
@ -300,7 +304,7 @@ class SmqlToAR
@cols.each do |col, sub|
model, *sub = sub
t = table + col.path + [col.col]
col.joins.each {|j, m| builder.joins table+j, m }
col.joins builder, table
builder.joins t, model
b4 = b3.new( b2)
sub.each do |i|
@ -310,6 +314,7 @@ class SmqlToAR
end
self
end
alias build equal_join_build
end
# Takes to Queries.
@ -339,7 +344,7 @@ class SmqlToAR
raise_unless col.child?, ConColumnError.new( [:Column], col)
end
def build builder, table
def sub_equal_join_build builder, table
@cols.each do |col, sub|
t = table+col.to_a
builder.sub_joins t, col, *sub[0..1]
@ -348,6 +353,7 @@ class SmqlToAR
end
self
end
alias build sub_equal_join_build
end
=end
@ -372,7 +378,7 @@ class SmqlToAR
raise_unless col.exist_in? || SmqlToAR.model_of( col.last_model, col.col), NonExistingSelectableError.new( col)
end
def build builder, table
def select_build builder, table
@cols.each do |col|
if col.exist_in?
col.joins builder, table
@ -384,6 +390,7 @@ class SmqlToAR
end
self
end
alias build select_build
end
class Functions < Condition
@ -432,7 +439,7 @@ class SmqlToAR
super model, func, args
end
def build builder, table
def order_build builder, table
return if @args.blank?
@args.each do |o|
col, o = o
@ -442,26 +449,29 @@ class SmqlToAR
builder.order t, col.col, o
end
end
alias build order_build
end
class Limit < Function
Name = :limit
Expected = [Fixnum]
def build builder, table
def limit_build builder, table
raise_unless 1 == table.length, RootOnlyFunctionError.new( table)
builder.limit = Array.wrap(@args).first.to_i
end
alias build limit_build
end
class Offset < Function
Name = :offset
Expected = [Fixnum]
def build builder, table
def offset_build builder, table
raise_unless 1 == table.length, RootOnlyFunctionError.new( table)
builder.offset = Array.wrap(@args).first.to_i
end
alias build offset_build
end
def self.new model, col, val

View File

@ -135,25 +135,25 @@ class SmqlToAR
case refl
when ActiveRecord::Reflection::ThroughReflection
through = refl.through_reflection
throughtable = table[0...-1]+[Column::Col.new( through.name, table.last.as)]
srctable = throughtable+[Column::Col.new( refl.source_reflection.name, table.last.as)]
through_table = table[0...-1]+[Column::Col.new( through.name, table.last.as)]
srctable = through_table+[Column::Col.new( refl.source_reflection.name, table.last.as)]
@table_model[ srctable] = model
@table_alias[ table] = @table_alias[ srctable]
join_ throughtable, through.klass, quote_table_name( through.table_name)
join_ srctable, refl.klass, query, throughtable
join_ through_table, through.klass, quote_table_name( through.table_name)
join_ srctable, refl.klass, query, through_table
when ActiveRecord::Reflection::AssociationReflection
case refl.macro
when :has_many, :has_one
@_joins += build_join query, pretable, t, premodel.primary_key, refl.primary_key_name
@_joins += build_join query, pretable, t, premodel.primary_key, refl.foreign_key
when :belongs_to
@_joins += build_join query, pretable, t, refl.primary_key_name, premodel.primary_key
@_joins += build_join query, pretable, t, refl.foreign_key, premodel.primary_key
when :has_and_belongs_to_many
jointable = [Column::Col.new(',')] + 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.foreign_key
@_joins += build_join query, jointable, t, refl.association_foreign_key, refl.association_primary_key
else raise BuilderError, "Unkown reflection macro: #{refl.macro.inspect}"
end
else raise BuilderError, "Unkown reflection type: #{refl.class.name}"
else raise BuilderError, "Unkown reflection type: #{refl.class.name} #{refl.macro.inspect}"
end
self
end