hbase-jruby 0.6.4-java → 0.7.0-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,12 +5,16 @@ require 'thread'
5
5
  # @author Junegunn Choi <junegunn.c@gmail.com>
6
6
  # @!attribute [r] config
7
7
  # @return [org.apache.hadoop.conf.Configuration]
8
+ # @!attribute [r] schema
9
+ # @return [HBase::Schema]
8
10
  class HBase
9
11
  attr_reader :config, :schema
10
12
 
11
13
  include Admin
12
14
  include HBase::Util
13
15
 
16
+ DEFAULT_COLUMN_CACHE_SIZE = 200
17
+
14
18
  # @overload HBase.log4j=(filename)
15
19
  # Configure Log4j logging with the given file
16
20
  # @param [String] filename Path to log4j.properties or log4j.xml file
@@ -24,41 +28,43 @@ class HBase
24
28
  # @param [java.util.Properties] props Properties object
25
29
  # @return [java.util.Properties]
26
30
  def self.log4j= arg
27
- org.apache.log4j.PropertyConfigurator rescue nil
28
- if defined?(org.apache.log4j.PropertyConfigurator)
29
- if arg.is_a?(Hash)
30
- props = java.util.Properties.new
31
- arg.each do |k, v|
32
- props.setProperty k.to_s, v.to_s
33
- end
34
- org.apache.log4j.PropertyConfigurator.configure props
35
- else
36
- case File.extname(arg).downcase
37
- when '.xml'
38
- org.apache.log4j.xml.DOMConfigurator.configure arg
39
- else
40
- org.apache.log4j.PropertyConfigurator.configure arg
41
- end
31
+ if arg.is_a?(Hash)
32
+ props = java.util.Properties.new
33
+ arg.each do |k, v|
34
+ props.setProperty k.to_s, v.to_s
42
35
  end
36
+ org.apache.log4j.PropertyConfigurator.configure props
43
37
  else
44
- @@log4j = arg
38
+ case File.extname(arg).downcase
39
+ when '.xml'
40
+ org.apache.log4j.xml.DOMConfigurator.configure arg
41
+ else
42
+ org.apache.log4j.PropertyConfigurator.configure arg
43
+ end
45
44
  end
46
45
  end
47
46
 
48
47
  # Connects to HBase
49
- # @param [Hash] config A key-value pairs to build HBaseConfiguration from
48
+ # @overload initialize(zookeeper_quorum)
49
+ # @param [String] zookeeper_quorum hbase.zookeeper.quorum
50
+ # @overload initialize(config)
51
+ # @param [Hash] config A key-value pairs to build HBaseConfiguration from
50
52
  def initialize config = {}
51
53
  begin
52
54
  org.apache.hadoop.conf.Configuration
53
55
  rescue NameError
54
56
  raise NameError.new(
55
- "Required Java classes not loaded. Set up CLASSPATH or try `HBase.resolve_dependency!`")
57
+ "Required Java classes not loaded. Set up CLASSPATH.`")
56
58
  end
57
59
 
58
60
  HBase.import_java_classes!
59
61
 
60
62
  @config =
61
63
  case config
64
+ when String
65
+ HBaseConfiguration.create.tap do |hbcfg|
66
+ hbcfg.set 'hbase.zookeeper.quorum', config
67
+ end
62
68
  when org.apache.hadoop.conf.Configuration
63
69
  config
64
70
  else
@@ -146,12 +152,19 @@ class HBase
146
152
  # Creates an HBase::Table instance for the specified name
147
153
  # @param [#to_s] table_name The name of the table
148
154
  # @param [Hash] opts Options
149
- # @option opts [Boolean] :cache Use thread-local cache (default: false)
155
+ # @option opts [Fixnum] :column_cache The size of thread-local column-key
156
+ # interpretation cache (default: 200)
150
157
  # @return [HBase::Table]
151
158
  def table table_name, opts = {}
152
159
  check_closed
153
160
 
154
- ht = HBase::Table.send :new, self, @config, table_name, opts[:cache]
161
+ # Backward-compatibility (to be removed)
162
+ if opts.has_key?(:cache)
163
+ opts = { :column_cache => opts[:cache] ? DEFAULT_COLUMN_CACHE_SIZE : 0 }
164
+ end
165
+
166
+ ht = HBase::Table.send :new, self, @config,
167
+ table_name, opts.fetch(:column_cache, DEFAULT_COLUMN_CACHE_SIZE)
155
168
 
156
169
  if block_given?
157
170
  yield ht
@@ -130,7 +130,7 @@ class Row
130
130
  alias str string
131
131
 
132
132
  # Returns all versions of column values as Strings in a Hash indexed by their timestamps
133
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
133
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
134
134
  # @return [Hash<Fixnum, String>]
135
135
  def strings col
136
136
  decode_value :string, col, true
@@ -138,7 +138,7 @@ class Row
138
138
  alias strs strings
139
139
 
140
140
  # Returns the latest column value as a Symbol
141
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
141
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
142
142
  # @return [Symbol]
143
143
  def symbol col
144
144
  decode_value :symbol, col
@@ -146,7 +146,7 @@ class Row
146
146
  alias sym symbol
147
147
 
148
148
  # Returns all versions of column values as Symbols in a Hash indexed by their timestamps
149
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
149
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
150
150
  # @return [Hash<Fixnum, Symbol>]
151
151
  def symbols col
152
152
  decode_value :symbol, col, true
@@ -154,49 +154,49 @@ class Row
154
154
  alias syms symbols
155
155
 
156
156
  # Returns the latest 1-byte column value as a Fixnum
157
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
157
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
158
158
  # @return [Fixnum]
159
159
  def byte col
160
160
  decode_value :byte, col
161
161
  end
162
162
 
163
163
  # Returns all versions of 1-byte column values as Fixnums in a Hash indexed by their timestamps
164
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
164
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
165
165
  # @return [Hash<Fixnum, Fixnum>]
166
166
  def bytes col
167
167
  decode_value :byte, col, true
168
168
  end
169
169
 
170
170
  # Returns the latest 2-byte column value as a Fixnum
171
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
171
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
172
172
  # @return [Fixnum]
173
173
  def short col
174
174
  decode_value :short, col
175
175
  end
176
176
 
177
177
  # Returns all versions of 2-byte column values as Fixnums in a Hash indexed by their timestamps
178
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
178
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
179
179
  # @return [Hash<Fixnum, Fixnum>]
180
180
  def shorts col
181
181
  decode_value :short, col, true
182
182
  end
183
183
 
184
184
  # Returns the latest 4-byte column value as a Fixnum
185
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
185
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
186
186
  # @return [Fixnum]
187
187
  def int col
188
188
  decode_value :int, col
189
189
  end
190
190
 
191
191
  # Returns all versions of 4-byte column values as Fixnums in a Hash indexed by their timestamps
192
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
192
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
193
193
  # @return [Hash<Fixnum, Fixnum>]
194
194
  def ints col
195
195
  decode_value :int, col, true
196
196
  end
197
197
 
198
198
  # Returns the latest 8-byte column value as a Fixnum
199
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
199
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
200
200
  # @return [Fixnum]
201
201
  def fixnum col
202
202
  decode_value :fixnum, col
@@ -204,7 +204,7 @@ class Row
204
204
  alias long fixnum
205
205
 
206
206
  # Returns all versions of 8-byte column values as Fixnums in a Hash indexed by their timestamps
207
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
207
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
208
208
  # @return [Hash<Fixnum, Fixnum>]
209
209
  def fixnums col
210
210
  decode_value :fixnum, col, true
@@ -212,37 +212,49 @@ class Row
212
212
  alias longs fixnums
213
213
 
214
214
  # Returns the latest column value as a BigDecimal
215
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
215
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
216
216
  # @return [BigDecimal]
217
217
  def bigdecimal col
218
218
  decode_value :bigdecimal, col
219
219
  end
220
220
 
221
221
  # Returns all versions of column values as BigDecimals in a Hash indexed by their timestamps
222
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
222
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
223
223
  # @return [Hash<Fixnum, BigDecimal>]
224
224
  def bigdecimals col
225
225
  decode_value :bigdecimal, col, true
226
226
  end
227
227
 
228
- # Returns the latest column value as a Float
229
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
228
+ # Returns the latest 4-byte column value as a Float
229
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
230
230
  # @return [Float]
231
231
  def float col
232
232
  decode_value :float, col
233
233
  end
234
- alias double float
235
234
 
236
- # Returns all versions of column values as Floats in a Hash indexed by their timestamps
237
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
235
+ # Returns all versions of 4-byte column values as Floats in a Hash indexed by their timestamps
236
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
238
237
  # @return [Hash<Fixnum, Float>]
239
238
  def floats col
240
239
  decode_value :float, col, true
241
240
  end
242
- alias doubles floats
241
+
242
+ # Returns the latest 8-byte column value as a Float
243
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
244
+ # @return [Float]
245
+ def double col
246
+ decode_value :double, col
247
+ end
248
+
249
+ # Returns all versions of 8-byte column values as Floats in a Hash indexed by their timestamps
250
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
251
+ # @return [Hash<Fixnum, Float>]
252
+ def doubles col
253
+ decode_value :double, col, true
254
+ end
243
255
 
244
256
  # Returns the latest column value as a boolean value
245
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
257
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
246
258
  # @return [true, false]
247
259
  def boolean col
248
260
  decode_value :boolean, col
@@ -250,7 +262,7 @@ class Row
250
262
  alias bool boolean
251
263
 
252
264
  # Returns all versions of column values as boolean values in a Hash indexed by their timestamps
253
- # @param [String, Array] column Column name as String or 2-element Array of family and qualifier
265
+ # @param [String, Array] col Column name as String or 2-element Array of family and qualifier
254
266
  # @return [Hash<Fixnum, true|false>]
255
267
  def booleans col
256
268
  decode_value :boolean, col, true
@@ -262,6 +274,10 @@ class Row
262
274
  Bytes.compareTo(rowkey(:raw), other.rowkey(:raw))
263
275
  end
264
276
 
277
+ def inspect
278
+ "#<HBase::Row:#{object_id} table=#{@table.name} rowkey=#{Bytes.toStringBinary @result.getRow}>"
279
+ end
280
+
265
281
  private
266
282
  def get_value col, with_versions = false
267
283
  cf, cq, _ = @table.lookup_and_parse col, true
@@ -67,8 +67,10 @@ class Schema
67
67
  end
68
68
 
69
69
  table = table.to_sym
70
- @lookup[table] = lookup
71
- @schema[table] = definition
70
+ @lookup = @lookup.dup.tap { |h| h[table] = lookup }
71
+ @schema = @schema.dup.tap { |h| h[table] = definition }
72
+
73
+ definition
72
74
  end
73
75
 
74
76
  # @private
@@ -103,8 +105,8 @@ class Schema
103
105
  # @param [Symbol] table
104
106
  def delete table
105
107
  table = table.to_sym
106
- @lookup.delete table
107
- @schema.delete table
108
+ @lookup = @lookup.reject { |k, v| k == table }
109
+ @schema = @schema.reject { |k, v| k == table }
108
110
  nil
109
111
  end
110
112
 
@@ -27,9 +27,9 @@ class Scoped
27
27
  :cache_blocks => true }.merge(options)
28
28
 
29
29
  scan = block_given? ? filtered_scan : filtered_scan_minimum
30
- scan.cache_blocks = options[:cache_blocks]
30
+ scan.setCacheBlocks options[:cache_blocks]
31
31
  if options[:caching] && (@limit.nil? || options[:caching] < @limit)
32
- scan.caching = options[:caching]
32
+ scan.setCaching options[:caching]
33
33
  end
34
34
 
35
35
  cnt = 0
@@ -524,7 +524,7 @@ private
524
524
  end if range
525
525
 
526
526
  # Caching
527
- scan.caching = @caching if @caching
527
+ scan.setCaching @caching if @caching
528
528
 
529
529
  # Filters (with projection)
530
530
  prefix_filter = [*build_prefix_filter].compact
@@ -536,7 +536,7 @@ private
536
536
  # Limit
537
537
  if @limit
538
538
  if [@caching, @dcaching].compact.all? { |c| @limit < c }
539
- scan.caching = @limit
539
+ scan.setCaching @limit
540
540
  end
541
541
  end
542
542
 
@@ -99,7 +99,7 @@ class Table
99
99
  # :max_filesize => 512 * 1024 ** 2,
100
100
  # :memstore_flushsize => 64 * 1024 ** 2,
101
101
  # :readonly => false,
102
- # :deferred_log_flush => true
102
+ # :durability => :async_wal
103
103
  # )
104
104
  def alter! props, &block
105
105
  _alter props, true, &block
@@ -313,52 +313,53 @@ private
313
313
 
314
314
  MAX_SPLIT_WAIT = 30
315
315
 
316
- def while_disabled admin
317
- begin
318
- admin.disableTable @name if admin.isTableEnabled(@name)
319
- yield
320
- ensure
321
- admin.enableTable @name
322
- end
316
+ def hcd obj, opts
317
+ hcd =
318
+ case obj
319
+ when HColumnDescriptor
320
+ obj
321
+ else
322
+ HColumnDescriptor.new(obj.to_s)
323
+ end
324
+ patch_column_descriptor!(hcd, opts)
323
325
  end
324
326
 
325
- def hcd name, opts
326
- HColumnDescriptor.new(name.to_s).tap do |hcd|
327
- opts.each do |key, val|
328
- if key == :config
329
- val.each do |k, v|
330
- hcd.setConfiguration k, v.to_s
331
- end
332
- elsif method = COLUMN_PROPERTIES[key] && COLUMN_PROPERTIES[key][:set]
333
- hcd.send method,
334
- ({
335
- :bloomfilter => proc { |v|
336
- enum =
337
- if defined?(org.apache.hadoop.hbase.regionserver.StoreFile::BloomType)
338
- org.apache.hadoop.hbase.regionserver.StoreFile::BloomType
339
- else
340
- # 0.95 or later
341
- org.apache.hadoop.hbase.regionserver.BloomType
342
- end
343
- const_shortcut enum, v, "Invalid bloom filter type"
344
- },
345
- :compression => proc { |v|
346
- const_shortcut Compression::Algorithm, v, "Invalid compression algorithm"
347
- },
348
- :compression_compact => proc { |v|
349
- const_shortcut Compression::Algorithm, v, "Invalid compression algorithm"
350
- },
351
- :data_block_encoding => proc { |v|
352
- const_shortcut org.apache.hadoop.hbase.io.encoding.DataBlockEncoding, v, "Invalid data block encoding algorithm"
353
- }
354
- }[key] || proc { |a| a }).call(val)
355
- elsif key.is_a?(String)
356
- hcd.setValue key, val.to_s
357
- else
358
- raise ArgumentError, "Invalid property: #{key}"
327
+ def patch_column_descriptor! hcd, opts
328
+ opts.each do |key, val|
329
+ if key == :config
330
+ val.each do |k, v|
331
+ hcd.setConfiguration k, v.to_s
359
332
  end
360
- end#opts
361
- end
333
+ elsif method = COLUMN_PROPERTIES[key] && COLUMN_PROPERTIES[key][:set]
334
+ hcd.send method,
335
+ ({
336
+ :bloomfilter => proc { |v|
337
+ enum =
338
+ if defined?(org.apache.hadoop.hbase.regionserver.StoreFile::BloomType)
339
+ org.apache.hadoop.hbase.regionserver.StoreFile::BloomType
340
+ else
341
+ # 0.95 or later
342
+ org.apache.hadoop.hbase.regionserver.BloomType
343
+ end
344
+ const_shortcut enum, v, "Invalid bloom filter type"
345
+ },
346
+ :compression => proc { |v|
347
+ const_shortcut Compression::Algorithm, v, "Invalid compression algorithm"
348
+ },
349
+ :compression_compact => proc { |v|
350
+ const_shortcut Compression::Algorithm, v, "Invalid compression algorithm"
351
+ },
352
+ :data_block_encoding => proc { |v|
353
+ const_shortcut org.apache.hadoop.hbase.io.encoding.DataBlockEncoding, v, "Invalid data block encoding algorithm"
354
+ }
355
+ }[key] || proc { |a| a }).call(val)
356
+ elsif key.is_a?(String)
357
+ hcd.setValue key, val.to_s
358
+ else
359
+ raise ArgumentError, "Invalid property: #{key}"
360
+ end
361
+ end#opts
362
+ hcd
362
363
  end
363
364
 
364
365
  def self.const_shortcut base, v, message
@@ -406,69 +407,58 @@ private
406
407
  with_admin do |admin|
407
408
  htd = admin.get_table_descriptor(@name.to_java_bytes)
408
409
  patch_table_descriptor! htd, props
409
- while_disabled(admin) do
410
- admin.modifyTable @name.to_java_bytes, htd
411
- wait_async_admin(admin, &block) if bang
412
- end
410
+ admin.modifyTable @name.to_java_bytes, htd
411
+ wait_async_admin(admin, &block) if bang
413
412
  end
414
413
  end
415
414
 
416
415
  def _add_family name, opts, bang, &block
417
416
  with_admin do |admin|
418
- while_disabled(admin) do
419
- admin.addColumn @name, hcd(name.to_s, opts)
420
- wait_async_admin(admin, &block) if bang
421
- end
417
+ admin.addColumn @name, hcd(name.to_s, opts)
418
+ wait_async_admin(admin, &block) if bang
422
419
  end
423
420
  end
424
421
 
425
422
  def _alter_family name, opts, bang, &block
426
423
  with_admin do |admin|
427
- while_disabled(admin) do
428
- admin.modifyColumn @name, hcd(name.to_s, opts)
429
- wait_async_admin(admin, &block) if bang
430
- end
424
+ htd = admin.get_table_descriptor(@name.to_java_bytes)
425
+ hcd = htd.getFamily(name.to_s.to_java_bytes)
426
+ admin.modifyColumn @name, hcd(hcd, opts)
427
+ wait_async_admin(admin, &block) if bang
431
428
  end
432
429
  end
433
430
 
434
431
  def _delete_family name, bang, &block
435
432
  with_admin do |admin|
436
- while_disabled(admin) do
437
- admin.deleteColumn @name, name.to_s
438
- wait_async_admin(admin, &block) if bang
439
- end
433
+ admin.deleteColumn @name, name.to_s
434
+ wait_async_admin(admin, &block) if bang
440
435
  end
441
436
  end
442
437
 
443
438
  def _add_coprocessor class_name, props, bang, &block
444
439
  with_admin do |admin|
445
- while_disabled(admin) do
446
-
447
- htd = admin.get_table_descriptor(@name.to_java_bytes)
448
- if props.empty?
449
- htd.addCoprocessor class_name
450
- else
451
- path, priority, params = props.values_at :path, :priority, :params
452
- raise ArgumentError, ":path required" unless path
453
- params = params ? Hash[ params.map { |k, v| [k.to_s, v.to_s] } ] : {}
454
- htd.addCoprocessor class_name,
455
- org.apache.hadoop.fs.Path.new(path),
456
- priority || org.apache.hadoop.hbase.Coprocessor::PRIORITY_USER, params
457
- end
458
- admin.modifyTable @name.to_java_bytes, htd
459
- wait_async_admin(admin, &block) if bang
440
+ htd = admin.get_table_descriptor(@name.to_java_bytes)
441
+ if props.empty?
442
+ htd.addCoprocessor class_name
443
+ else
444
+ path, priority, params = props.values_at :path, :priority, :params
445
+ raise ArgumentError, ":path required" unless path
446
+ params = params ? Hash[ params.map { |k, v| [k.to_s, v.to_s] } ] : {}
447
+ htd.addCoprocessor class_name,
448
+ org.apache.hadoop.fs.Path.new(path),
449
+ priority || org.apache.hadoop.hbase.Coprocessor::PRIORITY_USER, params
460
450
  end
451
+ admin.modifyTable @name.to_java_bytes, htd
452
+ wait_async_admin(admin, &block) if bang
461
453
  end
462
454
  end
463
455
 
464
456
  def _remove_coprocessor name, bang, &block
465
457
  with_admin do |admin|
466
- while_disabled(admin) do
467
- htd = admin.get_table_descriptor(@name.to_java_bytes)
468
- htd.removeCoprocessor name
469
- admin.modifyTable @name.to_java_bytes, htd
470
- wait_async_admin(admin, &block) if bang
471
- end
458
+ htd = admin.get_table_descriptor(@name.to_java_bytes)
459
+ htd.removeCoprocessor name
460
+ admin.modifyTable @name.to_java_bytes, htd
461
+ wait_async_admin(admin, &block) if bang
472
462
  end
473
463
  end
474
464
 
@@ -16,7 +16,7 @@ class Table
16
16
  @rowkey, @cf, @cq, @val, @mutation.put(@rowkey, props))
17
17
  end
18
18
 
19
- # @param [Object] *extra Optional delete specification. Column family, qualifier, and timestamps
19
+ # @param [Object*] extra Optional delete specification. Column family, qualifier, and timestamps
20
20
  def delete *extra
21
21
  @table.htable.checkAndDelete(
22
22
  @rowkey, @cf, @cq, @val, @mutation.delete(@rowkey, *extra))
@@ -95,6 +95,7 @@ private
95
95
  end
96
96
  r[:meta] = ri.is_meta_region
97
97
  r[:online] = !ri.is_offline
98
+ r[:encoded_name] = ri.encoded_name
98
99
  }
99
100
  }
100
101
  end
@@ -308,6 +308,7 @@ class Table
308
308
  @hbase.schema.lookup @name_sym, col
309
309
  end
310
310
 
311
+ # Schema lookup without column-key caching
311
312
  # @private
312
313
  def lookup_and_parse col, expect_cq
313
314
  @hbase.schema.lookup_and_parse @name_sym, col, expect_cq
@@ -315,21 +316,36 @@ class Table
315
316
 
316
317
  # @private
317
318
  module ThreadLocalCache
319
+ # Schema lookup with column-key caching
318
320
  def lookup_and_parse col, expect_cq
319
- thread_local(@hbase, @name_sym, :columns)[col] ||=
320
- @hbase.schema.lookup_and_parse(@name_sym, col, expect_cq)
321
+ cache = thread_local(@hbase, @name_sym, :columns)
322
+
323
+ # Column-key cache invalidation
324
+ schema = @hbase.schema
325
+ if schema.to_h.object_id != @schema_h.object_id
326
+ @schema_h = schema.to_h
327
+ cache.clear
328
+ end
329
+
330
+ unless parsed = cache[col]
331
+ parsed = schema.lookup_and_parse(@name_sym, col, expect_cq)
332
+ cache[col] = parsed if cache.length < @cache_size
333
+ end
334
+ parsed
321
335
  end
322
336
  end
323
337
 
324
338
  private
325
- def initialize hbase, config, name, cache
339
+ def initialize hbase, config, name, cache_size
326
340
  @hbase = hbase
341
+ @schema_h = hbase.schema.to_h
327
342
  @config = config
328
343
  @name = name.to_s
329
344
  @name_sym = name.to_sym
330
345
  @mutation = Mutation.new(self)
346
+ @cache_size = cache_size
331
347
 
332
- extend ThreadLocalCache if cache
348
+ extend ThreadLocalCache if cache_size > 0
333
349
  end
334
350
 
335
351
  def check_closed
@@ -14,7 +14,7 @@ module Util
14
14
  # @param [byte[]] v
15
15
  # @return [byte[]]
16
16
  def to_bytes v
17
- import_java_classes!
17
+ HBase.import_java_classes!
18
18
 
19
19
  case v
20
20
  when Array
@@ -42,7 +42,7 @@ module Util
42
42
  raise ArgumentError, "Unknown value format" unless len == 1
43
43
 
44
44
  val = v.values.first
45
- raise ArgumentError, "Unknown value format" unless val.is_a?(Fixnum)
45
+ raise ArgumentError, "Unknown value format" unless val.is_a?(Numeric)
46
46
 
47
47
  case v.keys.first
48
48
  when :byte
@@ -53,6 +53,10 @@ module Util
53
53
  Bytes.java_send :toBytes, [Java::short], val
54
54
  when :long, :fixnum
55
55
  Bytes.java_send :toBytes, [Java::long], val
56
+ when :float
57
+ Bytes.java_send :toBytes, [Java::float], val
58
+ when :double
59
+ Bytes.java_send :toBytes, [Java::double], val
56
60
  else
57
61
  raise ArgumentError, "Invalid value format"
58
62
  end
@@ -69,7 +73,7 @@ module Util
69
73
  return nil if val.nil?
70
74
  return Util.to_bytes val if type.nil?
71
75
 
72
- import_java_classes!
76
+ HBase.import_java_classes!
73
77
  case type
74
78
  when :string, :str, :symbol, :sym
75
79
  val.to_s.to_java_bytes
@@ -83,7 +87,9 @@ module Util
83
87
  Bytes.java_send :toBytes, [Java::short], val
84
88
  when :long, :fixnum
85
89
  Bytes.java_send :toBytes, [Java::long], val
86
- when :float, :double
90
+ when :float
91
+ Bytes.java_send :toBytes, [Java::float], val
92
+ when :double
87
93
  Bytes.java_send :toBytes, [Java::double], val
88
94
  when :bigdecimal
89
95
  case val
@@ -108,7 +114,7 @@ module Util
108
114
  def from_bytes type, val
109
115
  return nil if val.nil?
110
116
 
111
- import_java_classes!
117
+ HBase.import_java_classes!
112
118
  case type
113
119
  when :string, :str
114
120
  Bytes.to_string val
@@ -124,7 +130,9 @@ module Util
124
130
  Bytes.to_string(val).to_sym
125
131
  when :bigdecimal
126
132
  BigDecimal.new(Bytes.to_big_decimal(val).to_s)
127
- when :float, :double
133
+ when :float
134
+ Bytes.to_float val
135
+ when :double
128
136
  Bytes.to_double val
129
137
  when :boolean, :bool
130
138
  Bytes.to_boolean val
@@ -169,17 +177,6 @@ module Util
169
177
  return cf, cq
170
178
  end
171
179
  end
172
-
173
- private
174
- def import_java_classes!
175
- HBase.import_java_classes!
176
- if defined?(ByteBuffer) && defined?(KeyValue) && defined?(Bytes)
177
- self.instance_eval do
178
- def import_java_classes!
179
- end
180
- end
181
- end
182
- end
183
180
  end
184
181
 
185
182
  private