hbase-jruby 0.3.5-java → 0.4.0-java

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/test/test_table.rb CHANGED
@@ -34,8 +34,11 @@ class TestTable < TestHBaseJRubyBase
34
34
  end
35
35
 
36
36
  def test_put_then_get
37
+ row1 = next_rowkey.to_s
38
+ row2 = next_rowkey.to_s
39
+ row3 = next_rowkey.to_s
37
40
  # Single record put
38
- assert_equal 1, @table.put('row1',
41
+ assert_equal 1, @table.put(row1,
39
42
  'cf1:a' => 2,
40
43
  'cf1:b' => 'b',
41
44
  'cf1:c' => 6.28,
@@ -46,7 +49,7 @@ class TestTable < TestHBaseJRubyBase
46
49
  'cf1:short' => { :short => 200 },
47
50
  'cf1:int' => { :int => 300 },
48
51
  'cf1:str1' => "Goodbye", 'cf1:str2' => "Cruel world")
49
- assert_equal 1, @table.put('row1',
52
+ assert_equal 1, @table.put(row1,
50
53
  'cf1:a' => 1,
51
54
  'cf1:b' => 'a',
52
55
  'cf1:c' => 3.14,
@@ -60,66 +63,66 @@ class TestTable < TestHBaseJRubyBase
60
63
  'cf1:str1' => "Hello", 'cf1:str2' => "World")
61
64
  # Batch put
62
65
  assert_equal 2, @table.put(
63
- 'row2' => { 'cf1:a' => 2, 'cf1:b' => 'b', 'cf1:c' => 6.28 },
64
- 'row3' => { 'cf1:a' => 4, 'cf1:b' => 'c', 'cf1:c' => 6.28 })
66
+ row2 => { 'cf1:a' => 2, 'cf1:b' => 'b', 'cf1:c' => 6.28 },
67
+ row3 => { 'cf1:a' => 4, 'cf1:b' => 'c', 'cf1:c' => 6.28 })
65
68
 
66
69
  # single-get (latest version)
67
- result = @table.get('row1')
70
+ result = @table.get(row1)
68
71
  # Test enumerator
69
72
  assert_equal result.to_a, result.each.each.to_a
70
73
  assert_equal result.to_a, result.each.take_while { true }.to_a
71
74
 
72
- assert_equal 'row1', @table.get('row1').rowkey(:string)
73
- assert_equal 'row1', @table.get('row1').rowkey(:string)
74
- assert_equal 1, @table.get('row1').fixnum('cf1:a')
75
- assert_equal 'a', @table.get('row1').string('cf1:b')
76
- assert_equal 'a', String.from_java_bytes(@table.get('row1').raw('cf1:b'))
77
- assert_equal 3.14, @table.get('row1').float('cf1:c')
78
- assert_equal true, @table.get('row1').boolean('cf1:d')
79
- assert_equal :sym, @table.get('row1').symbol('cf1:f')
80
- assert_equal BigDecimal.new("123.456"), @table.get('row1').bigdecimal('cf1:g')
81
- assert_equal 101, @table.get('row1').byte('cf1:byte')
82
- assert_equal 201, @table.get('row1').short('cf1:short')
83
- assert_equal 301, @table.get('row1').int('cf1:int')
75
+ assert_equal row1, @table.get(row1).rowkey(:string)
76
+ assert_equal row1, @table.get(row1).rowkey(:string)
77
+ assert_equal 1, @table.get(row1).fixnum('cf1:a')
78
+ assert_equal 'a', @table.get(row1).string('cf1:b')
79
+ assert_equal 'a', String.from_java_bytes(@table.get(row1).raw('cf1:b'))
80
+ assert_equal 3.14, @table.get(row1).float('cf1:c')
81
+ assert_equal true, @table.get(row1).boolean('cf1:d')
82
+ assert_equal :sym, @table.get(row1).symbol('cf1:f')
83
+ assert_equal BigDecimal.new("123.456"), @table.get(row1).bigdecimal('cf1:g')
84
+ assert_equal 101, @table.get(row1).byte('cf1:byte')
85
+ assert_equal 201, @table.get(row1).short('cf1:short')
86
+ assert_equal 301, @table.get(row1).int('cf1:int')
84
87
 
85
88
  # single-get-multi-col (deprecated since 0.3)
86
- # assert_equal %w[Hello World], @table.get('row1').string(['cf1:str1', 'cf1:str2'])
87
- # assert_equal [301, 401], @table.get('row1').int(['cf1:int', 'cf1:int2'])
89
+ # assert_equal %w[Hello World], @table.get(row1).string(['cf1:str1', 'cf1:str2'])
90
+ # assert_equal [301, 401], @table.get(row1).int(['cf1:int', 'cf1:int2'])
88
91
 
89
92
  # single-get-multi-ver
90
- assert_equal [1, 2], @table.get('row1').fixnums('cf1:a').values
91
- assert_equal %w[a b], @table.get('row1').strings('cf1:b').values
92
- assert_equal %w[a b], @table.get('row1').raws('cf1:b').values.map { |v| String.from_java_bytes v }
93
- assert_equal [3.14, 6.28], @table.get('row1').floats('cf1:c').values
94
- assert_equal [true, false], @table.get('row1').booleans('cf1:d').values
95
- assert_equal [:sym, :bol], @table.get('row1').symbols('cf1:f').values
93
+ assert_equal [1, 2], @table.get(row1).fixnums('cf1:a').values
94
+ assert_equal %w[a b], @table.get(row1).strings('cf1:b').values
95
+ assert_equal %w[a b], @table.get(row1).raws('cf1:b').values.map { |v| String.from_java_bytes v }
96
+ assert_equal [3.14, 6.28], @table.get(row1).floats('cf1:c').values
97
+ assert_equal [true, false], @table.get(row1).booleans('cf1:d').values
98
+ assert_equal [:sym, :bol], @table.get(row1).symbols('cf1:f').values
96
99
  assert_equal [
97
100
  BigDecimal.new("123.456"),
98
- BigDecimal.new("456.123")], @table.get('row1').bigdecimals('cf1:g').values
99
- assert_equal [101, 100], @table.get('row1').bytes('cf1:byte').values
100
- assert_equal [201, 200], @table.get('row1').shorts('cf1:short').values
101
- assert_equal [301, 300], @table.get('row1').ints('cf1:int').values
101
+ BigDecimal.new("456.123")], @table.get(row1).bigdecimals('cf1:g').values
102
+ assert_equal [101, 100], @table.get(row1).bytes('cf1:byte').values
103
+ assert_equal [201, 200], @table.get(row1).shorts('cf1:short').values
104
+ assert_equal [301, 300], @table.get(row1).ints('cf1:int').values
102
105
 
103
- assert @table.get('row1').fixnums('cf1:a').keys.all? { |k| k.instance_of? Fixnum }
106
+ assert @table.get(row1).fixnums('cf1:a').keys.all? { |k| k.instance_of? Fixnum }
104
107
 
105
108
  # single-get-multi-col-multi=ver (deprecated since 0.3)
106
- # rets = @table.get('row1').strings(['cf1:str1', 'cf1:str2'])
109
+ # rets = @table.get(row1).strings(['cf1:str1', 'cf1:str2'])
107
110
  # assert_equal ['Hello', 'World'], rets.map(&:values).map(&:first)
108
111
  # assert_equal ['Goodbye', 'Cruel world'], rets.map(&:values).map(&:last)
109
112
 
110
113
  # multi-get
111
- assert_equal %w[row1 row2 row3], @table.get(['row1', 'row2', 'row3']).map { |r| r.rowkey :string }
112
- assert_equal [1, 2, 4 ], @table.get(['row1', 'row2', 'row3']).map { |r| r.fixnum('cf1:a') }
113
- assert_equal [3.14, 6.28, 6.28], @table.get(['row1', 'row2', 'row3']).map { |r| r.float('cf1:c') }
114
+ assert_equal [row1, row2, row3], @table.get([row1, row2, row3]).map { |r| r.rowkey :string }
115
+ assert_equal [1, 2, 4 ], @table.get([row1, row2, row3]).map { |r| r.fixnum('cf1:a') }
116
+ assert_equal [3.14, 6.28, 6.28], @table.get([row1, row2, row3]).map { |r| r.float('cf1:c') }
114
117
  assert_equal [nil, nil ], @table.get(['xxx', 'yyy'])
115
118
 
116
119
  # Unavailable columns
117
- assert_equal nil, @table.get('row1').symbol('cf1:xxx')
118
- assert_equal nil, @table.get('row1').fixnum('cf1:xxx')
120
+ assert_equal nil, @table.get(row1).symbol('cf1:xxx')
121
+ assert_equal nil, @table.get(row1).fixnum('cf1:xxx')
119
122
 
120
123
  # Unavailable columns (plural form)
121
- assert_equal({}, @table.get('row1').strings('cf1:xxx'))
122
- assert_equal({}, @table.get('row1').strings('cfx:xxx'))
124
+ assert_equal({}, @table.get(row1).strings('cf1:xxx'))
125
+ assert_equal({}, @table.get(row1).strings('cfx:xxx'))
123
126
 
124
127
  # Row not found
125
128
  assert_equal nil, @table.get('xxx')
@@ -128,19 +131,20 @@ class TestTable < TestHBaseJRubyBase
128
131
  # Put added after a delete is overshadowed if its timestamp is older than than that of the tombstone
129
132
  # https://issues.apache.org/jira/browse/HBASE-2847
130
133
  def test_put_delete_put
134
+ rowkey = next_rowkey
131
135
  pend("https://issues.apache.org/jira/browse/HBASE-2847") do
132
136
  data = { 'cf1:pdp' => { 1250000000000 => 'A1' } }
133
- @table.put :rowkey => data
134
- assert_equal 'A1', @table.get(:rowkey).string('cf1:pdp')
135
- @table.delete :rowkey
136
- assert_nil @table.get(:rowkey)
137
- @table.put :rowkey => data
138
- assert_equal 'A1', @table.get(:rowkey).string('cf1:pdp')
137
+ @table.put rowkey => data
138
+ assert_equal 'A1', @table.get(rowkey).string('cf1:pdp')
139
+ @table.delete rowkey
140
+ assert_nil @table.get(rowkey)
141
+ @table.put rowkey => data
142
+ assert_equal 'A1', @table.get(rowkey).string('cf1:pdp')
139
143
  end
140
144
  end
141
145
 
142
146
  def test_put_timestamp
143
- rowkey = :test_put_timestamp
147
+ rowkey = next_rowkey
144
148
  @table.put rowkey => {
145
149
  'cf1:b' => 'B1',
146
150
  'cf1:a' => {
@@ -157,103 +161,125 @@ class TestTable < TestHBaseJRubyBase
157
161
  end
158
162
 
159
163
  def test_increment
160
- @table.put('row1', 'cf1:counter' => 1, 'cf1:counter2' => 100)
161
- assert_equal 1, @table.get('row1').fixnum('cf1:counter')
164
+ row1 = next_rowkey.to_s
165
+ row2 = next_rowkey.to_s
162
166
 
163
- @table.increment('row1', 'cf1:counter', 1)
164
- assert_equal 2, @table.get('row1').fixnum('cf1:counter')
167
+ @table.put(row1, 'cf1:counter' => 1, 'cf1:counter2' => 100)
168
+ assert_equal 1, @table.get(row1).fixnum('cf1:counter')
165
169
 
166
- @table.increment('row1', 'cf1:counter', 2)
167
- assert_equal 4, @table.get('row1').fixnum('cf1:counter')
170
+ ret = @table.increment(row1, 'cf1:counter', 1)
171
+ assert_equal 2, ret['cf1:counter']
172
+ assert_equal 2, @table.get(row1).fixnum('cf1:counter')
173
+
174
+ ret = @table.increment(row1, 'cf1:counter', 2)
175
+ assert_equal 4, ret['cf1:counter']
176
+ assert_equal 4, @table.get(row1).fixnum('cf1:counter')
168
177
 
169
178
  # Multi-column increment
170
- @table.increment('row1', 'cf1:counter' => 4, 'cf1:counter2' => 100)
171
- assert_equal 8, @table.get('row1').fixnum('cf1:counter')
172
- assert_equal 200, @table.get('row1').fixnum('cf1:counter2')
179
+ ret = @table.increment(row1, 'cf1:counter' => 4, 'cf1:counter2' => 100)
180
+ assert_equal 8, ret['cf1:counter']
181
+ assert_equal 8, @table.get(row1).fixnum('cf1:counter')
182
+ assert_equal 200, ret['cf1:counter2']
183
+ assert_equal 200, ret[%w[cf1 counter2]]
184
+ assert_equal 200, @table.get(row1).fixnum('cf1:counter2')
173
185
 
174
186
  # Multi-row multi-column increment
175
- @table.put('row2', 'cf1:counter' => 1, 'cf1:counter2' => 100)
176
- @table.increment 'row1' => { 'cf1:counter' => 4, 'cf1:counter2' => 100 },
177
- 'row2' => { 'cf1:counter' => 1, 'cf1:counter2' => 100 }
178
- assert_equal 12, @table.get('row1').fixnum('cf1:counter')
179
- assert_equal 300, @table.get('row1').fixnum('cf1:counter2')
180
- assert_equal 2, @table.get('row2').fixnum('cf1:counter')
181
- assert_equal 200, @table.get('row2').fixnum('cf1:counter2')
187
+ @table.put(row2, 'cf1:counter' => 1, 'cf1:counter2' => 100)
188
+ ret = @table.increment row1 => { 'cf1:counter' => 4, 'cf1:counter2' => 100 },
189
+ row2 => { 'cf1:counter' => 1, 'cf1:counter2' => 100 }
190
+ assert_equal 12, ret[row1]['cf1:counter']
191
+ assert_equal 300, ret[row1]['cf1:counter2']
192
+ assert_equal 2, ret[row2]['cf1:counter']
193
+ assert_equal 200, ret[row2]['cf1:counter2']
194
+ assert_equal 200, ret[row2][%w[cf1 counter2]]
195
+ assert_equal 12, @table.get(row1).fixnum('cf1:counter')
196
+ assert_equal 300, @table.get(row1).fixnum('cf1:counter2')
197
+ assert_equal 2, @table.get(row2).fixnum('cf1:counter')
198
+ assert_equal 200, @table.get(row2).fixnum('cf1:counter2')
182
199
  end
183
200
 
184
201
  def test_delete
185
- @table.put('row1', 'cf1' => 0, 'cf1:a' => 1, 'cf1:b' => 2, 'cf2:c' => 3, 'cf2:d' => 4)
202
+ row1 = next_rowkey.to_s
203
+ row2 = next_rowkey.to_s
204
+ row3 = next_rowkey.to_s
205
+
206
+ @table.put(row1, 'cf1:' => 0, 'cf1:a' => 1, 'cf1:b' => 2, 'cf2:c' => 3, 'cf2:d' => 4)
186
207
  sleep 0.1
187
- @table.put('row1', 'cf2:d' => 5)
208
+ @table.put(row1, 'cf2:d' => 5)
188
209
  sleep 0.1
189
- @table.put('row1', 'cf2:d' => 6)
190
- versions = @table.get('row1').to_H[%w[cf2 d]].keys
210
+ @table.put(row1, 'cf2:d' => 6)
211
+ versions = @table.get(row1).to_H[%w[cf2 d]].keys
191
212
  assert versions[0] > versions[1]
192
213
  assert versions[1] > versions[2]
193
214
 
194
215
  # Deletes a version (Fixnum and Time as timestamps)
195
- @table.delete('row1', 'cf2:d', versions[0], Time.at(versions[2] / 1000.0))
196
- new_versions = @table.get('row1').to_H[%w[cf2 d]].keys
216
+ @table.delete(row1, 'cf2:d', versions[0], Time.at(versions[2] / 1000.0))
217
+ new_versions = @table.get(row1).to_H[%w[cf2 d]].keys
197
218
  assert_equal new_versions, [versions[1]]
198
219
 
199
220
  # Deletes a column
200
- assert_equal 3, @table.get('row1').fixnum('cf2:c')
201
- @table.delete('row1', 'cf2:c')
202
- assert_nil @table.get('row1').to_h['cf2:c']
221
+ assert_equal 3, @table.get(row1).fixnum('cf2:c')
222
+ @table.delete(row1, 'cf2:c')
223
+ assert_nil @table.get(row1).to_h['cf2:c']
203
224
 
204
225
  # Deletes a column with empty qualifier
205
- assert_equal 0, @table.get('row1').fixnum('cf1')
206
- @table.delete('row1', 'cf1:')
207
- assert_equal 1, @table.get('row1').fixnum('cf1:a')
208
- assert_equal 2, @table.get('row1').fixnum('cf1:b')
209
- assert_nil @table.get('row1').to_h['cf1']
210
- assert_nil @table.get('row1').to_h['cf1:']
226
+ assert_equal 0, @table.get(row1).fixnum('cf1:')
227
+ @table.delete(row1, 'cf1:')
228
+ assert_equal 1, @table.get(row1).fixnum('cf1:a')
229
+ assert_equal 2, @table.get(row1).fixnum('cf1:b')
230
+ assert_nil @table.get(row1).to_h['cf1:']
211
231
 
212
232
  # Deletes a column family
213
- assert_equal 1, @table.get('row1').fixnum('cf1:a')
214
- assert_equal 2, @table.get('row1').fixnum('cf1:b')
215
- @table.delete('row1', 'cf1') # No trailing colon
216
- assert_nil @table.get('row1').to_h['cf1:a']
217
- assert_nil @table.get('row1').to_h['cf1:b']
233
+ assert_equal 1, @table.get(row1).fixnum('cf1:a')
234
+ assert_equal 2, @table.get(row1).fixnum('cf1:b')
235
+ @table.delete(row1, 'cf1') # No trailing colon
236
+ assert_nil @table.get(row1).to_h['cf1:a']
237
+ assert_nil @table.get(row1).to_h['cf1:b']
218
238
 
219
239
  # Deletes a row
220
- @table.delete('row1')
221
- assert_nil @table.get('row1')
240
+ @table.delete(row1)
241
+ assert_nil @table.get(row1)
222
242
 
223
243
  # Batch delete
224
- @table.put('row2', 'cf1:a' => 1)
225
- @table.put('row3', 'cf1:a' => 1, 'cf1:b' => 2)
244
+ @table.put(row2, 'cf1:a' => 1)
245
+ @table.put(row3, 'cf1:a' => 1, 'cf1:b' => 2)
226
246
 
227
- @table.delete ['row2'], ['row3', 'cf1:a']
228
- assert_nil @table.get('row2')
229
- assert_nil @table.get('row3').to_h['cf1:a']
230
- assert_equal 2, @table.get('row3').fixnum('cf1:b')
247
+ @table.delete [row2], [row3, 'cf1:a']
248
+ assert_nil @table.get(row2)
249
+ assert_nil @table.get(row3).to_h['cf1:a']
250
+ assert_equal 2, @table.get(row3).fixnum('cf1:b')
231
251
  end
232
252
 
233
253
  def test_delete_advanced
234
- @table.put('row1', 'cf1' => 0, 'cf1:a' => 1, 'cf1:b' => 2, 'cf2:c' => 3, 'cf2:d' => 4)
235
- @table.delete('row1', 'cf1:', 'cf1:b', 'cf2')
236
- assert_equal 1, @table.get('row1').to_h.keys.length
237
- assert_equal 1, @table.get('row1').fixnum('cf1:a')
254
+ row1 = next_rowkey.to_s
255
+ drow = next_rowkey.to_s
256
+
257
+ @table.put(row1, 'cf1:' => 0, 'cf1:a' => 1, 'cf1:b' => 2, 'cf2:c' => 3, 'cf2:d' => 4)
258
+ @table.delete(row1, 'cf1:', 'cf1:b', 'cf2')
259
+ assert_equal 1, @table.get(row1).to_h.keys.length
260
+ assert_equal 1, @table.get(row1).fixnum('cf1:a')
238
261
 
239
262
  ts = Time.now
240
- @table.put('drow2', 'cf1:a' => { 1000 => 1, 2000 => 2, 3000 => 3 },
263
+ @table.put(drow, 'cf1:a' => { 1000 => 1, 2000 => 2, 3000 => 3 },
241
264
  'cf1:b' => { 4000 => 4, 5000 => 5, 6000 => 6 },
242
265
  'cf2:c' => 3, 'cf2:d' => 4, 'cf3:e' => 5)
243
- @table.delete('drow2', 'cf1:a', 1000, Time.at(2),
266
+ @table.delete(drow, 'cf1:a', 1000, Time.at(2),
244
267
  'cf2:c',
245
268
  'cf1:b', 5000,
246
269
  'cf3')
247
270
 
248
- assert_equal 3, @table.get('drow2').to_h.keys.length
271
+ assert_equal 3, @table.get(drow).to_h.keys.length
249
272
 
250
- assert_equal 1, @table.get('drow2').to_H['cf1:a'].length
251
- assert_equal 2, @table.get('drow2').to_H['cf1:b'].length
252
- assert_equal 3000, @table.get('drow2').to_H['cf1:a'].keys.first
253
- assert_equal [6000, 4000], @table.get('drow2').to_H['cf1:b'].keys
273
+ assert_equal 1, @table.get(drow).to_H['cf1:a'].length
274
+ assert_equal 2, @table.get(drow).to_H['cf1:b'].length
275
+ assert_equal 3000, @table.get(drow).to_H['cf1:a'].keys.first
276
+ assert_equal [6000, 4000], @table.get(drow).to_H['cf1:b'].keys
254
277
  end
255
278
 
256
279
  def test_delete_advanced_with_schema
280
+ row1 = next_rowkey.to_s
281
+ drow = next_rowkey.to_s
282
+
257
283
  @hbase.schema[@table.name] = {
258
284
  :cf1 => {
259
285
  :a => :int,
@@ -267,29 +293,29 @@ class TestTable < TestHBaseJRubyBase
267
293
  :e => :fixnum
268
294
  }
269
295
  }
270
- @table.put('row1', 'cf1' => 0, :a => 1, :b => 2, :c => 3, :d => 4)
271
- @table.delete('row1', 'cf1:', :b, 'cf2')
272
- assert_equal 1, @table.get('row1').to_h.keys.length
273
- assert_equal 1, @table.get('row1').to_h[:a]
274
- assert_equal 1, @table.get('row1').int(:a)
296
+ @table.put(row1, 'cf1:' => 0, :a => 1, :b => 2, :c => 3, :d => 4)
297
+ @table.delete(row1, 'cf1:', :b, 'cf2')
298
+ assert_equal 1, @table.get(row1).to_h.keys.length
299
+ assert_equal 1, @table.get(row1).to_h[:a]
300
+ assert_equal 1, @table.get(row1).int(:a)
275
301
 
276
302
  ts = Time.now
277
- @table.put('drow3', :a => { 1000 => 1, 2000 => 2, 3000 => 3 },
303
+ @table.put(drow, :a => { 1000 => 1, 2000 => 2, 3000 => 3 },
278
304
  :b => { 4000 => 4, 5000 => 5, 6000 => 6 },
279
305
  :c => 3,
280
306
  :d => 4,
281
307
  :e => 5)
282
- @table.delete('drow3', :a, 1000, Time.at(2),
308
+ @table.delete(drow, :a, 1000, Time.at(2),
283
309
  :c,
284
310
  [:cf1, :b], 5000,
285
311
  'cf3')
286
312
 
287
- assert_equal 3, @table.get('drow3').to_h.keys.length
313
+ assert_equal 3, @table.get(drow).to_h.keys.length
288
314
 
289
- assert_equal 1, @table.get('drow3').to_H[:a].length
290
- assert_equal 2, @table.get('drow3').to_H[:b].length
291
- assert_equal 3000, @table.get('drow3').to_H[:a].keys.first
292
- assert_equal [6000, 4000], @table.get('drow3').to_H[:b].keys
315
+ assert_equal 1, @table.get(drow).to_H[:a].length
316
+ assert_equal 2, @table.get(drow).to_H[:b].length
317
+ assert_equal 3000, @table.get(drow).to_H[:a].keys.first
318
+ assert_equal [6000, 4000], @table.get(drow).to_H[:b].keys
293
319
  end
294
320
 
295
321
  def test_delete_row
@@ -324,17 +350,16 @@ class TestTable < TestHBaseJRubyBase
324
350
 
325
351
  [
326
352
  # Without schema
327
- [1, 'cf1:a', 'cf1:b', 'cf1:c'],
328
- # [2, 'cf1:a', 'cf1:b', 'cf1:c'],
353
+ [next_rowkey, 'cf1:a', 'cf1:b', 'cf1:c'],
354
+ [next_rowkey, 'cf1:a', 'cf1:b', 'cf1:c'],
329
355
  # With schema
330
- [1, :a, :b, :c],
331
- # [2, :a, :b, :c],
356
+ [next_rowkey, :a, :b, :c],
357
+ [next_rowkey, :a, :b, :c],
332
358
  ].each do |args|
333
- @table.delete_row 1
334
- @table.put 1, 'cf1:a' => 100
335
-
336
359
  rk, a, b, c = args
337
360
 
361
+ @table.put rk, 'cf1:a' => 100
362
+
338
363
  # not nil
339
364
  assert_equal false, @table.check(rk, a => 200).put(b => 300)
340
365
  assert_equal nil, @table.get(rk).short(b)
@@ -366,7 +391,7 @@ class TestTable < TestHBaseJRubyBase
366
391
  ].each do |abcd|
367
392
  a, b, c, d = abcd
368
393
 
369
- rk = (Time.now.to_f * 1000).to_i
394
+ rk = next_rowkey
370
395
  ts = Time.now
371
396
  @table.put rk, a => 100, b => 200,
372
397
  c => { ts => 300, (ts - 1000) => 400, (ts - 2000).to_i => 500 },
@@ -395,5 +420,126 @@ class TestTable < TestHBaseJRubyBase
395
420
  }
396
421
  end
397
422
  end
423
+
424
+ def test_append
425
+ rk = next_rowkey
426
+ @table.put rk, 'cf1:a' => 'hello', 'cf2:b' => 'foo'
427
+ result = @table.append rk, 'cf1:a' => ' world', 'cf2:b' => 'bar'
428
+ assert_equal 'hello world', result['cf1:a'].to_s
429
+ assert_equal 'foobar', result[%w[cf2 b]].to_s
430
+ assert_equal 'hello world', @table.get(rk).string('cf1:a')
431
+ assert_equal 'foobar', @table.get(rk).string('cf2:b')
432
+ end
433
+
434
+ def test_mutate
435
+ rk = next_rowkey
436
+ @table.put rk,
437
+ 'cf1:a' => 100, 'cf1:b' => 'hello', 'cf1:c' => 'hola',
438
+ 'cf2:d' => 3.14
439
+ ret = @table.mutate(rk) { |m|
440
+ m.put 'cf1:a' => 200
441
+ m.delete 'cf1:c', 'cf2'
442
+ m.put 'cf1:z' => true
443
+ }
444
+ assert_equal nil, ret
445
+
446
+ row = @table.get(rk)
447
+ assert_equal 200, row.long('cf1:a')
448
+ assert_equal 'hello', row.string('cf1:b')
449
+ assert_equal nil, row.string('cf1:c')
450
+ assert_equal nil, row['cf1:c']
451
+ assert_equal true, row.boolean('cf1:z')
452
+ assert_equal nil, row.float('cf2:d')
453
+ assert_equal nil, row['cf2:d']
454
+
455
+ @table.mutate(rk) { |m| } # Nothing
456
+ @table.mutate(rk) { |m| m.delete }
457
+ assert_equal nil, @table.get(rk)
458
+ end
459
+
460
+ def test_invalid_column_key
461
+ assert_raise(ArgumentError) {
462
+ @table.put next_rowkey, :some_column => 1
463
+ }
464
+ end
465
+
466
+ def test_batch
467
+ rk1, rk2, rk3 = next_rowkey, next_rowkey, next_rowkey
468
+
469
+ ret = @table.batch { |b|
470
+ b.put rk1, 'cf1:a' => 1, 'cf1:b' => 2, 'cf2:c' => 'hello'
471
+ b.put rk2, 'cf1:a' => 2, 'cf1:b' => 3, 'cf2:c' => 'hello'
472
+ b.put rk3, 'cf1:a' => 3, 'cf1:b' => 4, 'cf2:c' => 'hello'
473
+ }
474
+ assert_equal 3, ret.length
475
+ assert_equal :put, ret[0][:type]
476
+ assert_equal :put, ret[1][:type]
477
+ assert_equal :put, ret[2][:type]
478
+ assert_equal true, ret[0][:result]
479
+ assert_equal true, ret[1][:result]
480
+ assert_equal true, ret[2][:result]
481
+
482
+ ret = @table.batch { |b|
483
+ b.put rk3, 'cf1:c' => 5
484
+ b.delete rk1, 'cf1:a'
485
+ b.increment rk2, 'cf1:a' => 10, 'cf1:b' => 20
486
+ b.append rk2, 'cf2:c' => ' world'
487
+ b.mutate(rk3) do |m|
488
+ m.put 'cf2:d' => 'hola'
489
+ m.put 'cf2:e' => 'mundo'
490
+ m.delete 'cf1:b'
491
+ end
492
+ b.get(rk1)
493
+ b.filter('cf1:a' => 0).get(rk1)
494
+ b.versions(1).project('cf2').get(rk1)
495
+ }
496
+ assert_equal 8, ret.length
497
+ assert_equal [:put, :delete, :increment, :append, :mutate, :get, :get, :get],
498
+ ret.map { |r| r[:type] }
499
+ assert_equal [true, true, true],
500
+ ret.values_at(0, 1, 4).map { |r| r[:result] }
501
+ assert_equal 12, ret[2][:result]['cf1:a']
502
+ assert_equal 23, ret[2][:result]['cf1:b']
503
+ assert_equal 'hello world', ret[3][:result]['cf2:c'].to_s
504
+ # assert_equal nil, ret[5][:result].long('cf1:a') # No guarantee
505
+ assert_equal 2, ret[5][:result].long('cf1:b')
506
+ assert_equal nil, ret[6][:result]
507
+ assert_equal nil, ret[7][:result].fixnum('cf1:b')
508
+ assert_equal 'hello', ret[7][:result].string('cf2:c')
509
+
510
+ assert_equal nil, @table.get(rk1)['cf1:a']
511
+ assert_equal 12, @table.get(rk2).long('cf1:a')
512
+ assert_equal 23, @table.get(rk2).long('cf1:b')
513
+ assert_equal 5, @table.get(rk3).long('cf1:c')
514
+ assert_equal 'hello world', @table.get(rk2).string('cf2:c')
515
+ assert_equal 'hola', @table.get(rk3).string('cf2:d')
516
+ assert_equal 'mundo', @table.get(rk3).string('cf2:e')
517
+ assert_equal nil, @table.get(rk3).string('cf2:b')
518
+ end
519
+
520
+ def test_batch_exception
521
+ rk = next_rowkey
522
+ @table.put rk, 'cf1:a' => 1
523
+
524
+ begin
525
+ @table.batch do |b|
526
+ b.put next_rowkey, 'cf1:a' => 1
527
+ b.put next_rowkey, 'cf100:a' => 1
528
+ b.get rk
529
+ b.put next_rowkey, 'cf200:a' => 1
530
+ end
531
+ assert false
532
+ rescue HBase::BatchException => e
533
+ assert_equal 4, e.results.length
534
+ assert_equal true, e.results[0][:result]
535
+ assert_equal false, e.results[1][:result]
536
+ assert_equal 1, e.results[2][:result].fixnum('cf1:a')
537
+ assert_equal false, e.results[3][:result]
538
+
539
+ assert e.results[1][:exception].is_a?(java.lang.Exception)
540
+ assert e.results[3][:exception].is_a?(java.lang.Exception)
541
+ assert e.java_exception.is_a?(java.lang.Exception)
542
+ end
543
+ end
398
544
  end
399
545
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hbase-jruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
5
4
  prerelease:
5
+ version: 0.4.0
6
6
  platform: java
7
7
  authors:
8
8
  - Junegunn Choi
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-19 00:00:00.000000000 Z
12
+ date: 2013-07-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: test-unit
@@ -59,6 +59,7 @@ files:
59
59
  - hbase-jruby.gemspec
60
60
  - lib/hbase-jruby.rb
61
61
  - lib/hbase-jruby/admin.rb
62
+ - lib/hbase-jruby/batch_exception.rb
62
63
  - lib/hbase-jruby/byte_array.rb
63
64
  - lib/hbase-jruby/cell.rb
64
65
  - lib/hbase-jruby/dependency.rb
@@ -70,8 +71,10 @@ files:
70
71
  - lib/hbase-jruby/scoped/aggregation.rb
71
72
  - lib/hbase-jruby/table.rb
72
73
  - lib/hbase-jruby/table/admin.rb
74
+ - lib/hbase-jruby/table/batch_action.rb
73
75
  - lib/hbase-jruby/table/checked_operation.rb
74
76
  - lib/hbase-jruby/table/inspection.rb
77
+ - lib/hbase-jruby/table/mutation.rb
75
78
  - lib/hbase-jruby/util.rb
76
79
  - lib/hbase-jruby/version.rb
77
80
  - test/helper.rb