hbase-jruby 0.1.6-java → 0.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
data/test/test_hbase.rb CHANGED
@@ -6,15 +6,22 @@ require 'helper'
6
6
  class TestHBase < TestHBaseJRubyBase
7
7
  def test_tables
8
8
  assert @hbase.table_names.include?(TABLE)
9
+ assert @hbase.list.include?(TABLE)
9
10
  assert @hbase.tables.map(&:name).include?(TABLE)
10
11
  end
11
12
 
12
13
  def test_close
14
+ table = @hbase[TABLE]
15
+ table.exists?
16
+ assert @hbase.list.is_a?(Array)
17
+
18
+ assert !@hbase.closed?
13
19
  @hbase.close
20
+ assert @hbase.closed?
14
21
 
15
- # TODO: Still usable after close?
16
- assert @hbase.table_names.include?(TABLE)
17
- assert_equal 1, @table.put('rowkey' => { 'cf1:a' => 1 })
22
+ assert_raise(RuntimeError) { @hbase.list }
23
+ assert_raise(RuntimeError) { table.exists? }
24
+ assert_raise(RuntimeError) { table.drop! }
18
25
  end
19
26
 
20
27
  def test_admin
data/test/test_scoped.rb CHANGED
@@ -378,5 +378,40 @@ class TestScoped < TestHBaseJRubyBase
378
378
  # Fails on 0.1.3
379
379
  assert_equal 1, @table.range(:prefix => (HBase::ByteArray(50) + HBase::ByteArray(50)).java).count
380
380
  end
381
+
382
+ def test_time_range_at
383
+ t1, t2, t3, t4 =
384
+ Time.now - 4000,
385
+ Time.now - 3000,
386
+ Time.now - 2000,
387
+ Time.now - 1000
388
+ @table.put :rowkey1 => { 'cf1:a' => { t1 => 1 } }
389
+ @table.put :rowkey2 => { 'cf1:a' => { t2 => 2 } }
390
+ @table.put :rowkey3 => { 'cf1:a' => { t3 => 3 } }
391
+ @table.put :rowkey4 => { 'cf1:a' => { t4 => 4 } }
392
+
393
+ assert_equal 1, @table.time_range(t2, t3).count
394
+ assert_equal 2, @table.time_range(t2, t3 + 1).count
395
+ assert_equal 2, @table.time_range(t2, t4).count
396
+ assert_equal 4, @table.time_range(0, t4 + 1).count
397
+
398
+ assert_equal [2, 3], @table.time_range(t2, t4).map { |r| r.fixnum 'cf1:a' }.sort
399
+ assert_equal %w[rowkey2 rowkey3], @table.time_range(t2, t4).map { |r| r.rowkey :string }.sort
400
+
401
+ assert_equal 1, @table.at(t2).count
402
+ assert_equal 0, @table.at(t2 - 1).count
403
+ assert_equal 0, @table.at(t2 + 1).count
404
+ assert_equal [2], @table.at(t2).map { |r| r.fixnum 'cf1:a' }
405
+
406
+ @table.put :rowkey5 => { 'cf1:a' => { t1 => 'a', t4 => 'A' }, 'cf1:b' => { t4 => 'B' }}
407
+ assert_equal 'A', @table.get(:rowkey5).string('cf1:a')
408
+ assert_equal 'B', @table.get(:rowkey5).string('cf1:b')
409
+
410
+ assert_equal 'a', @table.time_range(t1, t3).get(:rowkey5).string('cf1:a')
411
+ assert_equal nil, @table.time_range(t1, t3).get(:rowkey5).string('cf1:b')
412
+
413
+ # according to current hbase impl, later call overrides the previous time ranges. but, why do this?
414
+ assert_equal 2, @table.time_range(t2, t3).at(t1).count
415
+ end
381
416
  end
382
417
 
data/test/test_table.rb CHANGED
@@ -4,23 +4,33 @@ $LOAD_PATH.unshift File.expand_path('..', __FILE__)
4
4
  require 'helper'
5
5
  require 'bigdecimal'
6
6
 
7
- class TestScoped < TestHBaseJRubyBase
8
- def test_table
7
+ class TestTable < TestHBaseJRubyBase
8
+ def test_table_block
9
9
  @hbase.table(TABLE) do |table|
10
10
  assert_equal TABLE, table.name
11
11
  assert table.exists?
12
12
  end
13
+ end
13
14
 
15
+ def test_table_htable
16
+ htables = []
14
17
  table = @hbase.table(TABLE)
15
- 2.times do
16
- assert_equal TABLE, table.name
17
- assert table.exists?
18
- table.close
19
- table.close
18
+ 4.times do
19
+ htables << table.htable
20
+ end
21
+ assert_equal 1, htables.uniq.length
20
22
 
21
- # Gets another HTable instance from HTablePool
22
- table.put('rowkey' => { 'cf1:a' => 1 })
23
+ # Multi-threaded
24
+ htables = []
25
+ table = @hbase.table(TABLE)
26
+ 4.times do
27
+ Thread.new {
28
+ htables << table.htable
29
+ }.join
23
30
  end
31
+ assert_equal 4, htables.uniq.length
32
+
33
+ assert_equal @hbase.table(TABLE).htable, @hbase[TABLE].htable
24
34
  end
25
35
 
26
36
  def test_put_then_get
@@ -75,18 +85,18 @@ class TestScoped < TestHBaseJRubyBase
75
85
  assert_equal [301, 401], @table.get('row1').int(['cf1:int', 'cf1:int2'])
76
86
 
77
87
  # single-get-multi-ver
78
- assert_equal [1, 2], @table.get('row1').fixnums('cf1:a').values
79
- assert_equal %w[a b], @table.get('row1').strings('cf1:b').values
80
- assert_equal %w[a b], @table.get('row1').raws('cf1:b').values.map { |v| String.from_java_bytes v }
81
- assert_equal [3.14, 6.28], @table.get('row1').floats('cf1:c').values
82
- assert_equal [true, false], @table.get('row1').booleans('cf1:d').values
83
- assert_equal [:sym, :bol], @table.get('row1').symbols('cf1:f').values
88
+ assert_equal [1, 2], @table.get('row1').fixnums('cf1:a').values
89
+ assert_equal %w[a b], @table.get('row1').strings('cf1:b').values
90
+ assert_equal %w[a b], @table.get('row1').raws('cf1:b').values.map { |v| String.from_java_bytes v }
91
+ assert_equal [3.14, 6.28], @table.get('row1').floats('cf1:c').values
92
+ assert_equal [true, false], @table.get('row1').booleans('cf1:d').values
93
+ assert_equal [:sym, :bol], @table.get('row1').symbols('cf1:f').values
84
94
  assert_equal [
85
95
  BigDecimal.new("123.456"),
86
96
  BigDecimal.new("456.123")], @table.get('row1').bigdecimals('cf1:g').values
87
- assert_equal [101, 100], @table.get('row1').bytes('cf1:byte').values
88
- assert_equal [201, 200], @table.get('row1').shorts('cf1:short').values
89
- assert_equal [301, 300], @table.get('row1').ints('cf1:int').values
97
+ assert_equal [101, 100], @table.get('row1').bytes('cf1:byte').values
98
+ assert_equal [201, 200], @table.get('row1').shorts('cf1:short').values
99
+ assert_equal [301, 300], @table.get('row1').ints('cf1:int').values
90
100
 
91
101
  assert @table.get('row1').fixnums('cf1:a').keys.all? { |k| k.instance_of? Fixnum }
92
102
 
@@ -102,15 +112,15 @@ class TestScoped < TestHBaseJRubyBase
102
112
  assert_equal [nil, nil ], @table.get(['xxx', 'yyy'])
103
113
 
104
114
  # Unavailable columns
105
- assert_equal nil, @table.get('row1').symbol('cf1:xxx')
106
- assert_equal nil, @table.get('row1').fixnum('cf1:xxx')
115
+ assert_equal nil, @table.get('row1').symbol('cf1:xxx')
116
+ assert_equal nil, @table.get('row1').fixnum('cf1:xxx')
107
117
 
108
118
  # Unavailable columns (plural form)
109
- assert_equal({}, @table.get('row1').strings('cf1:xxx'))
110
- assert_equal({}, @table.get('row1').strings('cfx:xxx'))
119
+ assert_equal({}, @table.get('row1').strings('cf1:xxx'))
120
+ assert_equal({}, @table.get('row1').strings('cfx:xxx'))
111
121
 
112
122
  # Row not found
113
- assert_equal nil, @table.get('xxx')
123
+ assert_equal nil, @table.get('xxx')
114
124
  end
115
125
 
116
126
  # Put added after a delete is overshadowed if its timestamp is older than than that of the tombstone
@@ -134,7 +144,7 @@ class TestScoped < TestHBaseJRubyBase
134
144
  'cf1:a' => {
135
145
  1250000000000 => 'A1',
136
146
  1260000000000 => 'A2',
137
- 1270000000000 => 'A3',
147
+ Time.at(1270000000) => 'A3', # Ruby Time support
138
148
  },
139
149
  }
140
150
 
@@ -218,8 +228,8 @@ class TestScoped < TestHBaseJRubyBase
218
228
  assert versions[0] > versions[1]
219
229
  assert versions[1] > versions[2]
220
230
 
221
- # Deletes a version
222
- @table.delete('row1', 'cf2:d', versions[0], versions[2])
231
+ # Deletes a version (Fixnum and Time as timestamps)
232
+ @table.delete('row1', 'cf2:d', versions[0], Time.at(versions[2] / 1000.0))
223
233
  new_versions = @table.get('row1').to_hash_with_versions['cf2:d'].keys
224
234
  assert_equal new_versions, [versions[1]]
225
235
 
@@ -11,11 +11,25 @@ class TestTableAdmin < TestHBaseJRubyBase
11
11
  def test_create_table_symbol_string
12
12
  t = @hbase.table(:test_hbase_jruby_create_table)
13
13
  t.drop! if t.exists?
14
+
15
+ assert_raise(ArgumentError) do
16
+ t.create! :cf, :splits => :xxx
17
+ end
18
+
19
+ assert_raise(ArgumentError) do
20
+ t.create! :cf => { 1 => 2 }
21
+ end
22
+
23
+ assert_raise(ArgumentError) do
24
+ t.create! :cf, { 1 => 2 }
25
+ end
26
+
14
27
  [ :cf, 'cf', {:cf => {}} ].each do |cf|
15
28
  assert_false t.exists?
16
29
  t.create! cf
17
30
  assert t.exists?
18
31
  t.drop!
32
+
19
33
  end
20
34
  end
21
35
 
@@ -78,6 +92,10 @@ class TestTableAdmin < TestHBaseJRubyBase
78
92
  assert_raise(ArgumentError) do
79
93
  @table.alter! :hello => :world
80
94
  end
95
+ assert_raise(ArgumentError) do
96
+ # Splits not allowed
97
+ @table.alter! :readonly => :true, :splits => [1, 2, 3]
98
+ end
81
99
 
82
100
  max_fs = 512 * 1024 ** 2
83
101
  mem_fs = 64 * 1024 ** 2
@@ -138,39 +156,108 @@ class TestTableAdmin < TestHBaseJRubyBase
138
156
  @table.drop!
139
157
  end
140
158
 
141
- def test_inspect
159
+ def test_inspection
160
+ assert @table.inspect.is_a?(String)
142
161
  @table.drop!
143
- assert "{NAME => '#{TABLE}'}", @table.inspect # FIXME
144
-
145
- @table.create! :cf => {
146
- :blockcache => true,
147
- :blocksize => 128 * 1024,
148
- :bloomfilter => :row,
149
- :compression => :gzip,
150
- # :data_block_encoding => org.apache.hadoop.hbase.io.encoding.DataBlockEncoding::DIFF,
151
- # :encode_on_disk => true,
152
- # :keep_deleted_cells => true,
153
- :in_memory => true,
154
- :min_versions => 5,
155
- :replication_scope => 0,
156
- :ttl => 100,
157
- :versions => 10,
158
- }
159
- props = eval @table.inspect.gsub(/([A-Z_]+) =>/) { ":#{$1.downcase} =>" }
160
- assert_equal TABLE, props[:name]
161
- cf = props[:families].first
162
- assert_equal 'cf', cf[:name]
163
- assert_equal 'ROW', cf[:bloomfilter]
164
- assert_equal '0', cf[:replication_scope]
165
- assert_equal '10', cf[:versions]
166
- assert_equal 'GZIP', cf[:compression]
167
- assert_equal '5', cf[:min_versions]
168
- assert_equal '100', cf[:ttl]
169
- assert_equal '131072', cf[:blocksize]
170
- assert_equal 'true', cf[:in_memory]
171
- assert_equal 'true', cf[:blockcache]
162
+ assert @table.inspect.is_a?(String)
172
163
 
173
- @table.drop!
164
+ [
165
+ 'GZ',
166
+ :gz,
167
+ org.apache.hadoop.hbase.io.hfile.Compression::Algorithm::GZ
168
+ ].each do |cmp|
169
+ @table.create!({
170
+ :cf => {
171
+ :blockcache => true,
172
+ :blocksize => 128 * 1024,
173
+ :bloomfilter => :row, # as Symbol
174
+ :compression => cmp, # as String, Symbol, java.lang.Enum
175
+ :compression_compact => cmp, # as String, Symbol, java.lang.Enum
176
+ # TODO
177
+ # :data_block_encoding => :diff,
178
+ # :encode_on_disk => true,
179
+ # :keep_deleted_cells => true,
180
+ :in_memory => true,
181
+ :min_versions => 5,
182
+ :replication_scope => 0,
183
+ :ttl => 100,
184
+ :versions => 10,
185
+ }
186
+ },
187
+ :max_filesize => 512 * 1024 ** 2,
188
+ :memstore_flushsize => 64 * 1024 ** 2,
189
+ :readonly => false,
190
+ :deferred_log_flush => true,
191
+ :splits => [10, 20, 30, 40]
192
+ )
193
+
194
+ # Initial region count
195
+ regions = @table.regions
196
+ assert_equal 5, regions.count
197
+
198
+ # Table properties
199
+ props = @table.properties
200
+ assert_equal true, props[:deferred_log_flush]
201
+ assert_equal false, props[:readonly]
202
+ assert_equal 64 * 1024 ** 2, props[:memstore_flushsize]
203
+ assert_equal 512 * 1024 ** 2, props[:max_filesize]
204
+
205
+ rprops = @table.raw_properties
206
+ assert_equal true.to_s, rprops['DEFERRED_LOG_FLUSH']
207
+ assert_equal false.to_s, rprops['READONLY']
208
+ assert_equal (64 * 1024 ** 2).to_s, rprops['MEMSTORE_FLUSHSIZE']
209
+ assert_equal (512 * 1024 ** 2).to_s, rprops['MAX_FILESIZE']
210
+
211
+ # Column family properties
212
+ cf = @table.families['cf']
213
+ assert_equal 'ROW', cf[:bloomfilter]
214
+ assert_equal 0, cf[:replication_scope]
215
+ assert_equal 10, cf[:versions]
216
+ assert_equal 'GZ', cf[:compression]
217
+ assert_equal 5, cf[:min_versions]
218
+ assert_equal 100, cf[:ttl]
219
+ assert_equal 131072, cf[:blocksize]
220
+ assert_equal true, cf[:in_memory]
221
+ assert_equal true, cf[:blockcache]
222
+
223
+ rcf = @table.raw_families['cf']
224
+ assert_equal 'ROW', rcf['BLOOMFILTER']
225
+ assert_equal 0.to_s, rcf['REPLICATION_SCOPE']
226
+ assert_equal 10.to_s, rcf['VERSIONS']
227
+ assert_equal 'GZ', rcf['COMPRESSION']
228
+ assert_equal 5.to_s, rcf['MIN_VERSIONS']
229
+ assert_equal 100.to_s, rcf['TTL']
230
+ assert_equal 131072.to_s, rcf['BLOCKSIZE']
231
+ assert_equal true.to_s, rcf['IN_MEMORY']
232
+ assert_equal true.to_s, rcf['BLOCKCACHE']
233
+
234
+ @table.put 31, 'cf:a' => 100
235
+ @table.put 37, 'cf:a' => 100
236
+ @table.split!(35)
237
+
238
+ # FIXME
239
+ 10.times do |i|
240
+ break if @table.regions.count == 6
241
+ sleep 1
242
+ assert false, "Region not split" if i == 9
243
+ end
244
+
245
+ @table.put 39, 'cf:a' => 100
246
+ @table.split!(38)
247
+
248
+ # FIXME
249
+ 10.times do |i|
250
+ break if @table.regions.count == 7
251
+ sleep 1
252
+ assert false, "Region not split" if i == 9
253
+ end
254
+
255
+ regions = @table.regions
256
+ assert_equal [10, 20, 30, 35, 38, 40], regions.map { |r| HBase::Util.from_bytes :fixnum, r[:start_key] }.compact.sort
257
+ assert_equal [10, 20, 30, 35, 38, 40], regions.map { |r| HBase::Util.from_bytes :fixnum, r[:end_key] }.compact.sort
258
+
259
+ @table.drop!
260
+ end
174
261
  end
175
262
  end unless ENV['HBASE_JRUBY_TEST_SKIP_ADMIN']
176
263
 
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: hbase-jruby
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.6
5
+ version: 0.2.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-01-19 00:00:00.000000000 Z
12
+ date: 2013-01-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: test-unit
@@ -73,6 +73,8 @@ files:
73
73
  - lib/hbase-jruby/scoped.rb
74
74
  - lib/hbase-jruby/scoped/aggregation.rb
75
75
  - lib/hbase-jruby/table.rb
76
+ - lib/hbase-jruby/table/admin.rb
77
+ - lib/hbase-jruby/table/inspection.rb
76
78
  - lib/hbase-jruby/util.rb
77
79
  - lib/hbase-jruby/version.rb
78
80
  - test/helper.rb