hyper_record 0.2.8 → 0.9.3
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/CHANGELOG +8 -0
- data/HOW_TO_RUN_TESTS +44 -0
- data/LICENSE +1 -1
- data/README +5 -9
- data/Rakefile +10 -3
- data/VERSION.yml +2 -2
- data/hyper_record.gemspec +3 -3
- data/lib/active_record/connection_adapters/hypertable_adapter.rb +29 -11
- data/lib/hyper_record.rb +14 -3
- data/lib/hypertable/gen-rb/client_service.rb +370 -0
- data/lib/hypertable/gen-rb/client_types.rb +118 -21
- data/spec/lib/hyper_record_spec.rb +53 -0
- data/test/thrift_client_test.rb +56 -50
- metadata +5 -5
- data/pkg/hyper_record-0.2.8.gem +0 -0
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
0.9.3.0 (2010/05/30)
|
2
|
+
- updated HyperRecord version numbers to match Hypertable release number
|
3
|
+
- now compatible with Hypertable version 0.9.3.0
|
4
|
+
- no longer compatible with earlier Hypertable versions due to a Thrift
|
5
|
+
API change
|
6
|
+
- added support for asynchronous writes through new put_cells ThriftBroker API
|
7
|
+
- add documentation for running tests
|
8
|
+
|
1
9
|
0.2.8 (2010/03/01)
|
2
10
|
- support friendly migration-syntax declared using blocks
|
3
11
|
- new assemble_row_key_from_attributes that generates row keys in the same
|
data/HOW_TO_RUN_TESTS
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
The HyperRecord test suite is spread out across a number of different files
|
2
|
+
in the test/ and spec/ directories.
|
3
|
+
|
4
|
+
$ ls -l test/
|
5
|
+
total 28
|
6
|
+
-rw-r--r-- 1 root root 188 May 20 15:36 test_helper.rb
|
7
|
+
-rw-r--r-- 1 root root 22281 May 30 13:56 thrift_client_test.rb
|
8
|
+
|
9
|
+
$ ls -l spec/
|
10
|
+
total 12
|
11
|
+
drwxr-xr-x 3 root root 4096 May 20 15:36 fixtures
|
12
|
+
drwxr-xr-x 3 root root 4096 May 30 14:08 lib
|
13
|
+
-rw-r--r-- 1 root root 4067 May 20 15:36 spec_helper.rb
|
14
|
+
|
15
|
+
The test/ directory contains unit tests (using Ruby's standard Test::Unit
|
16
|
+
library) that exercise the Thrift client libraries only. These tests do
|
17
|
+
not cover any functionality specific to HyperRecord.
|
18
|
+
|
19
|
+
To run the Thrift client unit tests:
|
20
|
+
$ rake
|
21
|
+
<snip test output>
|
22
|
+
|
23
|
+
Failures in the test/ suite may be caused by:
|
24
|
+
|
25
|
+
1. A mismatch between the version of Thrift installed on your local machine
|
26
|
+
and the version of Thrift supported in this release on HyperRecord.
|
27
|
+
2. Problems communicating with a ThriftBroker process running on the default
|
28
|
+
port (38080) on localhost. Note: you must be running Hypertable for
|
29
|
+
these tests to pass and, specifically, a ThriftBroker process must be
|
30
|
+
running on localhost.
|
31
|
+
|
32
|
+
The spec/ directory contains rspec tests that cover HyperRecord functionality.
|
33
|
+
Since HyperRecord extends the base ActiveRecord implementation, these tests
|
34
|
+
can only be run if the HyperRecord gem directory has been unpacked into a
|
35
|
+
local Rails tree. This is typically done by:
|
36
|
+
|
37
|
+
$ gem install hyper_record
|
38
|
+
$ cd vendor/gems
|
39
|
+
$ gem unpack hyper_recrd
|
40
|
+
$ gem uninstall hyper_record
|
41
|
+
|
42
|
+
To run the HyperRecord rspec tests:
|
43
|
+
$ rake spec
|
44
|
+
<snip test output>
|
data/LICENSE
CHANGED
data/README
CHANGED
@@ -19,15 +19,11 @@ See:
|
|
19
19
|
INSTALLATION
|
20
20
|
============
|
21
21
|
|
22
|
-
1.
|
22
|
+
1. Install HyperRecord gem (http://rubygems.org/gems/hyper_record)
|
23
23
|
|
24
|
-
gem
|
24
|
+
gem install hyper_record
|
25
25
|
|
26
|
-
2.
|
27
|
-
|
28
|
-
gem install tylerkovacs-hyper_record
|
29
|
-
|
30
|
-
3. Configure Hypertable Adapter by adding an entry to config/database.yml
|
26
|
+
2. Configure Hypertable Adapter by adding an entry to config/database.yml
|
31
27
|
that points to an instance of the Hypertable Thrift Broker (uses port
|
32
28
|
38080 by default).
|
33
29
|
|
@@ -38,7 +34,7 @@ INSTALLATION
|
|
38
34
|
|
39
35
|
NOTE: HyperRecord requires Thrift SVN revision 765279 or later.
|
40
36
|
|
41
|
-
|
37
|
+
3. Add the following to the bottom of config/environment.rb:
|
42
38
|
|
43
39
|
require 'hyper_record'
|
44
40
|
|
@@ -46,4 +42,4 @@ INSTALLATION
|
|
46
42
|
COPYRIGHT
|
47
43
|
=========
|
48
44
|
|
49
|
-
Copyright (c)
|
45
|
+
Copyright (c) 2010 tylerkovacs. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -14,8 +14,6 @@ begin
|
|
14
14
|
s.description = "See README"
|
15
15
|
s.authors = ["tylerkovacs"]
|
16
16
|
end
|
17
|
-
|
18
|
-
Jeweler::GemcutterTasks.new
|
19
17
|
rescue LoadError
|
20
18
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
21
19
|
end
|
@@ -40,4 +38,13 @@ Rcov::RcovTask.new do |t|
|
|
40
38
|
t.verbose = true
|
41
39
|
end
|
42
40
|
|
43
|
-
task :
|
41
|
+
task :noop do
|
42
|
+
end
|
43
|
+
|
44
|
+
Rake::TestTask.new(:spec => :noop) do |t|
|
45
|
+
t.libs << 'spec'
|
46
|
+
t.test_files = FileList['spec/**/*_spec.rb']
|
47
|
+
t.verbose = true
|
48
|
+
end
|
49
|
+
|
50
|
+
task :default => :test
|
data/VERSION.yml
CHANGED
data/hyper_record.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{hyper_record}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.9.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["tylerkovacs"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-05-30}
|
13
13
|
s.description = %q{See README}
|
14
14
|
s.email = %q{tyler.kovacs@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
"CHANGELOG",
|
22
22
|
"LICENSE",
|
23
23
|
"README",
|
24
|
+
"HOW_TO_RUN_TESTS",
|
24
25
|
"Rakefile",
|
25
26
|
"VERSION.yml",
|
26
27
|
"benchmark/save.rb",
|
@@ -40,7 +41,6 @@ Gem::Specification.new do |s|
|
|
40
41
|
"lib/hypertable/gen-rb/hql_types.rb",
|
41
42
|
"lib/hypertable/thrift_client.rb",
|
42
43
|
"lib/hypertable/thrift_transport_monkey_patch.rb",
|
43
|
-
"pkg/hyper_record-0.2.8.gem",
|
44
44
|
"spec/fixtures/pages.yml",
|
45
45
|
"spec/fixtures/qualified_pages.yml",
|
46
46
|
"spec/lib/associations_spec.rb",
|
@@ -82,8 +82,11 @@ module ActiveRecord
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def raw_thrift_client(&block)
|
85
|
-
|
85
|
+
t1 = Time.now
|
86
|
+
results = Hypertable.with_thrift_client(@config[:host], @config[:port],
|
86
87
|
@config[:timeout], &block)
|
88
|
+
@@read_latency += Time.now - t1
|
89
|
+
results
|
87
90
|
end
|
88
91
|
|
89
92
|
# Return the current set of performance statistics. The application
|
@@ -330,7 +333,8 @@ module ActiveRecord
|
|
330
333
|
for cf in column_families
|
331
334
|
# Columns are lazily-deleted in Hypertable so still may show up
|
332
335
|
# in describe table output. Ignore.
|
333
|
-
|
336
|
+
del = cf.elements['deleted']
|
337
|
+
deleted = del ? del.text : 'false'
|
334
338
|
next if deleted == 'true'
|
335
339
|
|
336
340
|
column_name = cf.elements['Name'].text
|
@@ -526,16 +530,28 @@ module ActiveRecord
|
|
526
530
|
# mutator as argument. Mutators can be created with the open_mutator
|
527
531
|
# method. In the near future (Summer 2009), Hypertable will provide
|
528
532
|
# a periodic mutator that automatically flushes at specific intervals.
|
529
|
-
def write_cells(table_name, cells,
|
533
|
+
def write_cells(table_name, cells, options={})
|
530
534
|
return if cells.blank?
|
531
535
|
|
536
|
+
mutator = options[:mutator]
|
537
|
+
flags = options[:flags]
|
538
|
+
flush_interval = options[:flush_interval]
|
539
|
+
|
532
540
|
retry_on_connection_error {
|
533
541
|
local_mutator_created = !mutator
|
534
542
|
|
535
543
|
begin
|
536
544
|
t1 = Time.now
|
537
545
|
mutator ||= open_mutator(table_name, flags, flush_interval)
|
538
|
-
|
546
|
+
if options[:asynchronous_write]
|
547
|
+
mutate_spec = Hypertable::ThriftGen::MutateSpec.new
|
548
|
+
mutate_spec.appname = 'hyper_record'
|
549
|
+
mutate_spec.flush_interval = 1000
|
550
|
+
mutate_spec.flags = 2
|
551
|
+
@connection.put_cells_as_arrays(table_name, mutate_spec, cells)
|
552
|
+
else
|
553
|
+
@connection.set_cells_as_arrays(mutator, cells)
|
554
|
+
end
|
539
555
|
ensure
|
540
556
|
if local_mutator_created && mutator
|
541
557
|
close_mutator(mutator)
|
@@ -552,11 +568,12 @@ module ActiveRecord
|
|
552
568
|
# on write - used by special operations (e.g,. delete )
|
553
569
|
def thrift_cell_from_native_array(array)
|
554
570
|
cell = Hypertable::ThriftGen::Cell.new
|
555
|
-
cell.
|
556
|
-
cell.
|
557
|
-
cell.
|
571
|
+
cell.key = Hypertable::ThriftGen::Key.new
|
572
|
+
cell.key.row = array[0]
|
573
|
+
cell.key.column_family = array[1]
|
574
|
+
cell.key.column_qualifier = array[2] if !array[2].blank?
|
558
575
|
cell.value = array[3] if array[3]
|
559
|
-
cell.timestamp = array[4] if array[4]
|
576
|
+
cell.key.timestamp = array[4] if array[4]
|
560
577
|
cell
|
561
578
|
end
|
562
579
|
|
@@ -584,7 +601,7 @@ module ActiveRecord
|
|
584
601
|
@connection.with_mutator(table_name) do |mutator|
|
585
602
|
thrift_cells = cells.map{|c|
|
586
603
|
cell = thrift_cell_from_native_array(c)
|
587
|
-
cell.flag = Hypertable::ThriftGen::CellFlag::DELETE_CELL
|
604
|
+
cell.key.flag = Hypertable::ThriftGen::CellFlag::DELETE_CELL
|
588
605
|
cell
|
589
606
|
}
|
590
607
|
@connection.set_cells(mutator, thrift_cells)
|
@@ -599,8 +616,9 @@ module ActiveRecord
|
|
599
616
|
t1 = Time.now
|
600
617
|
cells = row_keys.map do |row_key|
|
601
618
|
cell = Hypertable::ThriftGen::Cell.new
|
602
|
-
cell.
|
603
|
-
cell.
|
619
|
+
cell.key = Hypertable::ThriftGen::Key.new
|
620
|
+
cell.key.row = row_key
|
621
|
+
cell.key.flag = Hypertable::ThriftGen::CellFlag::DELETE_ROW
|
604
622
|
cell
|
605
623
|
end
|
606
624
|
|
data/lib/hyper_record.rb
CHANGED
@@ -157,6 +157,7 @@ module ActiveRecord
|
|
157
157
|
def quoted_attributes_to_cells(quoted_attrs, table=self.class.table_name)
|
158
158
|
cells = []
|
159
159
|
pk = self.attributes[self.class.primary_key]
|
160
|
+
|
160
161
|
quoted_attrs.keys.each{|key|
|
161
162
|
name, qualifier = connection.hypertable_column_name(key, table).split(':', 2)
|
162
163
|
cells << connection.cell_native_array(pk, name, qualifier, quoted_attrs[key])
|
@@ -179,7 +180,12 @@ module ActiveRecord
|
|
179
180
|
# puts msg
|
180
181
|
end
|
181
182
|
|
182
|
-
connection.write_cells(table, cells,
|
183
|
+
connection.write_cells(table, cells, {
|
184
|
+
:mutator => mutator,
|
185
|
+
:flags => self.class.mutator_flags,
|
186
|
+
:flush_interval => self.class.mutator_flush_interval,
|
187
|
+
:asynchronous_write => self.class.asynchronous_write
|
188
|
+
})
|
183
189
|
end
|
184
190
|
|
185
191
|
# Delete an array of cells from Hypertable
|
@@ -421,7 +427,8 @@ module ActiveRecord
|
|
421
427
|
def find_by_hql(hql)
|
422
428
|
hql_result = connection.execute(hql)
|
423
429
|
cells_in_native_array_format = hql_result.cells.map do |c|
|
424
|
-
connection.cell_native_array(c.
|
430
|
+
connection.cell_native_array(c.key.row, c.key.column_family,
|
431
|
+
c.key.column_qualifier, c.value)
|
425
432
|
end
|
426
433
|
convert_cells_to_instantiated_rows(cells_in_native_array_format)
|
427
434
|
end
|
@@ -571,11 +578,15 @@ module ActiveRecord
|
|
571
578
|
end
|
572
579
|
end
|
573
580
|
|
574
|
-
attr_accessor :mutator, :mutator_flags, :mutator_flush_interval
|
581
|
+
attr_accessor :mutator, :mutator_flags, :mutator_flush_interval,
|
582
|
+
:asynchronous_write
|
583
|
+
|
575
584
|
def mutator_options(*attrs)
|
576
585
|
symbolized_attrs = attrs.first.symbolize_keys
|
577
586
|
@mutator_flags = symbolized_attrs[:flags].to_i
|
578
587
|
@mutator_flush_interval = symbolized_attrs[:flush_interval].to_i
|
588
|
+
@asynchronous_write = symbolized_attrs[:asynchronous_write]
|
589
|
+
|
579
590
|
if symbolized_attrs[:persistent]
|
580
591
|
@mutator = self.open_mutator(@mutator_flags, @mutator_flush_interval)
|
581
592
|
end
|
@@ -203,6 +203,66 @@ require 'client_types'
|
|
203
203
|
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'get_cells_as_arrays failed: unknown result')
|
204
204
|
end
|
205
205
|
|
206
|
+
def put_cells(tablename, mutate_spec, cells)
|
207
|
+
send_put_cells(tablename, mutate_spec, cells)
|
208
|
+
recv_put_cells()
|
209
|
+
end
|
210
|
+
|
211
|
+
def send_put_cells(tablename, mutate_spec, cells)
|
212
|
+
send_message('put_cells', Put_cells_args, :tablename => tablename, :mutate_spec => mutate_spec, :cells => cells)
|
213
|
+
end
|
214
|
+
|
215
|
+
def recv_put_cells()
|
216
|
+
result = receive_message(Put_cells_result)
|
217
|
+
raise result.e unless result.e.nil?
|
218
|
+
return
|
219
|
+
end
|
220
|
+
|
221
|
+
def put_cells_as_arrays(tablename, mutate_spec, cells)
|
222
|
+
send_put_cells_as_arrays(tablename, mutate_spec, cells)
|
223
|
+
recv_put_cells_as_arrays()
|
224
|
+
end
|
225
|
+
|
226
|
+
def send_put_cells_as_arrays(tablename, mutate_spec, cells)
|
227
|
+
send_message('put_cells_as_arrays', Put_cells_as_arrays_args, :tablename => tablename, :mutate_spec => mutate_spec, :cells => cells)
|
228
|
+
end
|
229
|
+
|
230
|
+
def recv_put_cells_as_arrays()
|
231
|
+
result = receive_message(Put_cells_as_arrays_result)
|
232
|
+
raise result.e unless result.e.nil?
|
233
|
+
return
|
234
|
+
end
|
235
|
+
|
236
|
+
def put_cell(tablename, mutate_spec, cell)
|
237
|
+
send_put_cell(tablename, mutate_spec, cell)
|
238
|
+
recv_put_cell()
|
239
|
+
end
|
240
|
+
|
241
|
+
def send_put_cell(tablename, mutate_spec, cell)
|
242
|
+
send_message('put_cell', Put_cell_args, :tablename => tablename, :mutate_spec => mutate_spec, :cell => cell)
|
243
|
+
end
|
244
|
+
|
245
|
+
def recv_put_cell()
|
246
|
+
result = receive_message(Put_cell_result)
|
247
|
+
raise result.e unless result.e.nil?
|
248
|
+
return
|
249
|
+
end
|
250
|
+
|
251
|
+
def put_cell_as_array(tablename, mutate_spec, cell)
|
252
|
+
send_put_cell_as_array(tablename, mutate_spec, cell)
|
253
|
+
recv_put_cell_as_array()
|
254
|
+
end
|
255
|
+
|
256
|
+
def send_put_cell_as_array(tablename, mutate_spec, cell)
|
257
|
+
send_message('put_cell_as_array', Put_cell_as_array_args, :tablename => tablename, :mutate_spec => mutate_spec, :cell => cell)
|
258
|
+
end
|
259
|
+
|
260
|
+
def recv_put_cell_as_array()
|
261
|
+
result = receive_message(Put_cell_as_array_result)
|
262
|
+
raise result.e unless result.e.nil?
|
263
|
+
return
|
264
|
+
end
|
265
|
+
|
206
266
|
def open_mutator(name, flags, flush_interval)
|
207
267
|
send_open_mutator(name, flags, flush_interval)
|
208
268
|
return recv_open_mutator()
|
@@ -309,6 +369,22 @@ require 'client_types'
|
|
309
369
|
return
|
310
370
|
end
|
311
371
|
|
372
|
+
def exists_table(name)
|
373
|
+
send_exists_table(name)
|
374
|
+
return recv_exists_table()
|
375
|
+
end
|
376
|
+
|
377
|
+
def send_exists_table(name)
|
378
|
+
send_message('exists_table', Exists_table_args, :name => name)
|
379
|
+
end
|
380
|
+
|
381
|
+
def recv_exists_table()
|
382
|
+
result = receive_message(Exists_table_result)
|
383
|
+
return result.success unless result.success.nil?
|
384
|
+
raise result.e unless result.e.nil?
|
385
|
+
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'exists_table failed: unknown result')
|
386
|
+
end
|
387
|
+
|
312
388
|
def get_table_id(name)
|
313
389
|
send_get_table_id(name)
|
314
390
|
return recv_get_table_id()
|
@@ -357,6 +433,22 @@ require 'client_types'
|
|
357
433
|
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'get_tables failed: unknown result')
|
358
434
|
end
|
359
435
|
|
436
|
+
def get_table_splits(name)
|
437
|
+
send_get_table_splits(name)
|
438
|
+
return recv_get_table_splits()
|
439
|
+
end
|
440
|
+
|
441
|
+
def send_get_table_splits(name)
|
442
|
+
send_message('get_table_splits', Get_table_splits_args, :name => name)
|
443
|
+
end
|
444
|
+
|
445
|
+
def recv_get_table_splits()
|
446
|
+
result = receive_message(Get_table_splits_result)
|
447
|
+
return result.success unless result.success.nil?
|
448
|
+
raise result.e unless result.e.nil?
|
449
|
+
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'get_table_splits failed: unknown result')
|
450
|
+
end
|
451
|
+
|
360
452
|
def drop_table(name, if_exists)
|
361
453
|
send_drop_table(name, if_exists)
|
362
454
|
recv_drop_table()
|
@@ -509,6 +601,50 @@ require 'client_types'
|
|
509
601
|
write_result(result, oprot, 'get_cells_as_arrays', seqid)
|
510
602
|
end
|
511
603
|
|
604
|
+
def process_put_cells(seqid, iprot, oprot)
|
605
|
+
args = read_args(iprot, Put_cells_args)
|
606
|
+
result = Put_cells_result.new()
|
607
|
+
begin
|
608
|
+
@handler.put_cells(args.tablename, args.mutate_spec, args.cells)
|
609
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
610
|
+
result.e = e
|
611
|
+
end
|
612
|
+
write_result(result, oprot, 'put_cells', seqid)
|
613
|
+
end
|
614
|
+
|
615
|
+
def process_put_cells_as_arrays(seqid, iprot, oprot)
|
616
|
+
args = read_args(iprot, Put_cells_as_arrays_args)
|
617
|
+
result = Put_cells_as_arrays_result.new()
|
618
|
+
begin
|
619
|
+
@handler.put_cells_as_arrays(args.tablename, args.mutate_spec, args.cells)
|
620
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
621
|
+
result.e = e
|
622
|
+
end
|
623
|
+
write_result(result, oprot, 'put_cells_as_arrays', seqid)
|
624
|
+
end
|
625
|
+
|
626
|
+
def process_put_cell(seqid, iprot, oprot)
|
627
|
+
args = read_args(iprot, Put_cell_args)
|
628
|
+
result = Put_cell_result.new()
|
629
|
+
begin
|
630
|
+
@handler.put_cell(args.tablename, args.mutate_spec, args.cell)
|
631
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
632
|
+
result.e = e
|
633
|
+
end
|
634
|
+
write_result(result, oprot, 'put_cell', seqid)
|
635
|
+
end
|
636
|
+
|
637
|
+
def process_put_cell_as_array(seqid, iprot, oprot)
|
638
|
+
args = read_args(iprot, Put_cell_as_array_args)
|
639
|
+
result = Put_cell_as_array_result.new()
|
640
|
+
begin
|
641
|
+
@handler.put_cell_as_array(args.tablename, args.mutate_spec, args.cell)
|
642
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
643
|
+
result.e = e
|
644
|
+
end
|
645
|
+
write_result(result, oprot, 'put_cell_as_array', seqid)
|
646
|
+
end
|
647
|
+
|
512
648
|
def process_open_mutator(seqid, iprot, oprot)
|
513
649
|
args = read_args(iprot, Open_mutator_args)
|
514
650
|
result = Open_mutator_result.new()
|
@@ -586,6 +722,17 @@ require 'client_types'
|
|
586
722
|
write_result(result, oprot, 'flush_mutator', seqid)
|
587
723
|
end
|
588
724
|
|
725
|
+
def process_exists_table(seqid, iprot, oprot)
|
726
|
+
args = read_args(iprot, Exists_table_args)
|
727
|
+
result = Exists_table_result.new()
|
728
|
+
begin
|
729
|
+
result.success = @handler.exists_table(args.name)
|
730
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
731
|
+
result.e = e
|
732
|
+
end
|
733
|
+
write_result(result, oprot, 'exists_table', seqid)
|
734
|
+
end
|
735
|
+
|
589
736
|
def process_get_table_id(seqid, iprot, oprot)
|
590
737
|
args = read_args(iprot, Get_table_id_args)
|
591
738
|
result = Get_table_id_result.new()
|
@@ -619,6 +766,17 @@ require 'client_types'
|
|
619
766
|
write_result(result, oprot, 'get_tables', seqid)
|
620
767
|
end
|
621
768
|
|
769
|
+
def process_get_table_splits(seqid, iprot, oprot)
|
770
|
+
args = read_args(iprot, Get_table_splits_args)
|
771
|
+
result = Get_table_splits_result.new()
|
772
|
+
begin
|
773
|
+
result.success = @handler.get_table_splits(args.name)
|
774
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
775
|
+
result.e = e
|
776
|
+
end
|
777
|
+
write_result(result, oprot, 'get_table_splits', seqid)
|
778
|
+
end
|
779
|
+
|
622
780
|
def process_drop_table(seqid, iprot, oprot)
|
623
781
|
args = read_args(iprot, Drop_table_args)
|
624
782
|
result = Drop_table_result.new()
|
@@ -1056,6 +1214,150 @@ require 'client_types'
|
|
1056
1214
|
|
1057
1215
|
end
|
1058
1216
|
|
1217
|
+
class Put_cells_args
|
1218
|
+
include ::Thrift::Struct
|
1219
|
+
TABLENAME = 1
|
1220
|
+
MUTATE_SPEC = 2
|
1221
|
+
CELLS = 3
|
1222
|
+
|
1223
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cells
|
1224
|
+
FIELDS = {
|
1225
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1226
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1227
|
+
CELLS => {:type => ::Thrift::Types::LIST, :name => 'cells', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::Cell}}
|
1228
|
+
}
|
1229
|
+
|
1230
|
+
def struct_fields; FIELDS; end
|
1231
|
+
|
1232
|
+
def validate
|
1233
|
+
end
|
1234
|
+
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
class Put_cells_result
|
1238
|
+
include ::Thrift::Struct
|
1239
|
+
E = 1
|
1240
|
+
|
1241
|
+
::Thrift::Struct.field_accessor self, :e
|
1242
|
+
FIELDS = {
|
1243
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1244
|
+
}
|
1245
|
+
|
1246
|
+
def struct_fields; FIELDS; end
|
1247
|
+
|
1248
|
+
def validate
|
1249
|
+
end
|
1250
|
+
|
1251
|
+
end
|
1252
|
+
|
1253
|
+
class Put_cells_as_arrays_args
|
1254
|
+
include ::Thrift::Struct
|
1255
|
+
TABLENAME = 1
|
1256
|
+
MUTATE_SPEC = 2
|
1257
|
+
CELLS = 3
|
1258
|
+
|
1259
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cells
|
1260
|
+
FIELDS = {
|
1261
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1262
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1263
|
+
CELLS => {:type => ::Thrift::Types::LIST, :name => 'cells', :element => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::STRING}}}
|
1264
|
+
}
|
1265
|
+
|
1266
|
+
def struct_fields; FIELDS; end
|
1267
|
+
|
1268
|
+
def validate
|
1269
|
+
end
|
1270
|
+
|
1271
|
+
end
|
1272
|
+
|
1273
|
+
class Put_cells_as_arrays_result
|
1274
|
+
include ::Thrift::Struct
|
1275
|
+
E = 1
|
1276
|
+
|
1277
|
+
::Thrift::Struct.field_accessor self, :e
|
1278
|
+
FIELDS = {
|
1279
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1280
|
+
}
|
1281
|
+
|
1282
|
+
def struct_fields; FIELDS; end
|
1283
|
+
|
1284
|
+
def validate
|
1285
|
+
end
|
1286
|
+
|
1287
|
+
end
|
1288
|
+
|
1289
|
+
class Put_cell_args
|
1290
|
+
include ::Thrift::Struct
|
1291
|
+
TABLENAME = 1
|
1292
|
+
MUTATE_SPEC = 2
|
1293
|
+
CELL = 3
|
1294
|
+
|
1295
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cell
|
1296
|
+
FIELDS = {
|
1297
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1298
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1299
|
+
CELL => {:type => ::Thrift::Types::STRUCT, :name => 'cell', :class => Hypertable::ThriftGen::Cell}
|
1300
|
+
}
|
1301
|
+
|
1302
|
+
def struct_fields; FIELDS; end
|
1303
|
+
|
1304
|
+
def validate
|
1305
|
+
end
|
1306
|
+
|
1307
|
+
end
|
1308
|
+
|
1309
|
+
class Put_cell_result
|
1310
|
+
include ::Thrift::Struct
|
1311
|
+
E = 1
|
1312
|
+
|
1313
|
+
::Thrift::Struct.field_accessor self, :e
|
1314
|
+
FIELDS = {
|
1315
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1316
|
+
}
|
1317
|
+
|
1318
|
+
def struct_fields; FIELDS; end
|
1319
|
+
|
1320
|
+
def validate
|
1321
|
+
end
|
1322
|
+
|
1323
|
+
end
|
1324
|
+
|
1325
|
+
class Put_cell_as_array_args
|
1326
|
+
include ::Thrift::Struct
|
1327
|
+
TABLENAME = 1
|
1328
|
+
MUTATE_SPEC = 2
|
1329
|
+
CELL = 3
|
1330
|
+
|
1331
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cell
|
1332
|
+
FIELDS = {
|
1333
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1334
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1335
|
+
CELL => {:type => ::Thrift::Types::LIST, :name => 'cell', :element => {:type => ::Thrift::Types::STRING}}
|
1336
|
+
}
|
1337
|
+
|
1338
|
+
def struct_fields; FIELDS; end
|
1339
|
+
|
1340
|
+
def validate
|
1341
|
+
end
|
1342
|
+
|
1343
|
+
end
|
1344
|
+
|
1345
|
+
class Put_cell_as_array_result
|
1346
|
+
include ::Thrift::Struct
|
1347
|
+
E = 1
|
1348
|
+
|
1349
|
+
::Thrift::Struct.field_accessor self, :e
|
1350
|
+
FIELDS = {
|
1351
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1352
|
+
}
|
1353
|
+
|
1354
|
+
def struct_fields; FIELDS; end
|
1355
|
+
|
1356
|
+
def validate
|
1357
|
+
end
|
1358
|
+
|
1359
|
+
end
|
1360
|
+
|
1059
1361
|
class Open_mutator_args
|
1060
1362
|
include ::Thrift::Struct
|
1061
1363
|
NAME = 1
|
@@ -1296,6 +1598,40 @@ require 'client_types'
|
|
1296
1598
|
|
1297
1599
|
end
|
1298
1600
|
|
1601
|
+
class Exists_table_args
|
1602
|
+
include ::Thrift::Struct
|
1603
|
+
NAME = 1
|
1604
|
+
|
1605
|
+
::Thrift::Struct.field_accessor self, :name
|
1606
|
+
FIELDS = {
|
1607
|
+
NAME => {:type => ::Thrift::Types::STRING, :name => 'name'}
|
1608
|
+
}
|
1609
|
+
|
1610
|
+
def struct_fields; FIELDS; end
|
1611
|
+
|
1612
|
+
def validate
|
1613
|
+
end
|
1614
|
+
|
1615
|
+
end
|
1616
|
+
|
1617
|
+
class Exists_table_result
|
1618
|
+
include ::Thrift::Struct
|
1619
|
+
SUCCESS = 0
|
1620
|
+
E = 1
|
1621
|
+
|
1622
|
+
::Thrift::Struct.field_accessor self, :success, :e
|
1623
|
+
FIELDS = {
|
1624
|
+
SUCCESS => {:type => ::Thrift::Types::BOOL, :name => 'success'},
|
1625
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1626
|
+
}
|
1627
|
+
|
1628
|
+
def struct_fields; FIELDS; end
|
1629
|
+
|
1630
|
+
def validate
|
1631
|
+
end
|
1632
|
+
|
1633
|
+
end
|
1634
|
+
|
1299
1635
|
class Get_table_id_args
|
1300
1636
|
include ::Thrift::Struct
|
1301
1637
|
NAME = 1
|
@@ -1396,6 +1732,40 @@ require 'client_types'
|
|
1396
1732
|
|
1397
1733
|
end
|
1398
1734
|
|
1735
|
+
class Get_table_splits_args
|
1736
|
+
include ::Thrift::Struct
|
1737
|
+
NAME = 1
|
1738
|
+
|
1739
|
+
::Thrift::Struct.field_accessor self, :name
|
1740
|
+
FIELDS = {
|
1741
|
+
NAME => {:type => ::Thrift::Types::STRING, :name => 'name'}
|
1742
|
+
}
|
1743
|
+
|
1744
|
+
def struct_fields; FIELDS; end
|
1745
|
+
|
1746
|
+
def validate
|
1747
|
+
end
|
1748
|
+
|
1749
|
+
end
|
1750
|
+
|
1751
|
+
class Get_table_splits_result
|
1752
|
+
include ::Thrift::Struct
|
1753
|
+
SUCCESS = 0
|
1754
|
+
E = 1
|
1755
|
+
|
1756
|
+
::Thrift::Struct.field_accessor self, :success, :e
|
1757
|
+
FIELDS = {
|
1758
|
+
SUCCESS => {:type => ::Thrift::Types::LIST, :name => 'success', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::TableSplit}},
|
1759
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1760
|
+
}
|
1761
|
+
|
1762
|
+
def struct_fields; FIELDS; end
|
1763
|
+
|
1764
|
+
def validate
|
1765
|
+
end
|
1766
|
+
|
1767
|
+
end
|
1768
|
+
|
1399
1769
|
class Drop_table_args
|
1400
1770
|
include ::Thrift::Struct
|
1401
1771
|
NAME = 1
|
@@ -18,8 +18,9 @@ module Hypertable
|
|
18
18
|
|
19
19
|
module MutatorFlag
|
20
20
|
NO_LOG_SYNC = 1
|
21
|
-
|
22
|
-
|
21
|
+
IGNORE_UNKNOWN_CFS = 2
|
22
|
+
VALUE_MAP = {1 => "NO_LOG_SYNC", 2 => "IGNORE_UNKNOWN_CFS"}
|
23
|
+
VALID_VALUES = Set.new([NO_LOG_SYNC, IGNORE_UNKNOWN_CFS]).freeze
|
23
24
|
end
|
24
25
|
|
25
26
|
# Specifies a range of rows
|
@@ -148,8 +149,9 @@ module Hypertable
|
|
148
149
|
START_TIME = 6
|
149
150
|
END_TIME = 7
|
150
151
|
COLUMNS = 8
|
152
|
+
KEYS_ONLY = 9
|
151
153
|
|
152
|
-
::Thrift::Struct.field_accessor self, :row_intervals, :cell_intervals, :return_deletes, :revs, :row_limit, :start_time, :end_time, :columns
|
154
|
+
::Thrift::Struct.field_accessor self, :row_intervals, :cell_intervals, :return_deletes, :revs, :row_limit, :start_time, :end_time, :columns, :keys_only
|
153
155
|
FIELDS = {
|
154
156
|
ROW_INTERVALS => {:type => ::Thrift::Types::LIST, :name => 'row_intervals', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::RowInterval}, :optional => true},
|
155
157
|
CELL_INTERVALS => {:type => ::Thrift::Types::LIST, :name => 'cell_intervals', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::CellInterval}, :optional => true},
|
@@ -158,7 +160,8 @@ module Hypertable
|
|
158
160
|
ROW_LIMIT => {:type => ::Thrift::Types::I32, :name => 'row_limit', :default => 0, :optional => true},
|
159
161
|
START_TIME => {:type => ::Thrift::Types::I64, :name => 'start_time', :optional => true},
|
160
162
|
END_TIME => {:type => ::Thrift::Types::I64, :name => 'end_time', :optional => true},
|
161
|
-
COLUMNS => {:type => ::Thrift::Types::LIST, :name => 'columns', :element => {:type => ::Thrift::Types::STRING}, :optional => true}
|
163
|
+
COLUMNS => {:type => ::Thrift::Types::LIST, :name => 'columns', :element => {:type => ::Thrift::Types::STRING}, :optional => true},
|
164
|
+
KEYS_ONLY => {:type => ::Thrift::Types::BOOL, :name => 'keys_only', :default => false, :optional => true}
|
162
165
|
}
|
163
166
|
|
164
167
|
def struct_fields; FIELDS; end
|
@@ -168,10 +171,10 @@ module Hypertable
|
|
168
171
|
|
169
172
|
end
|
170
173
|
|
171
|
-
# Defines a
|
174
|
+
# Defines a cell key
|
172
175
|
#
|
173
176
|
# <dl>
|
174
|
-
# <dt>
|
177
|
+
# <dt>row</dt>
|
175
178
|
# <dd>Specifies the row key. Note, it cannot contain null characters.
|
176
179
|
# If a row key is not specified in a return cell, it's assumed to
|
177
180
|
# be the same as the previous cell</dd>
|
@@ -182,9 +185,6 @@ module Hypertable
|
|
182
185
|
# <dt>column_qualifier</dt>
|
183
186
|
# <dd>Specifies the column qualifier. A column family must be specified.</dd>
|
184
187
|
#
|
185
|
-
# <dt>value</dt>
|
186
|
-
# <dd>Value of a cell. Currently a sequence of uninterpreted bytes.</dd>
|
187
|
-
#
|
188
188
|
# <dt>timestamp</dt>
|
189
189
|
# <dd>Nanoseconds since epoch for the cell<dd>
|
190
190
|
#
|
@@ -194,25 +194,122 @@ module Hypertable
|
|
194
194
|
# <dt>flag</dt>
|
195
195
|
# <dd>A 16-bit integer indicating the state of the cell</dd>
|
196
196
|
# </dl>
|
197
|
-
class
|
197
|
+
class Key
|
198
198
|
include ::Thrift::Struct
|
199
|
-
|
199
|
+
ROW = 1
|
200
200
|
COLUMN_FAMILY = 2
|
201
201
|
COLUMN_QUALIFIER = 3
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
FLAG = 7
|
202
|
+
TIMESTAMP = 4
|
203
|
+
REVISION = 5
|
204
|
+
FLAG = 6
|
206
205
|
|
207
|
-
::Thrift::Struct.field_accessor self, :
|
206
|
+
::Thrift::Struct.field_accessor self, :row, :column_family, :column_qualifier, :timestamp, :revision, :flag
|
208
207
|
FIELDS = {
|
209
|
-
|
210
|
-
COLUMN_FAMILY => {:type => ::Thrift::Types::STRING, :name => 'column_family'
|
211
|
-
COLUMN_QUALIFIER => {:type => ::Thrift::Types::STRING, :name => 'column_qualifier'
|
212
|
-
VALUE => {:type => ::Thrift::Types::STRING, :name => 'value', :optional => true},
|
208
|
+
ROW => {:type => ::Thrift::Types::STRING, :name => 'row'},
|
209
|
+
COLUMN_FAMILY => {:type => ::Thrift::Types::STRING, :name => 'column_family'},
|
210
|
+
COLUMN_QUALIFIER => {:type => ::Thrift::Types::STRING, :name => 'column_qualifier'},
|
213
211
|
TIMESTAMP => {:type => ::Thrift::Types::I64, :name => 'timestamp', :optional => true},
|
214
212
|
REVISION => {:type => ::Thrift::Types::I64, :name => 'revision', :optional => true},
|
215
|
-
FLAG => {:type => ::Thrift::Types::I16, :name => 'flag', :default => 255
|
213
|
+
FLAG => {:type => ::Thrift::Types::I16, :name => 'flag', :default => 255}
|
214
|
+
}
|
215
|
+
|
216
|
+
def struct_fields; FIELDS; end
|
217
|
+
|
218
|
+
def validate
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
# Specifies options for a shared periodic mutator
|
224
|
+
#
|
225
|
+
# <dl>
|
226
|
+
# <dt>appname</dt>
|
227
|
+
# <dd>String key used to share/retrieve mutator, eg: "my_ht_app"</dd>
|
228
|
+
#
|
229
|
+
# <dt>flush_interval</dt>
|
230
|
+
# <dd>Time interval between flushes</dd>
|
231
|
+
#
|
232
|
+
# <dt>flags</dt>
|
233
|
+
# <dd>Mutator flags</dt>
|
234
|
+
# </dl>
|
235
|
+
class MutateSpec
|
236
|
+
include ::Thrift::Struct
|
237
|
+
APPNAME = 1
|
238
|
+
FLUSH_INTERVAL = 2
|
239
|
+
FLAGS = 3
|
240
|
+
|
241
|
+
::Thrift::Struct.field_accessor self, :appname, :flush_interval, :flags
|
242
|
+
FIELDS = {
|
243
|
+
APPNAME => {:type => ::Thrift::Types::STRING, :name => 'appname', :default => %q""},
|
244
|
+
FLUSH_INTERVAL => {:type => ::Thrift::Types::I32, :name => 'flush_interval', :default => 1000},
|
245
|
+
FLAGS => {:type => ::Thrift::Types::I32, :name => 'flags', :default => 2}
|
246
|
+
}
|
247
|
+
|
248
|
+
def struct_fields; FIELDS; end
|
249
|
+
|
250
|
+
def validate
|
251
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field appname is unset!') unless @appname
|
252
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field flush_interval is unset!') unless @flush_interval
|
253
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field flags is unset!') unless @flags
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
# Defines a table cell
|
259
|
+
#
|
260
|
+
# <dl>
|
261
|
+
# <dt>key</dt>
|
262
|
+
# <dd>Specifies the cell key</dd>
|
263
|
+
#
|
264
|
+
# <dt>value</dt>
|
265
|
+
# <dd>Value of a cell. Currently a sequence of uninterpreted bytes.</dd>
|
266
|
+
# </dl>
|
267
|
+
class Cell
|
268
|
+
include ::Thrift::Struct
|
269
|
+
KEY = 1
|
270
|
+
VALUE = 2
|
271
|
+
|
272
|
+
::Thrift::Struct.field_accessor self, :key, :value
|
273
|
+
FIELDS = {
|
274
|
+
KEY => {:type => ::Thrift::Types::STRUCT, :name => 'key', :class => Hypertable::ThriftGen::Key},
|
275
|
+
VALUE => {:type => ::Thrift::Types::STRING, :name => 'value', :optional => true}
|
276
|
+
}
|
277
|
+
|
278
|
+
def struct_fields; FIELDS; end
|
279
|
+
|
280
|
+
def validate
|
281
|
+
end
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
# Defines a table split
|
286
|
+
#
|
287
|
+
# <dl>
|
288
|
+
# <dt>start_row</dt>
|
289
|
+
# <dd>Starting row of the split.</dd>
|
290
|
+
#
|
291
|
+
# <dt>end_row</dt>
|
292
|
+
# <dd>Ending row of the split.</dd>
|
293
|
+
#
|
294
|
+
# <dt>location</dt>
|
295
|
+
# <dd>Location (proxy name) of the split.</dd>
|
296
|
+
#
|
297
|
+
# <dt>ip_address</dt>
|
298
|
+
# <dd>The IP address of the split.</dd>
|
299
|
+
# </dl>
|
300
|
+
class TableSplit
|
301
|
+
include ::Thrift::Struct
|
302
|
+
START_ROW = 1
|
303
|
+
END_ROW = 2
|
304
|
+
LOCATION = 3
|
305
|
+
IP_ADDRESS = 4
|
306
|
+
|
307
|
+
::Thrift::Struct.field_accessor self, :start_row, :end_row, :location, :ip_address
|
308
|
+
FIELDS = {
|
309
|
+
START_ROW => {:type => ::Thrift::Types::STRING, :name => 'start_row', :optional => true},
|
310
|
+
END_ROW => {:type => ::Thrift::Types::STRING, :name => 'end_row', :optional => true},
|
311
|
+
LOCATION => {:type => ::Thrift::Types::STRING, :name => 'location', :optional => true},
|
312
|
+
IP_ADDRESS => {:type => ::Thrift::Types::STRING, :name => 'ip_address', :optional => true}
|
216
313
|
}
|
217
314
|
|
218
315
|
def struct_fields; FIELDS; end
|
@@ -842,6 +842,59 @@ module ActiveRecord
|
|
842
842
|
it "should support native each_row_as_arrays scanner method"
|
843
843
|
end
|
844
844
|
|
845
|
+
describe HyperBase, '.mutator_options' do
|
846
|
+
it 'should default to set_cells method' do
|
847
|
+
class Temp < ActiveRecord::HyperBase
|
848
|
+
def self.create_table
|
849
|
+
hql = "CREATE TABLE #{table_name} (
|
850
|
+
'name',
|
851
|
+
'url'
|
852
|
+
)"
|
853
|
+
connection.execute(hql)
|
854
|
+
end
|
855
|
+
end
|
856
|
+
|
857
|
+
Temp.drop_table
|
858
|
+
Temp.create_table
|
859
|
+
Temp.connection.instance_eval("@connection").should_receive(:set_cells_as_arrays).and_return(nil)
|
860
|
+
t = Temp.new({:ROW => 'test', :name => 'test'})
|
861
|
+
t.save!
|
862
|
+
Temp.drop_table
|
863
|
+
end
|
864
|
+
|
865
|
+
describe 'asynchronous_write' do
|
866
|
+
before(:each) do
|
867
|
+
class Temp < ActiveRecord::HyperBase
|
868
|
+
mutator_options :asynchronous_write => true
|
869
|
+
|
870
|
+
def self.create_table
|
871
|
+
hql = "CREATE TABLE #{table_name} (
|
872
|
+
'name',
|
873
|
+
'url'
|
874
|
+
)"
|
875
|
+
connection.execute(hql)
|
876
|
+
end
|
877
|
+
|
878
|
+
Temp.drop_table
|
879
|
+
Temp.create_table
|
880
|
+
end
|
881
|
+
end
|
882
|
+
|
883
|
+
it 'should use put_cells method when asynchronous_write enabled' do
|
884
|
+
Temp.connection.instance_eval("@connection").should_receive(:put_cells_as_arrays).and_return(nil)
|
885
|
+
t = Temp.new({:ROW => 'test', :name => 'test'})
|
886
|
+
t.save!
|
887
|
+
end
|
888
|
+
|
889
|
+
it 'should still result in cells being written to hypertable' do
|
890
|
+
t = Temp.new({:ROW => 'test', :name => 'test'})
|
891
|
+
t.save!
|
892
|
+
sleep 3
|
893
|
+
Temp.find('test').should == t
|
894
|
+
end
|
895
|
+
end
|
896
|
+
end
|
897
|
+
|
845
898
|
describe HyperBase, '.row_key_attributes' do
|
846
899
|
it "should assemble a row key in the order that matches row key attributes" do
|
847
900
|
Page.class_eval do
|
data/test/thrift_client_test.rb
CHANGED
@@ -212,8 +212,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
212
212
|
|
213
213
|
query = client.hql_query("SELECT * FROM thrift_test")
|
214
214
|
assert_equal 1, query.cells.length
|
215
|
-
assert_equal 'k1', query.cells[0].
|
216
|
-
assert_equal 'col', query.cells[0].column_family
|
215
|
+
assert_equal 'k1', query.cells[0].key.row
|
216
|
+
assert_equal 'col', query.cells[0].key.column_family
|
217
217
|
assert_equal 'v1', query.cells[0].value
|
218
218
|
end
|
219
219
|
end
|
@@ -222,16 +222,17 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
222
222
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
223
223
|
mutator = client.open_mutator('thrift_test', 0, 0)
|
224
224
|
cell1 = Hypertable::ThriftGen::Cell.new
|
225
|
-
cell1.
|
226
|
-
cell1.
|
225
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
226
|
+
cell1.key.row = 'k1'
|
227
|
+
cell1.key.column_family = 'col'
|
227
228
|
cell1.value = 'v1'
|
228
229
|
client.set_cell(mutator, cell1)
|
229
230
|
client.close_mutator(mutator, true)
|
230
231
|
|
231
232
|
query = client.hql_query("SELECT * FROM thrift_test")
|
232
233
|
assert_equal 1, query.cells.length
|
233
|
-
assert_equal 'k1', query.cells[0].
|
234
|
-
assert_equal 'col', query.cells[0].column_family
|
234
|
+
assert_equal 'k1', query.cells[0].key.row
|
235
|
+
assert_equal 'col', query.cells[0].key.column_family
|
235
236
|
assert_equal 'v1', query.cells[0].value
|
236
237
|
end
|
237
238
|
end
|
@@ -240,8 +241,9 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
240
241
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
241
242
|
mutator = client.open_mutator('thrift_test', 0, 500)
|
242
243
|
cell1 = Hypertable::ThriftGen::Cell.new
|
243
|
-
cell1.
|
244
|
-
cell1.
|
244
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
245
|
+
cell1.key.row = 'k1'
|
246
|
+
cell1.key.column_family = 'col'
|
245
247
|
cell1.value = 'v1'
|
246
248
|
client.set_cell(mutator, cell1)
|
247
249
|
|
@@ -252,8 +254,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
252
254
|
|
253
255
|
query = client.hql_query("SELECT * FROM thrift_test")
|
254
256
|
assert_equal 1, query.cells.length
|
255
|
-
assert_equal 'k1', query.cells[0].
|
256
|
-
assert_equal 'col', query.cells[0].column_family
|
257
|
+
assert_equal 'k1', query.cells[0].key.row
|
258
|
+
assert_equal 'col', query.cells[0].key.column_family
|
257
259
|
assert_equal 'v1', query.cells[0].value
|
258
260
|
end
|
259
261
|
end
|
@@ -276,16 +278,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
276
278
|
|
277
279
|
query = client.hql_query("SELECT * FROM thrift_test")
|
278
280
|
assert_equal 3, query.cells.length
|
279
|
-
assert_equal 'k1', query.cells[0].
|
280
|
-
assert_equal 'col', query.cells[0].column_family
|
281
|
+
assert_equal 'k1', query.cells[0].key.row
|
282
|
+
assert_equal 'col', query.cells[0].key.column_family
|
281
283
|
assert_equal 'v1', query.cells[0].value
|
282
284
|
|
283
|
-
assert_equal 'k2', query.cells[1].
|
284
|
-
assert_equal 'col', query.cells[1].column_family
|
285
|
+
assert_equal 'k2', query.cells[1].key.row
|
286
|
+
assert_equal 'col', query.cells[1].key.column_family
|
285
287
|
assert_equal 'v2', query.cells[1].value
|
286
288
|
|
287
|
-
assert_equal 'k3', query.cells[2].
|
288
|
-
assert_equal 'col', query.cells[2].column_family
|
289
|
+
assert_equal 'k3', query.cells[2].key.row
|
290
|
+
assert_equal 'col', query.cells[2].key.column_family
|
289
291
|
assert_equal 'v3', query.cells[2].value
|
290
292
|
end
|
291
293
|
end
|
@@ -294,18 +296,21 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
294
296
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
295
297
|
mutator = client.open_mutator('thrift_test', 0, 0)
|
296
298
|
cell1 = Hypertable::ThriftGen::Cell.new
|
297
|
-
cell1.
|
298
|
-
cell1.
|
299
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
300
|
+
cell1.key.row = 'k1'
|
301
|
+
cell1.key.column_family = 'col'
|
299
302
|
cell1.value = 'v1'
|
300
303
|
|
301
304
|
cell2 = Hypertable::ThriftGen::Cell.new
|
302
|
-
cell2.
|
303
|
-
cell2.
|
305
|
+
cell2.key = Hypertable::ThriftGen::Key.new
|
306
|
+
cell2.key.row = 'k2'
|
307
|
+
cell2.key.column_family = 'col'
|
304
308
|
cell2.value = 'v2'
|
305
309
|
|
306
310
|
cell3 = Hypertable::ThriftGen::Cell.new
|
307
|
-
cell3.
|
308
|
-
cell3.
|
311
|
+
cell3.key = Hypertable::ThriftGen::Key.new
|
312
|
+
cell3.key.row = 'k3'
|
313
|
+
cell3.key.column_family = 'col'
|
309
314
|
cell3.value = 'v3'
|
310
315
|
|
311
316
|
client.set_cells(mutator, [cell1, cell2, cell3])
|
@@ -313,16 +318,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
313
318
|
|
314
319
|
query = client.hql_query("SELECT * FROM thrift_test")
|
315
320
|
assert_equal 3, query.cells.length
|
316
|
-
assert_equal 'k1', query.cells[0].
|
317
|
-
assert_equal 'col', query.cells[0].column_family
|
321
|
+
assert_equal 'k1', query.cells[0].key.row
|
322
|
+
assert_equal 'col', query.cells[0].key.column_family
|
318
323
|
assert_equal 'v1', query.cells[0].value
|
319
324
|
|
320
|
-
assert_equal 'k2', query.cells[1].
|
321
|
-
assert_equal 'col', query.cells[1].column_family
|
325
|
+
assert_equal 'k2', query.cells[1].key.row
|
326
|
+
assert_equal 'col', query.cells[1].key.column_family
|
322
327
|
assert_equal 'v2', query.cells[1].value
|
323
328
|
|
324
|
-
assert_equal 'k3', query.cells[2].
|
325
|
-
assert_equal 'col', query.cells[2].column_family
|
329
|
+
assert_equal 'k3', query.cells[2].key.row
|
330
|
+
assert_equal 'col', query.cells[2].key.column_family
|
326
331
|
assert_equal 'v3', query.cells[2].value
|
327
332
|
end
|
328
333
|
end
|
@@ -343,16 +348,17 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
343
348
|
|
344
349
|
client.with_mutator('thrift_test') do |mutator|
|
345
350
|
cell1 = Hypertable::ThriftGen::Cell.new
|
346
|
-
cell1.
|
347
|
-
cell1.
|
351
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
352
|
+
cell1.key.row = 'k1'
|
353
|
+
cell1.key.column_family = 'col'
|
348
354
|
cell1.value = 'v1'
|
349
355
|
client.set_cells(mutator, [cell1])
|
350
356
|
end
|
351
357
|
|
352
358
|
query = client.hql_query("SELECT * FROM thrift_test")
|
353
359
|
assert_equal 1, query.cells.length
|
354
|
-
assert_equal 'k1', query.cells[0].
|
355
|
-
assert_equal 'col', query.cells[0].column_family
|
360
|
+
assert_equal 'k1', query.cells[0].key.row
|
361
|
+
assert_equal 'col', query.cells[0].key.column_family
|
356
362
|
assert_equal 'v1', query.cells[0].value
|
357
363
|
end
|
358
364
|
end
|
@@ -374,8 +380,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
374
380
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
375
381
|
query = client.hql_query("SELECT * FROM thrift_test WHERE CELL = 'k1','col'")
|
376
382
|
assert_equal 1, query.cells.length
|
377
|
-
assert_equal 'k1', query.cells[0].
|
378
|
-
assert_equal 'col', query.cells[0].column_family
|
383
|
+
assert_equal 'k1', query.cells[0].key.row
|
384
|
+
assert_equal 'col', query.cells[0].key.column_family
|
379
385
|
assert_equal 'v1', query.cells[0].value
|
380
386
|
end
|
381
387
|
end
|
@@ -404,8 +410,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
404
410
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
405
411
|
query = client.hql_query("SELECT * FROM thrift_test WHERE ROW = 'k1'")
|
406
412
|
assert_equal 1, query.cells.length
|
407
|
-
assert_equal 'k1', query.cells[0].
|
408
|
-
assert_equal 'col', query.cells[0].column_family
|
413
|
+
assert_equal 'k1', query.cells[0].key.row
|
414
|
+
assert_equal 'col', query.cells[0].key.column_family
|
409
415
|
assert_equal 'v1', query.cells[0].value
|
410
416
|
end
|
411
417
|
end
|
@@ -414,8 +420,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
414
420
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
415
421
|
cells = client.get_row("thrift_test", 'k1')
|
416
422
|
assert_equal 1, cells.length
|
417
|
-
assert_equal 'k1', cells[0].
|
418
|
-
assert_equal 'col', cells[0].column_family
|
423
|
+
assert_equal 'k1', cells[0].key.row
|
424
|
+
assert_equal 'col', cells[0].key.column_family
|
419
425
|
assert_equal 'v1', cells[0].value
|
420
426
|
end
|
421
427
|
end
|
@@ -437,16 +443,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
437
443
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
438
444
|
query = client.hql_query("SELECT * FROM thrift_test")
|
439
445
|
assert_equal 3, query.cells.length
|
440
|
-
assert_equal 'k1', query.cells[0].
|
441
|
-
assert_equal 'col', query.cells[0].column_family
|
446
|
+
assert_equal 'k1', query.cells[0].key.row
|
447
|
+
assert_equal 'col', query.cells[0].key.column_family
|
442
448
|
assert_equal 'v1', query.cells[0].value
|
443
449
|
|
444
|
-
assert_equal 'k2', query.cells[1].
|
445
|
-
assert_equal 'col', query.cells[1].column_family
|
450
|
+
assert_equal 'k2', query.cells[1].key.row
|
451
|
+
assert_equal 'col', query.cells[1].key.column_family
|
446
452
|
assert_equal 'v2', query.cells[1].value
|
447
453
|
|
448
|
-
assert_equal 'k3', query.cells[2].
|
449
|
-
assert_equal 'col', query.cells[2].column_family
|
454
|
+
assert_equal 'k3', query.cells[2].key.row
|
455
|
+
assert_equal 'col', query.cells[2].key.column_family
|
450
456
|
assert_equal 'v3', query.cells[2].value
|
451
457
|
end
|
452
458
|
end
|
@@ -457,16 +463,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
457
463
|
cells = client.get_cells("thrift_test", scan_spec)
|
458
464
|
|
459
465
|
assert_equal 3, cells.length
|
460
|
-
assert_equal 'k1', cells[0].
|
461
|
-
assert_equal 'col', cells[0].column_family
|
466
|
+
assert_equal 'k1', cells[0].key.row
|
467
|
+
assert_equal 'col', cells[0].key.column_family
|
462
468
|
assert_equal 'v1', cells[0].value
|
463
469
|
|
464
|
-
assert_equal 'k2', cells[1].
|
465
|
-
assert_equal 'col', cells[1].column_family
|
470
|
+
assert_equal 'k2', cells[1].key.row
|
471
|
+
assert_equal 'col', cells[1].key.column_family
|
466
472
|
assert_equal 'v2', cells[1].value
|
467
473
|
|
468
|
-
assert_equal 'k3', cells[2].
|
469
|
-
assert_equal 'col', cells[2].column_family
|
474
|
+
assert_equal 'k3', cells[2].key.row
|
475
|
+
assert_equal 'col', cells[2].key.column_family
|
470
476
|
assert_equal 'v3', cells[2].value
|
471
477
|
end
|
472
478
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 9
|
8
|
+
- 3
|
9
|
+
version: 0.9.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- tylerkovacs
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-05-30 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- CHANGELOG
|
33
33
|
- LICENSE
|
34
34
|
- README
|
35
|
+
- HOW_TO_RUN_TESTS
|
35
36
|
- Rakefile
|
36
37
|
- VERSION.yml
|
37
38
|
- benchmark/save.rb
|
@@ -51,7 +52,6 @@ files:
|
|
51
52
|
- lib/hypertable/gen-rb/hql_types.rb
|
52
53
|
- lib/hypertable/thrift_client.rb
|
53
54
|
- lib/hypertable/thrift_transport_monkey_patch.rb
|
54
|
-
- pkg/hyper_record-0.2.8.gem
|
55
55
|
- spec/fixtures/pages.yml
|
56
56
|
- spec/fixtures/qualified_pages.yml
|
57
57
|
- spec/lib/associations_spec.rb
|
data/pkg/hyper_record-0.2.8.gem
DELETED
Binary file
|