OSDN Git Service

manifest list_group
[pettanr/pettanr.git] / lib / manifest / list_group / list / base.rb
1 require_dependency "manifest/list_group/list/where"
2 require_dependency "manifest/list_group/list/includes"
3 module Manifest
4   module ListGroupModule
5     module ListModule
6       class Base
7         class ListResult
8           attr :items, :paginate
9           def initialize items, paginate
10             @items = items
11             @paginate = paginate
12           end
13           
14         end
15         
16         attr :list_group, :list_name, :list_manifest, 
17           :model, :model_manifest, :model_list_manifest, 
18           :where, :includes
19         def initialize list_group, list_name, list_manifest
20           @list_group = list_group
21           @list_name = list_name
22           @list_manifest = list_manifest
23           self.set_default
24           self.init
25         end
26         
27         def set_default
28           @model_manifest = ::Manifest.manifest.models[self.item_name]
29           @model_list_manifest = @model_manifest.lists[@list_name]
30           @list_manifest['where'] ||= {}
31           @list_manifest['includes'] ||= {}
32         end
33         
34         def init
35           @model = ::Manifest.item_name_to_model self.item_name
36           @table_name = @model.table_name
37           @where = WhereFactory.factory self, @list_manifest['where']
38           @includes = IncludeFactory.factory self, @list_manifest['includes']
39         end
40         
41         def item_name
42           @list_group.item_name
43         end
44         
45         def default_page_size
46           @model_list_manifest.default_page_size
47         end
48         
49         def max_page_size
50           @model_list_manifest.max_page_size
51         end
52         
53         def page_number prm = nil
54           page = prm.to_i
55           page = 1 if page < 1
56           page
57         end
58         
59         def page_size prm
60           page_size = prm.to_i
61           page_size = self.max_page_size if page_size > self.max_page_size
62           page_size = self.default_page_size if page_size < 1
63           page_size
64         end
65         
66         def base_where_condition
67           method_name = @where.conditions do |name|
68             name
69           end
70           @model.__send__ method_name
71         end
72         
73         def where_condition
74           base_where_condition
75         end
76         
77         def include_hash
78           @includes.includes
79         end
80         
81         def order
82           @model.list_order
83         end
84         
85         def items operators, options, offset, page_size
86           @model.where(self.where_condition).includes(self.include_hash).order(self.order).offset(offset).limit(page_size)
87         end
88         
89         def count operators, options
90           @model.where(self.where_condition).includes(self.include_hash).count
91         end
92         
93         def paginate count, offset, page_size
94           c = count ? count.to_i : 0
95           Kaminari.paginate_array(Array.new(c, nil)).page(offset).per(page_size)
96         end
97         
98         def open operators, options
99           page = self.page_number(options[:page]) 
100           page_size = self.page_size options[:page_size]
101           offset = (page -1) * page_size
102           items = self.items operators, options, offset, page_size
103           count = self.count operators, options
104           pg = self.paginate count, offset, page_size
105           ListResult.new items, pg
106         end
107         
108       end
109     end
110   end
111 end