forked from joaomiguelpereira/n2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
view_object.rb
154 lines (122 loc) · 4.69 KB
/
view_object.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
class ViewObject < ActiveRecord::Base
belongs_to :view_object_template
belongs_to :parent, :class_name => "ViewObject", :foreign_key => :parent_id
has_one :setting, :class_name => "Metadata", :as => :metadatable
has_many :direct_view_tree_edges, :class_name => "ViewTreeEdge", :foreign_key => :parent_id, :order => "position desc"
has_many :indirect_view_tree_edges, :class_name => "ViewTreeEdge", :foreign_key => :child_id, :order => "position desc"
has_many :edge_children, :through => :direct_view_tree_edges, :source => :child, :order => "position desc"
has_many :edge_parents, :through => :indirect_view_tree_edges, :source => :parent, :order => "position desc"
def dataset
return @dataset if defined?(@dataset)
if setting and setting.is_a?(Metadata::ViewObjectSetting)
@dataset = setting.dataset ? setting.load_dataset : setting.kommand_chain
end
@dataset ||= []
end
def children
self.class.find(:all, :conditions => ["parent_id = ?", self.id])
end
def self.load key_name
self.find_by_name(key_name)
end
def view_tree
@view_tree ||= ViewTree.new name, nil, self
end
def add_parent! parent_view_object, position = 0
ViewTreeEdge.create!({:parent => parent_view_object, :child => self, :position => position})
end
def add_child! child_view_object, position = 0
ViewTreeEdge.create!({:child => child_view_object, :parent => self, :position => position})
end
def add_dataset_dep klass
Newscloud::Redcloud.redis.sadd dataset_key, klass.cache_id
Newscloud::Redcloud.redis.sadd klass.model_deps_key, self.cache_id
end
def add_dataset_deps
dataset.map {|k| add_dataset_dep(k) } if dataset and dataset.respond_to?(:map)
end
def rem_dataset_dep klass
Newscloud::Redcloud.redis.srem dataset_key, klass.cache_id unless klass.nil?
Newscloud::Redcloud.redis.srem klass.model_deps_key, self.cache_id unless klass.nil?
end
def rem_dataset_deps
dataset.each {|k| rem_dataset_dep(k) } if dataset and dataset.respond_to?(:each)
end
def r_dataset
{
:dataset_keys => Newscloud::Redcloud.redis.smembers(dataset_key),
:klass_dep_keys => dataset.inject({}) {|s,k| s["#{k.cache_id}"] = Newscloud::Redcloud.redis.smembers(k.model_deps_key); s},
:namespaces_key => Newscloud::Redcloud.redis.smembers(namespaces_key),
:namespace_deps => setting.kommands.inject({}) {|s,k| s[namespace_deps_key(setting.klass_name, k[:method_name])] = Newscloud::Redcloud.redis.smembers(namespace_deps_key(setting.klass_name, k[:method_name])); s}
}
end
def add_namespace_deps
return false unless setting and setting.is_a?(Metadata::ViewObjectSetting)
if setting.kommands.any? and setting.klass_name.present?
setting.kommands.each do |kommand|
if kommand[:method_name].present?
Newscloud::Redcloud.redis.sadd namespaces_key, klass_method_key(setting.klass_name, kommand[:method_name])
Newscloud::Redcloud.redis.sadd namespace_deps_key(setting.klass_name, kommand[:method_name]), self.cache_id
end
end
end
end
def rem_namespace_deps
return false unless setting and setting.is_a?(Metadata::ViewObjectSetting)
if setting.kommands.any? and setting.klass_name.present?
setting.kommands.each do |kommand|
if kommand[:method_name].present?
Newscloud::Redcloud.redis.srem namespaces_key, klass_method_key(setting.klass_name, kommand[:method_name])
Newscloud::Redcloud.redis.srem namespace_deps_key(setting.klass_name, kommand[:method_name]), self.cache_id
end
end
end
end
def cache_deps
add_dataset_deps
add_namespace_deps
end
def uncache_deps
rem_dataset_deps
rem_namespace_deps
Newscloud::Redcloud.redis.del view_tree_cache_key_name
edge_parents.each {|p| p.uncache_deps }
end
def expire
view_tree.uncache_it
edge_parents.map(&:expire)
uncache_deps
end
def self.uncache_all
ViewObject.all.each {|vo| vo.uncache_deps}
end
def cache_key_name
name.parameterize.to_s
end
def view_tree_cache_key_name
"view-tree:#{cache_key_name}"
end
def self.find_by_redis_key key
return nil unless key =~ /^view_object:([0-9]+)$/
ViewObject.find_by_id($1)
end
def version
setting ? setting.try(:version) : nil
end
def cache_enabled?
setting and not setting.cache_disabled
end
private
def klass_method_key klass_name, method
"#{klass_name.downcase}:#{method.to_s.downcase}"
end
def dataset_key
"#{self.cache_id}:dataset"
end
def namespaces_key
"#{self.cache_id}:namespaces"
end
def namespace_deps_key klass_name, namespace
"#{klass_name.downcase}:view_object_namespace_deps:#{namespace}"
end
end