Class: StrokeDB::Chunk

Inherits:
Object show all
Defined in:
lib/stores/skiplist_store/chunk.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cut_level) ⇒ Chunk

Returns a new instance of Chunk.



6
7
8
# File 'lib/stores/skiplist_store/chunk.rb', line 6

def initialize(cut_level)
  @skiplist, @cut_level = Skiplist.new({}, nil, cut_level), cut_level
end

Instance Attribute Details

#cut_levelObject

Returns the value of attribute cut_level.



3
4
5
# File 'lib/stores/skiplist_store/chunk.rb', line 3

def cut_level
  @cut_level
end

#next_chunkObject

Returns the value of attribute next_chunk.



3
4
5
# File 'lib/stores/skiplist_store/chunk.rb', line 3

def next_chunk
  @next_chunk
end

#next_chunk_uuidObject

Returns the value of attribute next_chunk_uuid.



4
5
6
# File 'lib/stores/skiplist_store/chunk.rb', line 4

def next_chunk_uuid
  @next_chunk_uuid
end

#prev_chunkObject

Returns the value of attribute prev_chunk.



3
4
5
# File 'lib/stores/skiplist_store/chunk.rb', line 3

def prev_chunk
  @prev_chunk
end

#skiplistObject

Returns the value of attribute skiplist.



3
4
5
# File 'lib/stores/skiplist_store/chunk.rb', line 3

def skiplist
  @skiplist
end

#store_uuidObject

Returns the value of attribute store_uuid.



5
6
7
# File 'lib/stores/skiplist_store/chunk.rb', line 5

def store_uuid
  @store_uuid
end

#timestampObject

Returns the value of attribute timestamp.



3
4
5
# File 'lib/stores/skiplist_store/chunk.rb', line 3

def timestamp
  @timestamp
end

#uuidObject

Returns the value of attribute uuid.



3
4
5
# File 'lib/stores/skiplist_store/chunk.rb', line 3

def uuid
  @uuid
end

Class Method Details

.from_raw(raw) {|chunk| ... } ⇒ Object

TODO: lazify

Yields:

  • (chunk)


75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/stores/skiplist_store/chunk.rb', line 75

def self.from_raw(raw)
  chunk = Chunk.new(raw['cut_level'])
  chunk.uuid = raw['uuid']
   chunk.next_chunk_uuid = raw['next_uuid']
   chunk.timestamp = raw['timestamp']
   chunk.store_uuid = raw['store_uuid']
   chunk.skiplist.raw_insert(raw['nodes']) do |rn|
    [rn['key'], rn['value'], rn['forward'].size, rn['timestamp']]
  end
  yield(chunk) if block_given?
  chunk
end

Instance Method Details

#delete(uuid) ⇒ Object



24
25
26
# File 'lib/stores/skiplist_store/chunk.rb', line 24

def delete(uuid)
  skiplist.delete(uuid)
end

#each(&block) ⇒ Object



68
69
70
# File 'lib/stores/skiplist_store/chunk.rb', line 68

def each(&block)
  skiplist.each &block
end

#eql?(chunk) ⇒ Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/stores/skiplist_store/chunk.rb', line 114

def eql?(chunk)
 chunk.uuid == @uuid && chunk.skiplist.eql?(@skiplist)
end

#find(uuid, default = nil) ⇒ Object



28
29
30
# File 'lib/stores/skiplist_store/chunk.rb', line 28

def find(uuid, default = nil)
  skiplist.find(uuid, default)
end

#find_nearest(uuid, default = nil) ⇒ Object



36
37
38
# File 'lib/stores/skiplist_store/chunk.rb', line 36

def find_nearest(uuid, default = nil)
  skiplist.find_nearest(uuid, default)
end

#find_next_node(node) ⇒ Object

Finds next node across separate chunks



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/stores/skiplist_store/chunk.rb', line 41

def find_next_node(node)
  chunk = self
  node2 = node.next
  if node2.is_a?(Skiplist::TailNode)
    chunk = chunk.next_chunk
    unless chunk.nil?
      node2 = chunk.first_node
    else
      node2 = nil
    end
  end
  node2
end

#find_node(uuid) ⇒ Object



32
33
34
# File 'lib/stores/skiplist_store/chunk.rb', line 32

def find_node(uuid)
  skiplist.find_node(uuid)
end

#first_nodeObject



60
61
62
# File 'lib/stores/skiplist_store/chunk.rb', line 60

def first_node
  skiplist.first_node
end

#first_uuidObject



56
57
58
# File 'lib/stores/skiplist_store/chunk.rb', line 56

def first_uuid
  skiplist.first_node.key
end

#insert(uuid, raw_doc, __cheaters_level = nil, __timestamp = nil) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/stores/skiplist_store/chunk.rb', line 10

def insert(uuid, raw_doc, __cheaters_level = nil, __timestamp = nil)
  @uuid ||= uuid
  __cheaters_level ||= $DEBUG_CHEATERS_LEVEL
  a, new_list = skiplist.insert(uuid, raw_doc, __cheaters_level, __timestamp)
  if new_list
    tmp = Chunk.new(@cut_level)
    tmp.skiplist = new_list
    tmp.next_chunk = @next_chunk if @next_chunk
    @next_chunk = tmp
    @next_chunk.uuid = uuid
  end
  [self, @next_chunk]
end

#sizeObject



64
65
66
# File 'lib/stores/skiplist_store/chunk.rb', line 64

def size
  skiplist.size
end

#to_rawObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/stores/skiplist_store/chunk.rb', line 88

def to_raw
  # enumerate nodes
  skiplist.each_with_index do |node, i|
  	  node._serialized_index = i
   end
   
   # now we know keys' positions right in the nodes
  nodes = skiplist.map do |node|
     {
       'key'     => node.key,
       'forward' => node.forward.map{|n| n._serialized_index || 0 },
       'value'   => node.value,
       'timestamp' => node.timestamp
     }
   end
   {
     'nodes'     => nodes, 
     'cut_level' => @cut_level, 
     'uuid'      => @uuid,
     # TODO: may not be needed
     'next_uuid' => next_chunk ? next_chunk.uuid : nil,
     'timestamp' => @timestamp,
     'store_uuid' => @store_uuid
   }
end