squeel 0.5.0 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/README.rdoc +115 -39
  2. data/lib/squeel/adapters/active_record.rb +22 -5
  3. data/lib/squeel/adapters/active_record/3.0/association_preload.rb +15 -0
  4. data/lib/squeel/adapters/active_record/3.0/compat.rb +143 -0
  5. data/lib/squeel/adapters/active_record/3.0/context.rb +67 -0
  6. data/lib/squeel/adapters/active_record/3.0/join_association.rb +54 -0
  7. data/lib/squeel/adapters/active_record/3.0/join_dependency.rb +84 -0
  8. data/lib/squeel/adapters/active_record/3.0/relation.rb +327 -0
  9. data/lib/squeel/adapters/active_record/context.rb +67 -0
  10. data/lib/squeel/adapters/active_record/join_association.rb +10 -56
  11. data/lib/squeel/adapters/active_record/join_dependency.rb +22 -7
  12. data/lib/squeel/adapters/active_record/preloader.rb +21 -0
  13. data/lib/squeel/adapters/active_record/relation.rb +84 -38
  14. data/lib/squeel/context.rb +38 -0
  15. data/lib/squeel/dsl.rb +1 -1
  16. data/lib/squeel/nodes/join.rb +18 -0
  17. data/lib/squeel/nodes/key_path.rb +2 -2
  18. data/lib/squeel/nodes/stub.rb +5 -1
  19. data/lib/squeel/version.rb +1 -1
  20. data/lib/squeel/visitors.rb +2 -2
  21. data/lib/squeel/visitors/{order_visitor.rb → attribute_visitor.rb} +1 -2
  22. data/lib/squeel/visitors/predicate_visitor.rb +13 -11
  23. data/lib/squeel/visitors/symbol_visitor.rb +48 -0
  24. data/spec/helpers/squeel_helper.rb +17 -1
  25. data/spec/spec_helper.rb +31 -0
  26. data/spec/squeel/adapters/active_record/context_spec.rb +50 -0
  27. data/spec/squeel/adapters/active_record/join_association_spec.rb +1 -1
  28. data/spec/squeel/adapters/active_record/join_depdendency_spec.rb +1 -1
  29. data/spec/squeel/adapters/active_record/relation_spec.rb +166 -25
  30. data/spec/squeel/dsl_spec.rb +6 -6
  31. data/spec/squeel/nodes/join_spec.rb +16 -3
  32. data/spec/squeel/nodes/stub_spec.rb +12 -0
  33. data/spec/squeel/visitors/{order_visitor_spec.rb → attribute_visitor_spec.rb} +4 -5
  34. data/spec/squeel/visitors/predicate_visitor_spec.rb +18 -6
  35. data/spec/squeel/visitors/symbol_visitor_spec.rb +42 -0
  36. data/squeel.gemspec +2 -2
  37. metadata +21 -13
  38. data/lib/squeel/contexts/join_dependency_context.rb +0 -74
  39. data/lib/squeel/visitors/select_visitor.rb +0 -103
  40. data/spec/squeel/contexts/join_dependency_context_spec.rb +0 -43
  41. data/spec/squeel/visitors/select_visitor_spec.rb +0 -115
@@ -1,43 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Squeel
4
- module Contexts
5
- describe JoinDependencyContext do
6
- before do
7
- @jd = ActiveRecord::Associations::JoinDependency.
8
- new(Person, {
9
- :children => {
10
- :children => {
11
- :parent => :parent
12
- }
13
- }
14
- }, [])
15
- @c = JoinDependencyContext.new(@jd)
16
- end
17
-
18
- it 'finds associations' do
19
- last_association = @jd.join_parts.last
20
- next_to_last_association = @jd.join_parts[-2]
21
-
22
- @c.find(:parent, next_to_last_association).should eq last_association
23
- end
24
-
25
- it 'contextualizes join parts with the proper alias' do
26
- table = @c.contextualize @jd.join_parts.last
27
- table.table_alias.should eq 'parents_people_2'
28
- end
29
-
30
- it 'contextualizes symbols as a generic table' do
31
- table = @c.contextualize :table
32
- table.name.should eq 'table'
33
- table.table_alias.should be_nil
34
- end
35
-
36
- it 'contextualizes non-JoinPart/Symbols to the default join base table' do
37
- table = @c.contextualize nil
38
- table.name.should eq 'people'
39
- table.table_alias.should be_nil
40
- end
41
- end
42
- end
43
- end
@@ -1,115 +0,0 @@
1
- module Squeel
2
- module Visitors
3
- describe SelectVisitor do
4
-
5
- before do
6
- @jd = ActiveRecord::Associations::JoinDependency.
7
- new(Person, {
8
- :children => {
9
- :children => {
10
- :parent => :parent
11
- }
12
- }
13
- }, [])
14
- @c = Squeel::Contexts::JoinDependencyContext.new(@jd)
15
- @v = SelectVisitor.new(@c)
16
- end
17
-
18
- it 'creates a bare ARel attribute given a symbol with no asc/desc' do
19
- attribute = @v.accept(:name)
20
- attribute.should be_a Arel::Attribute
21
- attribute.name.should eq :name
22
- attribute.relation.name.should eq 'people'
23
- end
24
-
25
- it 'creates the select against the proper table for nested hashes' do
26
- selects = @v.accept({
27
- :children => {
28
- :children => {
29
- :parent => {
30
- :parent => :name
31
- }
32
- }
33
- }
34
- })
35
- selects.should be_a Array
36
- select = selects.first
37
- select.should be_a Arel::Attribute
38
- select.relation.table_alias.should eq 'parents_people_2'
39
- end
40
-
41
- it 'will not alter values it is unable to accept' do
42
- select = @v.accept(['THIS PARAMETER', 'WHAT DOES IT MEAN???'])
43
- select.should eq ['THIS PARAMETER', 'WHAT DOES IT MEAN???']
44
- end
45
-
46
- it 'treats keypath keys like nested hashes' do
47
- select = @v.accept(Nodes::Stub.new(:children).children.parent.parent.name)
48
- select.should be_a Arel::Attribute
49
- select.relation.table_alias.should eq 'parents_people_2'
50
- end
51
-
52
- it 'honors absolute keypaths' do
53
- selects = @v.accept(dsl{{children => {children => ~children.children.name}}})
54
- selects.should be_a Array
55
- select = selects.first
56
- select.should be_a Arel::Attribute
57
- select.relation.table_alias.should eq 'children_people_2'
58
- end
59
-
60
- it 'allows hashes with keypath keys' do
61
- selects = @v.accept(Nodes::Stub.new(:children).children.parent.parent => :name)
62
- selects.should be_a Array
63
- select = selects.first
64
- select.should be_a Arel::Attribute
65
- select.relation.table_alias.should eq 'parents_people_2'
66
- end
67
-
68
- it 'creates an ARel NamedFunction node for a Function node' do
69
- function = @v.accept(:find_in_set.func())
70
- function.should be_a Arel::Nodes::NamedFunction
71
- end
72
-
73
- it 'maps symbols in Function args to ARel attributes' do
74
- function = @v.accept(:find_in_set.func(:id, '1,2,3'))
75
- function.to_sql.should match /find_in_set\("people"."id", '1,2,3'\)/
76
- end
77
-
78
- it 'accepts keypaths as function args' do
79
- function = @v.accept(dsl{find_in_set(children.children.id, '1,2,3')})
80
- function.to_sql.should match /find_in_set\("children_people_2"."id", '1,2,3'\)/
81
- end
82
-
83
- it 'sets the alias on the ARel NamedFunction from the Function alias' do
84
- function = @v.accept(:find_in_set.func(:id, '1,2,3').as('newname'))
85
- function.to_sql.should match /newname/
86
- end
87
-
88
- it 'creates an ARel Addition node for an Operation node with + as operator' do
89
- operation = @v.accept(dsl{id + 1})
90
- operation.should be_a Arel::Nodes::Addition
91
- end
92
-
93
- it 'creates an ARel Subtraction node for an Operation node with - as operator' do
94
- operation = @v.accept(dsl{id - 1})
95
- operation.should be_a Arel::Nodes::Subtraction
96
- end
97
-
98
- it 'creates an ARel Multiplication node for an Operation node with * as operator' do
99
- operation = @v.accept(dsl{id * 1})
100
- operation.should be_a Arel::Nodes::Multiplication
101
- end
102
-
103
- it 'creates an ARel Division node for an Operation node with / as operator' do
104
- operation = @v.accept(dsl{id / 1})
105
- operation.should be_a Arel::Nodes::Division
106
- end
107
-
108
- it 'sets the alias on an InfixOperation from the Operation alias' do
109
- operation = @v.accept(dsl{(id + 1).as(:incremented_id)})
110
- operation.to_sql.should match /incremented_id/
111
- end
112
-
113
- end
114
- end
115
- end