5 def initialize page, page_size, operators, item_name, list_name, conf, manifest
11 @default_page_size = @conf['default_page_size'] || 25
12 @max_page_size = @conf['max_page_size'] || 100
13 @page = self.page_number(page)
14 @page_size = self.page_size page_size
16 @model = @item_name.classify.constantize
17 @offset = (@page -1) * @page_size
18 @table_name = @model.table_name
20 @owner_model = @model.owner_model
21 @owner_table_name = @owner_model.table_name if @owner_model
25 def page_number prm = nil
33 page_size = @max_page_size if page_size > @max_page_size
34 page_size = @default_page_size if page_size < 1
44 if @owner_model.owner_model
45 {@owner_model.item_name => {@owner_model.owner_model.item_name => {}}}
47 {@owner_model.item_name => {}}
59 @model.where(self.where()).includes(self.includes).order(self.order).offset(@offset).limit(@page_size)
63 c = @model.where(self.where()).includes(self.includes).count
64 Kaminari.paginate_array(Array.new(c, nil)).page(@offset).per(@page_size)
69 class PublicList < BaseList
72 class PrivateList < BaseList
74 case @model.owner_type
76 operator = @operators.author
78 operator = @operators.artist
81 if @owner_model.owner_model
82 @owner_model.owner_model.table_name
84 @owner_model.table_name
89 [t + '.' + @model.owner_type.to_s + '_id = ?', operator.id]
93 class SystemResourceList < BaseList
100 class HasManyList < BaseList
101 def initialize page, page_size, operators, item_name, list_name, conf, manifest
103 @association_name = @conf['association_name']
104 @has_many_conf = @manifest.model(@item_name).associations['has_many'] || {}
105 @association_conf = @has_many_conf[@association_name] || {}
106 @association_model_name = @association_conf['model']
107 @association_model = @association_model_name.classify.constantize
108 @foreign_key = @association_conf['foreign_key']
111 def where parent_item
112 w = @model.list_where
113 w += ' and ' unless w.blank?
114 t = @owner_model ? @owner_table_name : @table_name
115 [w + @association_model_name + '.' + @foreign_key + ' = ?', parent_item.id]
119 # @with_model_name ? {@with_model_name.classify.constantize.table_name => {}} : {}
120 w = @owner_model ? {@owner_model.item_name => {}} : {}
121 w.merge({@association_model.table_name => {} })
124 def items parent_item
125 @model.where(self.where(parent_item)).includes(self.includes).order(self.order).offset(@offset).limit(@page_size)
128 def paginate parent_item
129 Kaminari.paginate_array(Array.new(@model.where(self.where(parent_item).includes(self.includes)).count, nil)).page(@offset).per(@page_size)
134 class FilterList < BaseList
135 def initialize page, page_size, operators, item_name, list_name, conf, manifest
137 @list_list_conf = @manifest.list(@item_name).lists[list_name] || {}
138 @from = @list_list_conf['from']
139 @filter_key = @list_list_conf['filter_key']
140 @includes = @list_list_conf['includes']
142 @with_model_name = @list_list_conf['with']
145 def where filter_item
146 w = @model.list_where
147 w += ' and ' unless w.blank?
148 [w + @table_name + '.' + @filter_key + ' = ?', filter_item.id]
152 return @includes if @includes
153 w = @owner_model ? {@owner_model.item_name => {}} : {}
154 w.merge({@from => {} })
157 def items filter_item
158 @model.where(self.where(filter_item)).includes(self.includes).order(self.order).offset(@offset).limit(@page_size)
161 def paginate filter_item
162 Kaminari.paginate_array(Array.new(@model.where(self.where(filter_item).includes(self.includes)).count, nil)).page(@offset).per(@page_size)
167 class ThroughFilterList < FilterList
168 def initialize page, page_size, operators, item_name, list_name, conf, manifest
170 @through = @list_list_conf['through']
174 {@through => {@from => {}} }
177 def where filter_item
178 w = @model.list_where
179 w += ' and ' unless w.blank?
180 [w + @through + '.' + @filter_key + ' = ?', filter_item.id]
185 class ElementFilterList < FilterList
187 {@owner_model.item_name => {}}
190 def where filter_item
191 w = @model.list_where
192 w += ' and ' unless w.blank?
193 [w + @owner_table_name + '.' + @filter_key + ' = ?', filter_item.id]
199 attr :params_offset, :params_count, :offset, :count, :limit
200 def initialize params_offset, params_count, operators, item_name, list_name, conf, manifest
201 @operators = operators
202 @item_name = item_name
203 @list_name = list_name
207 @default_page_size = @conf['default_page_size'] || 25
208 @max_page_size = @conf['max_page_size'] || 100
209 @params_offset = params_offset
210 @params_count = params_count
211 @list_list_conf = @manifest.list(@item_name).lists[list_name] || {}
212 @model_name = @list_list_conf['model']
213 @filter_key = @list_list_conf['filter_key']
214 @model = @model_name.classify.constantize
215 @table_name = @model.table_name
217 @owner_model = @model.owner_model
218 @owner_table_name = @owner_model.table_name if @owner_model
222 def offset cnt, prm = nil
224 offset = cnt - 1 if offset >= cnt
225 offset = cnt - offset.abs if offset < 0
226 offset = 0 if offset < 0
231 prm ||= @default_page_size
233 count = @max_page_size if count > @max_page_size
234 count = @default_page_size if count < 1
238 def count filter_item
239 @count ||= @model.count(:conditions => self.where(filter_item), :include => self.includes).to_i
242 def where filter_item
243 w = @model.list_where
244 w += ' and ' unless w.blank?
245 [w + @table_name + '.' + @filter_key + ' = ?', filter_item.id]
249 {@owner_model.item_name => {}}
256 def items filter_item
257 c = @count || self.count(filter_item)
258 o = self.offset c, @offset
259 l = self.limit @count
260 @model.where(self.where(filter_item)).includes(self.includes).order(self.order).offset(o).limit(l)
263 def prev_offset filter_item
264 c = @count || self.count(filter_item)
265 o = self.offset c, @offset
266 l = self.limit @count
278 def next_offset filter_item
279 c = @count || self.count(filter_item)
280 o = self.offset c, @offset
281 l = self.limit @count
291 'public' => PublicList, 'private' => PrivateList, 'system_resource' => SystemResourceList,
292 'has_many' => HasManyList, 'filter' => FilterList,
293 'through_filter' => ThroughFilterList, 'element_filter' => ElementFilterList,
296 def initialize list_manifest
297 @list_manifest = list_manifest
298 @item_name = @list_manifest.item_name
299 @manifest = @list_manifest.manifest
300 @list_conf = @list_manifest.conf
302 @list_manifest.lists.each {|list_name, conf|
304 @lists[list_name] = @@types[type]
308 def open list_name, page, page_size, operators
309 raise "undefined list for #{@item_name}::#{list_name}\nconf:#{@list_conf}\n" unless @lists[list_name]
310 @lists[list_name].new page, page_size, operators, @item_name, list_name, @list_conf, @manifest