Skip to content

Commit 4c7d744

Browse files
committed
add rdoc comments.
1 parent 37a44d7 commit 4c7d744

File tree

4 files changed

+64
-1
lines changed

4 files changed

+64
-1
lines changed

lib/bulker.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
require 'bulker/buffer'
22
require 'bulker/pager'
3-
require 'bulker/criteria'
3+
require 'bulker/criteria'
4+
5+
# *bulker* provides Bulker::Pager and Bulker::Buffer.
6+
#
7+
# Bulker::Pager gives you paging functionality to split large number of data to devided segments.
8+
# When 1000,000 records in your database, and you're going to do some process for each record,
9+
# Bulker::Pager will help you.
10+
# It can handle large data very easily such like array with Bulker::Pager#each method.
11+
#
12+
# Bulker::Buffer provides simple buffer that enables implimenting bulk insert or bulk upload behavior.
13+
module Bulker
14+
end

lib/bulker/buffer.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,31 @@
11
module Bulker
2+
# Bulker::Buffer provides buffer pool and bulk execution functionality.
3+
#
4+
# result = []
5+
# buffer = Bulker::Buffer.new(4) do |ary|
6+
# result << ary # when buffer filled
7+
# end
8+
# (1..10).each do |i|
9+
# buffer << i
10+
# end
11+
# buffer.flush
12+
# result #=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
213
class Buffer
14+
# +size+ specify size of buffer.
15+
# +block+ specify callback on filled buffer.
316
def initialize(size, &block)
417
@size = size
518
@buffer = []
619
@on_buffered = block
720
end
821

22+
# add +obj+ into buffer
923
def << (obj)
1024
@buffer << obj
1125
flush if @buffer.size == @size
1226
end
1327

28+
# do bulk execution and clear buffer.
1429
def flush
1530
@on_buffered.call(@buffer)
1631
@buffer = []

lib/bulker/criteria.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
module Bulker
2+
# Bulker::Criteria provides interface for Bulker::Pager.
3+
#
4+
# data = (1..20).to_a
5+
# criteria = Bulker::Criteria.new data
6+
# criteria.define_each lambda { |values, offset, limit, block|
7+
# values[offset..(offset + limit - 1)].each do |v|
8+
# block.call(v)
9+
# end
10+
# }
11+
# Bulker::Pager.each(criteria, 10) do |v|
12+
# # do some process
13+
# end
214
class Criteria
15+
316
class << self
17+
# create criteria from +ary+
418
def from_array(ary)
519
criteria = Criteria.new ary
620
criteria.define_each lambda { |values, offset, limit, block|
@@ -13,31 +27,40 @@ def from_array(ary)
1327

1428
attr_accessor :values
1529

30+
# create criteria with +values+.
31+
# defaults:
32+
# - +offset+ : 0
33+
# - +limit+ : 10
1634
def initialize(values)
1735
@values = values
1836
@offset = 0
1937
@limit = 10
2038
end
2139

40+
# set +offset+ to specify offset from head of data.
2241
def offset(offset)
2342
@offset = offset
2443
self
2544
end
2645

46+
# set +limit+ to specify numbers to fetch data.
2747
def limit(limit)
2848
@limit = limit
2949
self
3050
end
3151

52+
# get size of +values+.
3253
def count
3354
@values.size
3455
end
3556

57+
# set implementation of +each+ by lambda.
3658
def define_each(each_proc)
3759
@each_proc = each_proc
3860
self
3961
end
4062

63+
# do +block+ for each data
4164
def each(&block)
4265
@each_proc.call(values, @offset, @limit, block)
4366
end

lib/bulker/pager.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,32 @@
11
module Bulker
2+
# Bulker::Pager provides paging functionality to split large number of data to devided segments.
3+
# It can handle large data very easily such like array with each method.
4+
#
5+
# Bulker::Pager is especially designed for ActiveRecord.
6+
#
7+
# class Item < ActiveRecord::Base; end
8+
# Bulker::Pager.each(Item.where(:status => "selling"), 100) do
9+
# # do some process for each item
10+
# end
11+
#
12+
# For other data source, Bulker::Criteria provides interface for Bulker::Pager.
213
class Pager
314
class << self
15+
# access to every +cursor+ data with fetch limitation +limit+.
416
def each(cursor, limit, &block)
517
pager = Pager.new cursor, limit
618
pager.each { |page| block.call(page) }
719
end
820
end
921

22+
# create pager from +cursor+ data and limitaion +limit+
1023
def initialize(cursor, limit)
1124
raise RangeError.new("limit must be positive number, but #{limit}") if limit <= 0
1225
@cursor = cursor
1326
@limit = limit
1427
end
1528

29+
# access to every data.
1630
def each(&block)
1731
size = @cursor.count
1832
pages = size / @limit + (size % @limit == 0 ? 0 : 1)

0 commit comments

Comments
 (0)