referrable_joins 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,26 +1,92 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
class Base
|
|
4
|
+
class << self
|
|
5
|
+
delegate :outer_joins, :inner_joins, :to => :scoped
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
3
9
|
module QueryMethods
|
|
4
|
-
|
|
5
|
-
|
|
10
|
+
|
|
11
|
+
attr_accessor :outer_joins_values, :inner_joins_values
|
|
12
|
+
|
|
13
|
+
def joins(*args)
|
|
14
|
+
relation = clone
|
|
15
|
+
|
|
16
|
+
args.flatten!
|
|
17
|
+
relation.inner_joins_values ||= []
|
|
18
|
+
relation.inner_joins_values += args unless args.blank?
|
|
19
|
+
|
|
20
|
+
relation
|
|
21
|
+
end
|
|
22
|
+
alias_method :inner_joins, :joins
|
|
23
|
+
|
|
24
|
+
def outer_joins(*args)
|
|
25
|
+
relation = clone
|
|
26
|
+
|
|
27
|
+
args.flatten!
|
|
28
|
+
relation.outer_joins_values ||= []
|
|
29
|
+
relation.outer_joins_values += args unless args.blank?
|
|
30
|
+
|
|
31
|
+
relation
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def build_arel
|
|
35
|
+
arel = table
|
|
36
|
+
|
|
37
|
+
@inner_joins_values||=[]
|
|
38
|
+
@outer_joins_values||=[]
|
|
39
|
+
|
|
40
|
+
arel = build_joins(arel, @inner_joins_values, @outer_joins_values) unless @outer_joins_values.blank? && @inner_joins_values.blank?
|
|
41
|
+
|
|
42
|
+
(@where_values - ['']).uniq.each do |where|
|
|
43
|
+
where = Arel.sql(where) if String === where
|
|
44
|
+
arel = arel.where(Arel::Nodes::Grouping.new(where))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
arel = arel.having(*@having_values.uniq.reject{|h| h.blank?}) unless @having_values.empty?
|
|
48
|
+
|
|
49
|
+
arel = arel.take(@limit_value) if @limit_value
|
|
50
|
+
arel = arel.skip(@offset_value) if @offset_value
|
|
51
|
+
|
|
52
|
+
arel = arel.group(*@group_values.uniq.reject{|g| g.blank?}) unless @group_values.empty?
|
|
53
|
+
|
|
54
|
+
arel = arel.order(*@order_values.uniq.reject{|o| o.blank?}) unless @order_values.empty?
|
|
55
|
+
|
|
56
|
+
arel = build_select(arel, @select_values.uniq)
|
|
57
|
+
|
|
58
|
+
arel = arel.from(@from_value) if @from_value
|
|
59
|
+
arel = arel.lock(@lock_value) if @lock_value
|
|
60
|
+
|
|
61
|
+
arel
|
|
62
|
+
end
|
|
6
63
|
|
|
7
|
-
|
|
64
|
+
|
|
65
|
+
def build_joins(relation, inner_joins, outer_joins)
|
|
66
|
+
inner_association_joins = []
|
|
67
|
+
outer_association_joins = []
|
|
68
|
+
|
|
69
|
+
inner_joins = @inner_joins_values.map {|j| j.respond_to?(:strip) ? j.strip : j}.uniq
|
|
70
|
+
outer_joins = @outer_joins_values.map {|j| j.respond_to?(:strip) ? j.strip : j}.uniq
|
|
8
71
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
association_joins << join if [Hash, Array, Symbol, ReferrableJoin].include?(join.class) && !array_of_strings?(join)
|
|
72
|
+
inner_joins.each do |join|
|
|
73
|
+
inner_association_joins << join if [Hash, Array, Symbol, ReferrableJoin].include?(join.class) && !array_of_strings?(join)
|
|
12
74
|
end
|
|
13
75
|
|
|
14
|
-
|
|
76
|
+
outer_joins.each do |join|
|
|
77
|
+
outer_association_joins << join if [Hash, Array, Symbol, ReferrableJoin].include?(join.class) && !array_of_strings?(join)
|
|
78
|
+
end
|
|
15
79
|
|
|
16
|
-
|
|
80
|
+
stashed_association_joins = (inner_joins + outer_joins).grep(ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation)
|
|
81
|
+
|
|
82
|
+
non_association_joins = (outer_joins + inner_joins - outer_association_joins - inner_association_joins - stashed_association_joins)
|
|
17
83
|
custom_joins = custom_join_sql(*non_association_joins)
|
|
18
84
|
|
|
19
|
-
join_dependency = ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass,
|
|
85
|
+
join_dependency = ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, inner_association_joins, outer_association_joins, custom_joins)
|
|
20
86
|
|
|
21
87
|
join_dependency.graft(*stashed_association_joins)
|
|
22
88
|
|
|
23
|
-
@implicit_readonly = true unless
|
|
89
|
+
@implicit_readonly = true unless inner_association_joins.empty? && outer_association_joins.empty? && stashed_association_joins.empty?
|
|
24
90
|
|
|
25
91
|
to_join = []
|
|
26
92
|
|
|
@@ -28,23 +94,36 @@ module ActiveRecord
|
|
|
28
94
|
if (association_relation = association.relation).is_a?(Array)
|
|
29
95
|
to_join << [association_relation.first, association.join_type, association.association_join.first]
|
|
30
96
|
to_join << [association_relation.last, association.join_type, association.association_join.last]
|
|
31
|
-
else
|
|
97
|
+
else
|
|
32
98
|
to_join << [association_relation, association.join_type, association.association_join]
|
|
33
99
|
end
|
|
34
100
|
end
|
|
35
|
-
|
|
101
|
+
|
|
36
102
|
to_join.uniq.each do |left, join_type, right|
|
|
37
103
|
relation = relation.join(left, join_type).on(*right)
|
|
38
104
|
end
|
|
39
105
|
|
|
40
106
|
relation.join(custom_joins)
|
|
41
107
|
end
|
|
108
|
+
|
|
42
109
|
end
|
|
43
110
|
|
|
44
111
|
|
|
45
112
|
module Associations
|
|
46
113
|
module ClassMethods
|
|
47
114
|
class JoinDependency
|
|
115
|
+
|
|
116
|
+
def initialize(base, inner_associations, outer_associations, joins)
|
|
117
|
+
@joins = [JoinBase.new(base, joins)]
|
|
118
|
+
@associations = {}
|
|
119
|
+
@reflections = []
|
|
120
|
+
@base_records_hash = {}
|
|
121
|
+
@base_records_in_order = []
|
|
122
|
+
@table_aliases = Hash.new { |aliases, table| aliases[table] = 0 }
|
|
123
|
+
@table_aliases[base.table_name] = 1
|
|
124
|
+
build(inner_associations, @joins.first, Arel::InnerJoin)
|
|
125
|
+
build(outer_associations, @joins.first, Arel::OuterJoin)
|
|
126
|
+
end
|
|
48
127
|
|
|
49
128
|
def build(associations, parent = nil, join_type = Arel::InnerJoin)
|
|
50
129
|
parent ||= @joins.last
|
data/lib/referrable_joins.rb
CHANGED