Merge branch '2257-inequality-conditions' into 2290-user-activity
[arvados.git] / apps / workbench / app / models / arvados_resource_list.rb
1 class ArvadosResourceList
2   include Enumerable
3
4   def initialize(resource_class)
5     @resource_class = resource_class
6   end
7
8   def eager(bool=true)
9     @eager = bool
10     self
11   end
12
13   def limit(max_results)
14     @limit = max_results
15     self
16   end
17
18   def order(orderby_spec)
19     @orderby_spec = orderby_spec
20     self
21   end
22
23   def filter _filters
24     @filters ||= []
25     @filters += _filters
26     self
27   end
28
29   def where(cond)
30     cond = cond.dup
31     cond.keys.each do |uuid_key|
32       if cond[uuid_key] and (cond[uuid_key].is_a? Array or
33                              cond[uuid_key].is_a? ArvadosBase)
34         # Coerce cond[uuid_key] to an array of uuid strings.  This
35         # allows caller the convenience of passing an array of real
36         # objects and uuids in cond[uuid_key].
37         if !cond[uuid_key].is_a? Array
38           cond[uuid_key] = [cond[uuid_key]]
39         end
40         cond[uuid_key] = cond[uuid_key].collect do |item|
41           if item.is_a? ArvadosBase
42             item.uuid
43           else
44             item
45           end
46         end
47       end
48     end
49     cond.keys.select { |x| x.match /_kind$/ }.each do |kind_key|
50       if cond[kind_key].is_a? Class
51         cond = cond.merge({ kind_key => 'arvados#' + $arvados_api_client.class_kind(cond[kind_key]) })
52       end
53     end
54     api_params = {
55       _method: 'GET',
56       where: cond
57     }
58     api_params[:eager] = '1' if @eager
59     api_params[:limit] = @limit if @limit
60     api_params[:order] = @orderby_spec if @orderby_spec
61     api_params[:filters] = @filters if @filters
62     res = $arvados_api_client.api @resource_class, '', api_params
63     @results = $arvados_api_client.unpack_api_response res
64     self
65   end
66
67   def results
68     self.where({}) if !@results
69     @results
70   end
71
72   def all
73     where({})
74   end
75
76   def each(&block)
77     results.each do |m|
78       block.call m
79     end
80     self
81   end
82
83   def first
84     results.first
85   end
86
87   def last
88     results.last
89   end
90
91   def [](*x)
92     results.send('[]', *x)
93   end
94
95   def |(x)
96     if x.is_a? Hash
97       self.to_hash | x
98     else
99       results | x.to_ary
100     end
101   end
102
103   def to_ary
104     results
105   end
106
107   def to_hash
108     Hash[results.collect { |x| [x.uuid, x] }]
109   end
110
111   def empty?
112     results.empty?
113   end
114
115   def items_available
116     results.items_available if results.respond_to? :items_available
117   end
118 end