infopark_cloud_connector 6.8.0.328.4a753fc → 6.8.0.348.160665197
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/rails_connector/obj.rb +13 -11
- data/lib/rails_connector/obj_search_enumerator.rb +83 -0
- metadata +11 -16
data/lib/rails_connector/obj.rb
CHANGED
@@ -50,17 +50,19 @@ module RailsConnector
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
#
|
54
|
-
# Returns a list of all Objs.
|
53
|
+
# Returns a {ObjSearchEnumerator} of all Objs.
|
55
54
|
# If invoked on a subclass of Obj, the result will be restricted to Obj of that subclass.
|
56
55
|
def self.all
|
57
|
-
|
56
|
+
if self.name == 'RailsConnector::Obj'
|
57
|
+
ObjSearchEnumerator.new(nil)
|
58
|
+
else
|
59
|
+
find_all_by_obj_class(self.name)
|
60
|
+
end
|
58
61
|
end
|
59
62
|
|
60
|
-
#
|
61
|
-
# returns an Array of all Objs with the given obj_class.
|
63
|
+
# Returns an {ObjSearchEnumerator} of all Objs with the given obj_class.
|
62
64
|
def self.find_all_by_obj_class(obj_class)
|
63
|
-
|
65
|
+
ObjSearchEnumerator.new([{:field => '_obj_class', :operator => 'equal', :value => obj_class}])
|
64
66
|
end
|
65
67
|
|
66
68
|
# Find the Obj with the given path.
|
@@ -74,18 +76,18 @@ module RailsConnector
|
|
74
76
|
find_objs_by(:path, pathes).map(&:first)
|
75
77
|
end
|
76
78
|
|
77
|
-
# (notice: not yet implemented)
|
78
79
|
# Find an Obj with the given name.
|
79
80
|
# If several Objs exist with the given name, one of them is chosen and returned.
|
80
81
|
# If no Obj with the name exits, nil is returned.
|
81
82
|
def self.find_by_name(name)
|
82
|
-
|
83
|
+
enum = ObjSearchEnumerator.new(
|
84
|
+
[{:field => '_name', :operator => 'equal', :value => name}], {:batch_size => 1})
|
85
|
+
enum.first
|
83
86
|
end
|
84
87
|
|
85
|
-
#
|
86
|
-
# Find all Objs with the given name.
|
88
|
+
# Returns an {ObjSearchEnumerator} of all Objs with the given name.
|
87
89
|
def self.find_all_by_name(name)
|
88
|
-
|
90
|
+
ObjSearchEnumerator.new([{:field => '_name', :operator => 'equal', :value => name}])
|
89
91
|
end
|
90
92
|
|
91
93
|
# Return the Obj with the given permalink or nil if no matching Obj exists.
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
# Provides an enumerator, to iterate over obj search results and return "real" objs.
|
3
|
+
# This is done using the {http://ruby-doc.org/core-1.8.7/Enumerable.html <code>Enumerable</code> mixin}, which provided methods like <code>map</code>, <code>select</code> or <code>take</code>.
|
4
|
+
#
|
5
|
+
# This enumerator is lazy. Let's say, that when looking for Objs with the ObjClass Publication there are 123 objs in total. Now <code>enum.take(10)</code> will only fetch the first 10 objs, leaving the other 113 objs untouched.
|
6
|
+
# This also means, that iterating multiple times over this enumerator, each time the search results and objs are fetched again. If you want to get all objs at once, use <code>enum.to_a</code>.
|
7
|
+
#
|
8
|
+
# For all possible <code>query</code>'s and <code>options</code> have a look at the cms api documentation about objs/search.
|
9
|
+
# There is one exception: To adjust how many search results should be fetch with one chunk, use the option <code>:batch_size</code>. The default is <code>10</code>. The <code>:size</code> option will be silently ignored.
|
10
|
+
#
|
11
|
+
# @example All objs, which are Publications
|
12
|
+
# enum = ObjSearchEnumerator([{:field => '_obj_class', :operator => 'equal', :value => 'Publication'}])
|
13
|
+
# enum.each { |obj| puts obj.path }
|
14
|
+
class ObjSearchEnumerator
|
15
|
+
include Enumerable
|
16
|
+
|
17
|
+
attr_reader :query
|
18
|
+
attr_reader :options
|
19
|
+
|
20
|
+
# @param [Array] query
|
21
|
+
# @param [Hash] options
|
22
|
+
def initialize(query, options = {})
|
23
|
+
@query = query
|
24
|
+
@query.freeze
|
25
|
+
|
26
|
+
options.delete(:size)
|
27
|
+
options.delete('size')
|
28
|
+
if batch_size = options.delete(:batch_size)
|
29
|
+
options[:size] = batch_size
|
30
|
+
end
|
31
|
+
@options = options
|
32
|
+
@options.freeze
|
33
|
+
end
|
34
|
+
|
35
|
+
def each
|
36
|
+
offset = 0
|
37
|
+
current_batch, total = fetch_next_batch(offset)
|
38
|
+
loop do
|
39
|
+
if current_batch.size == 0
|
40
|
+
if offset < total
|
41
|
+
current_batch, total = fetch_next_batch(offset)
|
42
|
+
else
|
43
|
+
raise StopIteration
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
offset += 1
|
48
|
+
hit = current_batch.shift
|
49
|
+
yield Obj.find(hit['id'])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# The total size of all results.
|
54
|
+
# @return [Integer]
|
55
|
+
def size
|
56
|
+
if @size.blank?
|
57
|
+
@size = CmsRestApi.get(resource_path, {:query => query, :size => 1})['total'].to_i
|
58
|
+
end
|
59
|
+
@size
|
60
|
+
end
|
61
|
+
|
62
|
+
alias_method :length, :size
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def fetch_next_batch(offset)
|
67
|
+
request_result = CmsRestApi.get(resource_path, search_dsl(offset))
|
68
|
+
|
69
|
+
[request_result['results'], request_result['total'].to_i]
|
70
|
+
end
|
71
|
+
|
72
|
+
def resource_path
|
73
|
+
"revisions/#{Workspace.current.revision_id}/objs/search"
|
74
|
+
end
|
75
|
+
|
76
|
+
def search_dsl(offset)
|
77
|
+
options.merge({
|
78
|
+
:offset => offset,
|
79
|
+
:query => query,
|
80
|
+
})
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infopark_cloud_connector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 321329493
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 6
|
8
8
|
- 8
|
9
9
|
- 0
|
10
|
-
-
|
11
|
-
-
|
12
|
-
|
13
|
-
- 753
|
14
|
-
- fc
|
15
|
-
version: 6.8.0.328.4a753fc
|
10
|
+
- 348
|
11
|
+
- 160665197
|
12
|
+
version: 6.8.0.348.160665197
|
16
13
|
platform: ruby
|
17
14
|
authors:
|
18
15
|
- Infopark AG
|
@@ -20,7 +17,7 @@ autorequire:
|
|
20
17
|
bindir: bin
|
21
18
|
cert_chain: []
|
22
19
|
|
23
|
-
date: 2012-11-
|
20
|
+
date: 2012-11-23 00:00:00 +01:00
|
24
21
|
default_executable:
|
25
22
|
dependencies:
|
26
23
|
- !ruby/object:Gem::Dependency
|
@@ -60,17 +57,14 @@ dependencies:
|
|
60
57
|
requirements:
|
61
58
|
- - "="
|
62
59
|
- !ruby/object:Gem::Version
|
63
|
-
hash:
|
60
|
+
hash: 321329493
|
64
61
|
segments:
|
65
62
|
- 6
|
66
63
|
- 8
|
67
64
|
- 0
|
68
|
-
-
|
69
|
-
-
|
70
|
-
|
71
|
-
- 753
|
72
|
-
- fc
|
73
|
-
version: 6.8.0.328.4a753fc
|
65
|
+
- 348
|
66
|
+
- 160665197
|
67
|
+
version: 6.8.0.348.160665197
|
74
68
|
version_requirements: *id003
|
75
69
|
name: kvom
|
76
70
|
prerelease: false
|
@@ -114,6 +108,7 @@ files:
|
|
114
108
|
- lib/rails_connector/obj_data_from_database.rb
|
115
109
|
- lib/rails_connector/obj_data_from_hash.rb
|
116
110
|
- lib/rails_connector/obj_data_from_service.rb
|
111
|
+
- lib/rails_connector/obj_search_enumerator.rb
|
117
112
|
- lib/rails_connector/path_conversion.rb
|
118
113
|
- lib/rails_connector/permission.rb
|
119
114
|
- lib/rails_connector/rack_middlewares.rb
|