OSDN Git Service

7c900a0ba0fe24f7d2e127ef1f7b1eec43c7b2ba
[pettanr/pettanr.git] / lib / locmare / list_group / list / base.rb
1 module Locmare
2   module ListGroupModule
3     class Base
4       class ListResult
5         attr :list, :items, :count, :paginate
6         
7         def initialize list, items, count, paginate, operators
8           @list = list
9           @items = items
10           @count = count  # total count
11           @paginate = paginate
12           @operators = operators
13         end
14         
15         def path
16           @list.action_manifest.url @list.options
17         end
18         
19       end
20       
21       attr :list_group_name, :list_name, :options, :item_name, 
22         :controller_manifest, :action_manifest, :list_manifest, :model,
23         :count
24       def initialize list_group_name, list_name, operators, options = {}
25         @list_group_name = list_group_name
26         @list_name = list_name
27         @operators = operators
28         @options = options
29         
30         @list_group_manifest = LocalManifest.manifest.list_groups[@list_group_name]
31         @list_manifest = @list_group_manifest.lists[@list_name]
32         @where = @list_manifest.where
33         @includes = @list_manifest.includes
34         
35         @controller_name = @list_group_name
36         @action_name = @list_name
37         @controller_manifest = ::Manifest.manifest.controllers[@controller_name]
38         @action_manifest = @controller_manifest.actions[@action_name]
39         @item_name = @action_manifest.item_name
40         @model = ::Manifest.item_name_to_model @item_name
41         @table_name = @model.table_name
42         self.init
43       end
44       
45       def init
46         self.set_count
47         self.set_offset
48         self.set_limit
49       end
50       
51       def model_name
52         @model.model_name
53       end
54       
55       def set_offset
56         if prm = @options['offset'] || @options[:offset]
57           @offset = prm.to_i
58           @offset = @count - 1 if @offset >= @count
59           @offset = @count - @offset.abs if @offset < 0
60           @offset = 0 if @offset < 0
61           offset
62         else
63           @offset = (self.fixed_page - 1) * self.fixed_page_size
64         end
65         @offset
66       end
67       
68       def limit?
69         self.max_page_size > 0
70       end
71       
72       def unlimit?
73         !limit?
74       end
75       
76       def fixed_page
77         page = self.opt_page.to_i
78         page = 1 if page < 1
79         page
80       end
81       
82       def fixed_page_size
83         page_size = self.opt_page_size || self.default_page_size
84         page_size = self.max_page_size if self.limit? and (page_size > self.max_page_size)
85         page_size
86       end
87       
88       def set_limit
89         prm = self.opt_page_size || self.opt_count
90         @limit = prm.to_i
91         if self.max_page_size > 0
92           @limit = self.max_page_size if @limit > self.max_page_size
93         else  # unlimited api
94           @limit = @count if @limit > @count
95         end
96         @limit = self.default_page_size if @limit < 1
97         @limit
98       end
99       
100       def opt_page
101         n = @options['page'] || @options[:page]
102         n ? n.to_i : nil
103       end
104       
105       def opt_page_size
106         n = @options['page_size'] || @options[:page_size]
107         n ? n.to_i : nil
108       end
109       
110       def opt_count
111         n = @options['count'] || @options[:count]
112         n ? n.to_i : nil
113       end
114       
115       def default_page_size
116         @action_manifest.default_page_size
117       end
118       
119       def max_page_size
120         @action_manifest.max_page_size
121       end
122       
123       def order
124         order = @options['order'] || @options[:order] || @action_manifest.order
125         order = 'updated_at' unless ::Manifest.manifest.models[@item_name].attributes[order]
126         @table_name + '.' + order
127       end
128       
129       def direction
130         direction = @options['direction'] || @options[:direction] || @action_manifest.direction
131         if direction < 0
132           'desc'
133         elsif direction > 0
134           'asc'
135         else
136           ''
137         end
138       end
139       
140       def filter_id
141         @options['id'] || @options[:id]
142       end
143       
144       def order_by
145         self.order + ' ' + self.direction
146       end
147       
148       def base_where_condition
149         method_name = @where.conditions do |name|
150           name
151         end
152         @model.__send__ method_name
153       end
154       
155       def where_condition
156         base_where_condition
157       end
158       
159       def include_hash
160         @includes.includes
161       end
162       
163       def items
164         @model.where(
165           self.where_condition
166         ).includes(
167           self.include_hash
168         ).order(
169           self.order_by
170         ).offset(@offset).limit(@limit)
171       end
172       
173       def set_count
174         @count = @model.where(
175           self.where_condition
176         ).includes(
177           self.include_hash
178         ).count
179       end
180       
181       def paginate count
182         c = count ? count.to_i : 0
183         Kaminari.paginate_array(Array.new(c, nil)).page(self.fixed_page).per(self.fixed_page_size)
184       end
185       
186       def boost_manifests
187         @model.my_peta.boost.select do |boost_name, boost_manifest|
188           boost_manifest.level == 'show'
189         end
190       end
191       
192       def boost items
193         manifests = self.boost_manifests
194         items.each do |item|
195           manifests.each do |boost_manifest|
196             item.boost_manifest # ?
197           end
198         end
199       end
200       
201       def open operators
202         items = self.items
203         pg = if limit?
204           self.paginate @count
205         else
206           nil
207         end
208         self.boost items
209         ListResult.new self, items, @count, pg, @operators
210       end
211       
212     end
213     
214   end
215 end