riak-record 0.5.1 → 0.6.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 848a3c84ab9c29295f67aeb95fadb9588644ff05
4
- data.tar.gz: 9c339a757a57412bccad2a9a6efbfcd12de4ca57
3
+ metadata.gz: b2627d29a43209e31719b15501c12d2f272fc6d0
4
+ data.tar.gz: 3821d3333a91374965a04717b18e93b9b6f5d3ee
5
5
  SHA512:
6
- metadata.gz: f1e8c13cdf5b5ca515ce38a26637760ed9e1840eec464d5e6b66e5d1505a613155677ee12ae0bcd399359da1419202d99570c809a276ff47090295b58effe951
7
- data.tar.gz: d52c6e5cedd503f9ef692988f0ad72a4616598c4b3488e95c839fd82800359942c070a7aafa66bab3c2f46f842b681ad8aeabcffd39b7473e024d8dffadf7a10
6
+ metadata.gz: 4346ef7b3b5869b5ad73d24be6b6b7c15f37ea46a7fcfd8dce89f95ee4baeaf8a9aa83d23916636dccb98694a0a9131b9617d0d3ff6dcd209817020ca9b68062
7
+ data.tar.gz: 6ede597c3201ea403b23fff5c0d3074eecb013a3827dc188714cd2d63347eab8cfca5a741d3ca4b6f0c8d368063aa10d23e5da7dd91e1602a108388653935972
data/README.md CHANGED
@@ -29,7 +29,9 @@ Post.client #> instance of Riak::Client
29
29
  Post.bucket #> instance of Riak::Bucket named "staging:posts"
30
30
  Post.all #> [] uses the special $bucket secondary index
31
31
  Post.count #> 0 also uses the special $bucket index
32
- records, next_page = Post.page(2, 100) #> returns records 101-200 using the $bucket index.
32
+
33
+ records, continuation_token = Post.page() #> returns records 1-100 using the $bucket index.
34
+ records2, continuation_token = Post.page(continuation_token) #> returns records 101-200
33
35
 
34
36
  Post.find(["my-first-post","a-farewell-to-blogging"]) #> Array of Posts returned
35
37
  post = Post.find("my-first-post") #> Instance of Post
@@ -63,13 +65,20 @@ RiakRecord::Finder provides find objects by indexes. Results are loaded in batch
63
65
 
64
66
  ```ruby
65
67
  finder = Post.where(:category => 'ruby') #> Instance of RiakRecord::Finder
66
- finder.page(1) # returns the first 100 records. Note it has to stream in previous pages
67
68
  finder.count #> 1
68
69
  finder.any? #> true
69
70
  finder.any?{|o| o.category == 'php'} #> false
70
71
  finder.none? #> false
71
72
  finder.each{|e| ... } #> supports all enumerable methods
72
- finder.count_by(:author_id) #> {"1" => 1}
73
+ finder.count_by(:author_id) #> {"1" => 1}. Works with declared data attributes and indexes
74
+ finder.pluck(:author_id) #> [1,2,3]. Works with declared data attributes and indexes
75
+ ```
76
+
77
+ #### Pagination
78
+
79
+ ```ruby
80
+ records, contination_token = finder.page() # returns the first 100 records.
81
+ records2, contination_token = finder.page(contination_token, 10) # returns records 101-10
73
82
  ```
74
83
 
75
84
  ### RiakRecord::Associations
data/TODO.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  * RiakRecord::Base
4
4
  * id_generator
5
+ * don't delegate count to map_reduce_count
6
+ * reload should reset associations
5
7
  * Document methods in classes
6
8
  * Validations support
7
9
  * Validate key is unique (bucket.get_or_new)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.1
1
+ 0.6.0
@@ -40,12 +40,12 @@ module RiakRecord
40
40
 
41
41
  def first(n=nil)
42
42
  if n
43
- until @load_complete || n <= @loaded_objects.count
44
- load_next_page
43
+ unless @load_complete || @loaded_objects.count >= n
44
+ load_next_page(n-@loaded_objects.count)
45
45
  end
46
46
  @loaded_objects.first(n)
47
47
  else
48
- load_next_page unless load_started?
48
+ load_next_page(1) unless load_started?
49
49
  @loaded_objects.first
50
50
  end
51
51
  end
@@ -65,7 +65,7 @@ module RiakRecord
65
65
  if block_given?
66
66
  !any?(&block)
67
67
  else
68
- load_next_page unless load_started?
68
+ load_next_page(1) unless load_started?
69
69
  @loaded_objects.count.zero?
70
70
  end
71
71
  end
@@ -90,23 +90,20 @@ module RiakRecord
90
90
  results
91
91
  end
92
92
 
93
- def page(page_number = 1, page_size = 100)
94
- current_page = 1
95
- page_number = page_number.to_i
96
- page_number = 1 if page_number < 1
97
-
98
- querier = Riak::SecondaryIndex.new(@bucket, @index, @value, :max_results => page_size)
99
- while current_page < page_number
100
- if querier.has_next_page?
101
- querier = querier.next_page
102
- current_page = current_page + 1
103
- else
104
- return [], false # no results, no next page
105
- end
106
- end
107
-
93
+ def page(continuation = nil, page_size = 100)
94
+ options = { :max_results => page_size }
95
+ options[:continuation] = continuation if continuation.present?
96
+ querier = Riak::SecondaryIndex.new(@bucket, @index, @value, options)
108
97
  results = querier.values.compact.map{ |robject| @finder_class.new(robject) }
109
- return results, querier.has_next_page?
98
+ return results, querier.keys.continuation
99
+ end
100
+
101
+ def pluck_by_map_reduce(attribute)
102
+ pluck_by_index = @finder_class.index_names[attribute.to_sym].present?
103
+ parsed_attribute = pluck_by_index ? "v.values[0].metadata.index.#{@finder_class.index_names[attribute.to_sym]}" : "JSON.parse(v.values[0].data).#{attribute}"
104
+ Riak::MapReduce.new(@finder_class.client).
105
+ index(@bucket, @index, @value).
106
+ map("function(v){ return [#{parsed_attribute}] }", :keep => true).run
110
107
  end
111
108
 
112
109
  private
@@ -131,12 +128,12 @@ module RiakRecord
131
128
  reduce("Riak.reduceSum", :keep => true).run.first
132
129
  end
133
130
 
134
- def load_next_page
131
+ def load_next_page(page_size = @page_size)
135
132
  return if @load_complete
136
133
  if @querier
137
134
  @querier = @querier.next_page
138
135
  else
139
- @querier = Riak::SecondaryIndex.new(@bucket, @index, @value, :max_results => @page_size)
136
+ @querier = Riak::SecondaryIndex.new(@bucket, @index, @value, :max_results => page_size)
140
137
  end
141
138
  @load_complete = !@querier.has_next_page?
142
139
  new_objects = @querier.values.compact.map{ |robject| @finder_class.new(robject) }
data/riak-record.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: riak-record 0.5.1 ruby lib
5
+ # stub: riak-record 0.6.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "riak-record"
9
- s.version = "0.5.1"
9
+ s.version = "0.6.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Robert Graff"]
14
- s.date = "2014-10-16"
14
+ s.date = "2014-10-22"
15
15
  s.description = "RiakRecord is a thin and immature wrapper around riak-ruby-client. It creates a bucket for\n each class, provides a simple finder, and creates attribute reader."
16
16
  s.email = "robert_graff@yahoo.com"
17
17
  s.extra_rdoc_files = [
@@ -64,21 +64,23 @@ describe RiakRecord::Finder do
64
64
 
65
65
  describe "page" do
66
66
  it "should return a page of results" do
67
- results, next_page = pop_finder.page(1,10)
67
+ results, continuation = pop_finder.page(nil,10)
68
68
  expect(results.map(&:id).sort).to eq(pop_finder.first(10).map(&:id).sort)
69
- expect(next_page).to eq(true)
69
+ expect(continuation).to be_present
70
70
  end
71
71
 
72
- it "should return an empty result when the page is to big" do
73
- results, next_page = pop_finder.page(100,10)
74
- expect(results).to be_empty
75
- expect(next_page).to eq(false)
72
+ it "should return the next page with a contination" do
73
+ results1, continuation1 = pop_finder.page(nil,10)
74
+ results, continuation = pop_finder.page(continuation1,10)
75
+
76
+ expect(results.map(&:id).sort).to eq(pop_finder.to_a.slice(10,10).map(&:id).sort)
77
+ expect(continuation).to be_present
76
78
  end
77
79
 
78
80
  it "should return results and false on last page" do
79
- results, next_page = pop_finder.page(2, 100)
81
+ results, continuation = pop_finder.page(nil, 500)
80
82
  expect(results).to_not be_empty
81
- expect(next_page).to eq(false)
83
+ expect(continuation).to_not be_present
82
84
  end
83
85
 
84
86
  end
@@ -148,6 +150,16 @@ describe RiakRecord::Finder do
148
150
  end
149
151
  end
150
152
 
153
+ describe "pluck_by_map_reduce(attribute)" do
154
+ it "should just return the plucked attributes" do
155
+ expect(pop_finder.pluck_by_map_reduce(:name).sort).to eq(@pop_artists.map(&:name).sort)
156
+ end
157
+
158
+ it "should pluck indexes too" do
159
+ expect(pop_finder.pluck_by_map_reduce(:sales).sort).to eq(@pop_artists.map(&:sales).map(&:first).sort)
160
+ end
161
+ end
162
+
151
163
  describe "count_by(attribute)" do
152
164
  let(:bin_number_counts){
153
165
  { "0" => 15, "1" => 16, "2" => 16, "3" => 16, "4" => 16, "5" => 16, "6" => 15, "7" => 15, "8" => 15, "9" => 15}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riak-record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Graff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-16 00:00:00.000000000 Z
11
+ date: 2014-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: riak-client