Class: Queris::Query::Page

Inherits:
Object
  • Object
show all
Defined in:
lib/queris/query/page.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(prefix, sortops, page_size, ttl) ⇒ Page

Returns a new instance of Page.



5
6
7
8
9
10
11
# File 'lib/queris/query/page.rb', line 5

def initialize(prefix, sortops, page_size, ttl)
  @prefix=prefix
  @ops=sortops
  @pagesize=page_size
  @ttl=ttl
  @page=0
end

Instance Attribute Details

#pageObject

Returns the value of attribute page.



4
5
6
# File 'lib/queris/query/page.rb', line 4

def page
  @page
end

#rangeObject

Returns the value of attribute range.



4
5
6
# File 'lib/queris/query/page.rb', line 4

def range
  @range
end

Instance Method Details

#create_page(redis) ⇒ Object



83
84
85
86
87
88
89
# File 'lib/queris/query/page.rb', line 83

def create_page(redis)
  llp = fluxcap(@last_loaded_page)
  llp=nil if llp==""
  return if (llp && llp == @page)
  redis.eval("redis.log(redis.LOG_WARNING, 'want page #{@page}!!!!!!!!1')")
  Queris.run_script(:create_page_if_absent, redis, [key, source_key], [@pagesize * @page, @pagesize * (@page + 1) -1, @ttl])
end

#created?Boolean

Returns:

  • (Boolean)


82
# File 'lib/queris/query/page.rb', line 82

def created?; @created==@page; end

#gather_data(redis, results_key, pagecount_key) ⇒ Object



19
20
21
22
23
24
# File 'lib/queris/query/page.rb', line 19

def gather_data(redis, results_key, pagecount_key)
  #puts "gather page data for key #{results_key}"
  @current_count= Queris.run_script :multisize, redis, [results_key]
  @last_loaded_page ||= redis.get pagecount_key
  @total_count ||= redis.zcard source_key
end

#gather_ready_data(r, q) ⇒ Object



37
38
39
# File 'lib/queris/query/page.rb', line 37

def gather_ready_data(r, q)
  @ready = Queris.run_script(:paged_query_ready, r, [q.results_key, q.results_key(:exists), source_key, q.runstate_key(:ready)])
end

#inspect_query(r, q) ⇒ Object



25
26
27
28
# File 'lib/queris/query/page.rb', line 25

def inspect_query(r, q)
  gather_data(r, q.results_key, q.results_key(:last_loaded_page))
  gather_ready_data(r, q)
end

#keyObject



12
13
14
# File 'lib/queris/query/page.rb', line 12

def key
  "#{@prefix}page:#{Queris.digest(@ops.join)}:#{@pagesize}:#{@page}"
end

#no_more_pages?Boolean

Returns:

  • (Boolean)


60
61
62
63
64
65
# File 'lib/queris/query/page.rb', line 60

def no_more_pages?
  last, cur_count = fluxcap(@last_loaded_page), fluxcap(@current_count)
  return nil if last == "" || last.nil?
  last=last.to_i
  (last + 1) * size > fluxcap(@total_count)
end

#query_run_stage_after_run(r, q) ⇒ Object



29
30
31
32
33
34
35
36
# File 'lib/queris/query/page.rb', line 29

def query_run_stage_after_run(r, q)
  puts "write last_loaded_page for #{q}"
  llp = fluxcap(@last_loaded_page)
  llp=llp.to_i if llp
  @last_loaded_page = @page
  r.set q.results_key(:last_loaded_page), fluxcap(@last_loaded_page)
  inspect_query(r, q)
end

#ready? {|_self| ... } ⇒ Boolean

Yields:

  • (_self)

Yield Parameters:

Returns:

  • (Boolean)

Raises:



66
67
68
69
70
71
# File 'lib/queris/query/page.rb', line 66

def ready?
  raise Error, "Asked if a page was ready without having set a desired range first" unless @range
  ready = (fluxcap(@current_count) || -Float::INFINITY) >= @range.max || no_more_pages?
  yield(self) if !ready && block_given?
  ready
end

#seekObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/queris/query/page.rb', line 41

def seek
  last, cur_count = fluxcap(@last_loaded_page), fluxcap(@current_count)
  last=nil if last == ""
  last=last.to_i unless last.nil?
  cur_count=cur_count.to_i unless cur_count.nil?
  @key=nil
  if last.nil?
    @page=0
    puts "seeking next page... will be #{@page} last_loaded = #{last}, cur_count = #{cur_count}, total max = #{fluxcap @total_count}"
    false
  elsif cur_count < range.max && !no_more_pages?
    @page = last + 1
    puts "seeking next page... will be #{@page} last_loaded = #{last}, cur_count = #{cur_count}, total max = #{fluxcap @total_count}"
    false
  else
    puts "no need to seek, we are here"
    true
  end
end

#sizeObject



15
# File 'lib/queris/query/page.rb', line 15

def size; @pagesize; end

#source_idObject



79
80
81
# File 'lib/queris/query/page.rb', line 79

def source_id
  Queris.digest source_key
end

#source_keyObject

Raises:



74
75
76
77
78
# File 'lib/queris/query/page.rb', line 74

def source_key
  raise NotImplemented, "paging by multiple sorts not yet implemented" if @ops.count > 1
  binding.pry if @ops.first.nil?
  @ops.first.keys[1]
end

#volatile_query_keys(q) ⇒ Object



16
17
18
# File 'lib/queris/query/page.rb', line 16

def volatile_query_keys(q)
  [ q.results_key(:last_loaded_page) ]
end