mochigome 0.1.10 → 0.1.11
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.
- data/lib/mochigome.rb +1 -0
- data/lib/mochigome_ver.rb +1 -1
- data/lib/model_extensions.rb +8 -2
- data/lib/model_graph.rb +22 -1
- data/lib/ordered_set.rb +11 -0
- data/lib/relation.rb +16 -6
- metadata +5 -4
data/lib/mochigome.rb
CHANGED
data/lib/mochigome_ver.rb
CHANGED
data/lib/model_extensions.rb
CHANGED
@@ -155,8 +155,9 @@ module Mochigome
|
|
155
155
|
@model = model
|
156
156
|
@options = {}
|
157
157
|
@options[:fields] = []
|
158
|
-
@options[:custom_subgroup_exprs] =
|
159
|
-
@options[:custom_assocs] =
|
158
|
+
@options[:custom_subgroup_exprs] = ActiveSupport::OrderedHash.new
|
159
|
+
@options[:custom_assocs] = ActiveSupport::OrderedHash.new
|
160
|
+
@options[:ignore_assocs] = Set.new
|
160
161
|
end
|
161
162
|
|
162
163
|
def type_name(n)
|
@@ -205,6 +206,11 @@ module Mochigome
|
|
205
206
|
def custom_association(tgt_cls, expr)
|
206
207
|
@options[:custom_assocs][tgt_cls] = expr
|
207
208
|
end
|
209
|
+
|
210
|
+
# TODO: Unit test for this feature
|
211
|
+
def ignore_assoc(name)
|
212
|
+
@options[:ignore_assocs].add name.to_sym
|
213
|
+
end
|
208
214
|
end
|
209
215
|
|
210
216
|
class AggregationSettings
|
data/lib/model_graph.rb
CHANGED
@@ -10,7 +10,12 @@ module Mochigome
|
|
10
10
|
def initialize
|
11
11
|
@graphed_models = Set.new
|
12
12
|
@table_to_model = {}
|
13
|
-
@assoc_graph = RGL::DirectedAdjacencyGraph.new
|
13
|
+
@assoc_graph = RGL::DirectedAdjacencyGraph.new(OrderedSet)
|
14
|
+
# TODO Also maybe need to do this with hashes used internally in traversal
|
15
|
+
@assoc_graph.instance_variable_set( # Make path choice more predictable
|
16
|
+
:@vertice_dict,
|
17
|
+
ActiveSupport::OrderedHash.new
|
18
|
+
)
|
14
19
|
@edge_conditions = {}
|
15
20
|
@shortest_paths = {}
|
16
21
|
end
|
@@ -98,8 +103,15 @@ module Mochigome
|
|
98
103
|
@table_to_model[model.table_name] = model
|
99
104
|
end
|
100
105
|
|
106
|
+
ignore_assocs = []
|
107
|
+
if model.acts_as_mochigome_focus?
|
108
|
+
ignore_assocs = model.mochigome_focus_settings.options[:ignore_assocs]
|
109
|
+
end
|
110
|
+
|
101
111
|
model.reflections.
|
102
112
|
reject{|name, assoc| assoc.through_reflection}.
|
113
|
+
reject{|name, assoc| ignore_assocs.include? name}.
|
114
|
+
to_a.sort{|a,b| a.first.to_s <=> b.first.to_s}.
|
103
115
|
each do |name, assoc|
|
104
116
|
# TODO: What about self associations?
|
105
117
|
# TODO: What about associations to the same model on different keys?
|
@@ -117,6 +129,7 @@ module Mochigome
|
|
117
129
|
|
118
130
|
if model.acts_as_mochigome_focus?
|
119
131
|
model.mochigome_focus_settings.options[:custom_assocs].each do |t,e|
|
132
|
+
next if ignore_assocs.include?(t.to_s.to_sym)
|
120
133
|
cond = e.call(model.arel_table, t.arel_table)
|
121
134
|
[[model, t], [t, model]]. each do |edge|
|
122
135
|
@assoc_graph.add_edge(*edge)
|
@@ -129,6 +142,12 @@ module Mochigome
|
|
129
142
|
end
|
130
143
|
|
131
144
|
added_models.each do |model|
|
145
|
+
# FIXME: Un-DRY, this is a C&P from above
|
146
|
+
ignore_assocs = []
|
147
|
+
if model.acts_as_mochigome_focus?
|
148
|
+
ignore_assocs = model.mochigome_focus_settings.options[:ignore_assocs]
|
149
|
+
end
|
150
|
+
|
132
151
|
next unless @assoc_graph.has_vertex?(model)
|
133
152
|
path_tree = @assoc_graph.bfs_search_tree_from(model).reverse
|
134
153
|
path_tree.depth_first_search do |tgt_model|
|
@@ -143,6 +162,8 @@ module Mochigome
|
|
143
162
|
# Use through reflections as a hint for preferred indirect paths
|
144
163
|
model.reflections.
|
145
164
|
select{|name, assoc| assoc.through_reflection}.
|
165
|
+
reject{|name, assoc| ignore_assocs.include? name}.
|
166
|
+
to_a.sort{|a,b| a.first.to_s <=> b.first.to_s}.
|
146
167
|
each do |name, assoc|
|
147
168
|
begin
|
148
169
|
foreign_model = assoc.klass
|
data/lib/ordered_set.rb
ADDED
data/lib/relation.rb
CHANGED
@@ -8,6 +8,7 @@ module Mochigome
|
|
8
8
|
@model_graph = ModelGraph.new
|
9
9
|
@spine_layers = layers
|
10
10
|
@models = Set.new
|
11
|
+
@model_join_stack = []
|
11
12
|
@spine = []
|
12
13
|
@joins = []
|
13
14
|
|
@@ -43,7 +44,7 @@ module Mochigome
|
|
43
44
|
|
44
45
|
# Route to it in as few steps as possible, closer to spine end if tie.
|
45
46
|
best_path = nil
|
46
|
-
(@spine.reverse + (@models.to_a - @spine)).each do |link_model|
|
47
|
+
(@spine.reverse + (@models.to_a - @spine).sort{|a,b| a.name <=> b.name}).each do |link_model|
|
47
48
|
path = @model_graph.path_thru([link_model, model])
|
48
49
|
if path && (best_path.nil? || path.size < best_path.size)
|
49
50
|
best_path = path
|
@@ -127,15 +128,24 @@ module Mochigome
|
|
127
128
|
def add_join_link(src, tgt)
|
128
129
|
raise QueryError.new("Can't join from #{src}, not available") unless
|
129
130
|
@models.include?(src)
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
|
132
|
+
@model_join_stack.push tgt
|
133
|
+
begin
|
134
|
+
cond = @model_graph.edge_condition(src, tgt)
|
135
|
+
join_to_expr_models(cond)
|
136
|
+
@rel = @rel.join(tgt.arel_table, Arel::Nodes::InnerJoin).on(cond)
|
137
|
+
ensure
|
138
|
+
@model_join_stack.pop
|
139
|
+
end
|
140
|
+
|
134
141
|
@joins << [src, tgt]
|
142
|
+
@models.add tgt
|
135
143
|
end
|
136
144
|
|
137
145
|
def join_to_expr_models(expr)
|
138
|
-
@model_graph.expr_models(expr).each
|
146
|
+
@model_graph.expr_models(expr).each do |m|
|
147
|
+
join_to_model(m) unless @model_join_stack.include?(m)
|
148
|
+
end
|
139
149
|
end
|
140
150
|
end
|
141
151
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mochigome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 11
|
10
|
+
version: 0.1.11
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Mike Simon
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-05-
|
18
|
+
date: 2012-05-18 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/mochigome_ver.rb
|
113
113
|
- lib/model_extensions.rb
|
114
114
|
- lib/model_graph.rb
|
115
|
+
- lib/ordered_set.rb
|
115
116
|
- lib/query.rb
|
116
117
|
- lib/relation.rb
|
117
118
|
- lib/subgroup_model.rb
|