cassandra-mavericks 0.21.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +15 -0
  2. data/CHANGELOG +150 -0
  3. data/Gemfile +7 -0
  4. data/LICENSE +202 -0
  5. data/Manifest +94 -0
  6. data/README.md +373 -0
  7. data/Rakefile +191 -0
  8. data/bin/cassandra_helper +16 -0
  9. data/cassandra.gemspec +29 -0
  10. data/conf/0.6/cassandra.in.sh +47 -0
  11. data/conf/0.6/log4j.properties +38 -0
  12. data/conf/0.6/schema.json +57 -0
  13. data/conf/0.6/storage-conf.xml +352 -0
  14. data/conf/0.7/cassandra.in.sh +46 -0
  15. data/conf/0.7/cassandra.yaml +336 -0
  16. data/conf/0.7/log4j-server.properties +41 -0
  17. data/conf/0.7/schema.json +57 -0
  18. data/conf/0.7/schema.txt +45 -0
  19. data/conf/0.8/cassandra.in.sh +41 -0
  20. data/conf/0.8/cassandra.yaml +61 -0
  21. data/conf/0.8/log4j-server.properties +40 -0
  22. data/conf/0.8/schema.json +72 -0
  23. data/conf/0.8/schema.txt +57 -0
  24. data/conf/1.0/cassandra.in.sh +41 -0
  25. data/conf/1.0/cassandra.yaml +415 -0
  26. data/conf/1.0/log4j-server.properties +40 -0
  27. data/conf/1.0/schema.json +72 -0
  28. data/conf/1.0/schema.txt +57 -0
  29. data/conf/1.1/cassandra.in.sh +41 -0
  30. data/conf/1.1/cassandra.yaml +567 -0
  31. data/conf/1.1/log4j-server.properties +44 -0
  32. data/conf/1.1/schema.json +72 -0
  33. data/conf/1.1/schema.txt +57 -0
  34. data/conf/1.2/cassandra.in.sh +41 -0
  35. data/conf/1.2/cassandra.yaml +643 -0
  36. data/conf/1.2/log4j-server.properties +44 -0
  37. data/conf/1.2/schema.json +72 -0
  38. data/conf/1.2/schema.txt +57 -0
  39. data/ext/cassandra_native.c +69 -0
  40. data/ext/extconf.rb +9 -0
  41. data/lib/cassandra.rb +47 -0
  42. data/lib/cassandra/0.6.rb +7 -0
  43. data/lib/cassandra/0.6/cassandra.rb +113 -0
  44. data/lib/cassandra/0.6/columns.rb +78 -0
  45. data/lib/cassandra/0.6/protocol.rb +91 -0
  46. data/lib/cassandra/0.7.rb +7 -0
  47. data/lib/cassandra/0.7/cassandra.rb +2 -0
  48. data/lib/cassandra/0.7/columns.rb +4 -0
  49. data/lib/cassandra/0.7/protocol.rb +5 -0
  50. data/lib/cassandra/0.8.rb +7 -0
  51. data/lib/cassandra/0.8/cassandra.rb +25 -0
  52. data/lib/cassandra/0.8/columns.rb +28 -0
  53. data/lib/cassandra/0.8/protocol.rb +10 -0
  54. data/lib/cassandra/1.0.rb +7 -0
  55. data/lib/cassandra/1.0/cassandra.rb +1 -0
  56. data/lib/cassandra/1.0/columns.rb +1 -0
  57. data/lib/cassandra/1.0/protocol.rb +1 -0
  58. data/lib/cassandra/1.1.rb +7 -0
  59. data/lib/cassandra/1.1/cassandra.rb +1 -0
  60. data/lib/cassandra/1.1/columns.rb +1 -0
  61. data/lib/cassandra/1.1/protocol.rb +1 -0
  62. data/lib/cassandra/1.2.rb +7 -0
  63. data/lib/cassandra/1.2/cassandra.rb +1 -0
  64. data/lib/cassandra/1.2/columns.rb +1 -0
  65. data/lib/cassandra/1.2/protocol.rb +1 -0
  66. data/lib/cassandra/array.rb +8 -0
  67. data/lib/cassandra/batch.rb +41 -0
  68. data/lib/cassandra/cassandra.rb +1091 -0
  69. data/lib/cassandra/column_family.rb +3 -0
  70. data/lib/cassandra/columns.rb +172 -0
  71. data/lib/cassandra/comparable.rb +28 -0
  72. data/lib/cassandra/composite.rb +137 -0
  73. data/lib/cassandra/constants.rb +11 -0
  74. data/lib/cassandra/debug.rb +9 -0
  75. data/lib/cassandra/dynamic_composite.rb +118 -0
  76. data/lib/cassandra/helpers.rb +41 -0
  77. data/lib/cassandra/keyspace.rb +3 -0
  78. data/lib/cassandra/long.rb +58 -0
  79. data/lib/cassandra/mock.rb +536 -0
  80. data/lib/cassandra/ordered_hash.rb +195 -0
  81. data/lib/cassandra/protocol.rb +137 -0
  82. data/lib/cassandra/time.rb +11 -0
  83. data/test/cassandra_client_test.rb +20 -0
  84. data/test/cassandra_mock_test.rb +128 -0
  85. data/test/cassandra_test.rb +1367 -0
  86. data/test/comparable_types_test.rb +45 -0
  87. data/test/composite_type_test.rb +86 -0
  88. data/test/eventmachine_test.rb +42 -0
  89. data/test/ordered_hash_test.rb +386 -0
  90. data/test/test_helper.rb +19 -0
  91. data/vendor/0.6/gen-rb/cassandra.rb +1481 -0
  92. data/vendor/0.6/gen-rb/cassandra_constants.rb +12 -0
  93. data/vendor/0.6/gen-rb/cassandra_types.rb +482 -0
  94. data/vendor/0.7/gen-rb/cassandra.rb +1936 -0
  95. data/vendor/0.7/gen-rb/cassandra_constants.rb +12 -0
  96. data/vendor/0.7/gen-rb/cassandra_types.rb +681 -0
  97. data/vendor/0.8/gen-rb/cassandra.rb +2215 -0
  98. data/vendor/0.8/gen-rb/cassandra_constants.rb +12 -0
  99. data/vendor/0.8/gen-rb/cassandra_types.rb +824 -0
  100. data/vendor/1.0/gen-rb/cassandra.rb +2215 -0
  101. data/vendor/1.0/gen-rb/cassandra_constants.rb +12 -0
  102. data/vendor/1.0/gen-rb/cassandra_types.rb +857 -0
  103. data/vendor/1.1/gen-rb/cassandra.rb +2571 -0
  104. data/vendor/1.1/gen-rb/cassandra_constants.rb +12 -0
  105. data/vendor/1.1/gen-rb/cassandra_types.rb +928 -0
  106. data/vendor/1.2/gen-rb/cassandra.rb +3013 -0
  107. data/vendor/1.2/gen-rb/cassandra_constants.rb +13 -0
  108. data/vendor/1.2/gen-rb/cassandra_types.rb +965 -0
  109. metadata +288 -0
@@ -0,0 +1,41 @@
1
+ class Cassandra
2
+ module Helpers
3
+ def extract_and_validate_params(column_family, keys, args, options)
4
+ options = options.dup
5
+ column_family = column_family.to_s
6
+ # Keys
7
+ [keys].flatten.each do |key|
8
+ raise ArgumentError, "Key #{key.inspect} must be a String for #{caller[2].inspect}." unless key.is_a?(String)
9
+ end
10
+
11
+ # Options
12
+ if args.last.is_a?(Hash)
13
+ extras = args.last.keys - options.keys
14
+ raise ArgumentError, "Invalid options #{extras.inspect[1..-2]} for #{caller[1]}" if extras.any?
15
+ options.merge!(args.pop)
16
+ end
17
+
18
+ # Ranges
19
+ column, sub_column = args[0], args[1]
20
+ raise ArgumentError, "Invalid arguments: subcolumns specified for a non-supercolumn family" if sub_column && !is_super(column_family)
21
+ klass, sub_klass = column_name_class(column_family), sub_column_name_class(column_family)
22
+ range_class = column ? sub_klass : klass
23
+
24
+ [:start, :finish].each do |opt|
25
+ options[opt] = options[opt] ? range_class.new(options[opt]).to_s : ''
26
+ end
27
+
28
+ [column_family, s_map(column, klass), s_map(sub_column, sub_klass), options]
29
+ end
30
+
31
+ # Convert stuff to strings.
32
+ def s_map(el, klass)
33
+ case el
34
+ when Array then el.map { |i| s_map(i, klass) }
35
+ when NilClass then nil
36
+ else
37
+ klass.new(el).to_s
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ class Cassandra
2
+ class Keyspace < CassandraThrift::KsDef ; end
3
+ end
@@ -0,0 +1,58 @@
1
+
2
+ class Cassandra
3
+ # A temporally-ordered Long class for use in Cassandra column names
4
+ class Long < Comparable
5
+
6
+ # FIXME Should unify with or subclass Cassandra::UUID
7
+ def initialize(bytes = nil)
8
+ case bytes
9
+ when self.class # Long
10
+ @bytes = bytes.to_s
11
+ when String
12
+ case bytes.size
13
+ when 8 # Raw byte array
14
+ @bytes = bytes
15
+ when 18 # Human-readable UUID-like representation; inverse of #to_guid
16
+ elements = bytes.split("-")
17
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (malformed UUID-like representation)" if elements.size != 3
18
+ @bytes = [elements.join].pack('H32')
19
+ else
20
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (invalid bytecount)"
21
+ end
22
+ when Integer
23
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (integer out of range)" if bytes < 0 or bytes > 2**64
24
+ @bytes = [bytes >> 32, bytes % 2**32].pack("NN")
25
+ when NilClass, Time
26
+ # Time.stamp is 52 bytes, so we have 12 bytes of entropy left over
27
+ int = ((bytes || Time).stamp << 12) + rand(2**12)
28
+ @bytes = [int >> 32, int % 2**32].pack("NN")
29
+ else
30
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (unknown source class)"
31
+ end
32
+ end
33
+
34
+ def to_i
35
+ @to_i ||= begin
36
+ ints = @bytes.unpack("NN")
37
+ (ints[0] << 32) +
38
+ ints[1]
39
+ end
40
+ end
41
+
42
+ def to_guid
43
+ "%08x-%04x-%04x" % @bytes.unpack("Nnn")
44
+ end
45
+
46
+ def inspect
47
+ "<Cassandra::Long##{object_id} time: #{
48
+ Time.at((to_i >> 12) / 1_000_000).utc.inspect
49
+ }, usecs: #{
50
+ (to_i >> 12) % 1_000_000
51
+ }, jitter: #{
52
+ to_i % 2**12
53
+ }, guid: #{
54
+ to_guid
55
+ }>"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,536 @@
1
+ class SimpleUUID::UUID
2
+ def >=(other)
3
+ (self <=> other) >= 0
4
+ end
5
+
6
+ def <=(other)
7
+ (self <=> other) <= 0
8
+ end
9
+ end
10
+
11
+ class Cassandra
12
+ class Mock
13
+ include ::Cassandra::Helpers
14
+ include ::Cassandra::Columns
15
+
16
+ attr_reader :keyspace
17
+
18
+ def initialize(keyspace, schema)
19
+ @is_super = {}
20
+ @keyspace = keyspace
21
+ @column_name_class = {}
22
+ @sub_column_name_class = {}
23
+ @column_name_maker = {}
24
+ @sub_column_name_maker = {}
25
+ @indexes = {}
26
+ @schema = schema[keyspace]
27
+ clear_keyspace!
28
+ end
29
+
30
+ def disconnect!
31
+ end
32
+
33
+ def clear_keyspace!
34
+ @data = {}
35
+ end
36
+
37
+ def clear_column_family!(column_family)
38
+ @data[column_family.to_sym] = OrderedHash.new
39
+ end
40
+
41
+ def default_write_consistency=(value)
42
+ WRITE_DEFAULTS[:consistency] = value
43
+ end
44
+
45
+ def default_read_consistency=(value)
46
+ READ_DEFAULTS[:consistency] = value
47
+ end
48
+
49
+ def insert(column_family, key, hash_or_array, options = {})
50
+ if @batch
51
+ @batch << [:insert, column_family, key, hash_or_array, options]
52
+ else
53
+ raise ArgumentError if key.nil?
54
+ if !is_super(column_family)
55
+ insert_standard(column_family, key, hash_or_array)
56
+ else
57
+ insert_super(column_family, key, hash_or_array)
58
+ end
59
+ end
60
+ end
61
+
62
+ def insert_standard(column_family, key, hash_or_array)
63
+ old = cf(column_family)[key] || OrderedHash.new
64
+ cf(column_family)[key] = merge_and_sort(old, hash_or_array)
65
+ end
66
+
67
+ def insert_super(column_family, key, hash)
68
+ raise ArgumentError unless hash.is_a?(Hash)
69
+ cf(column_family)[key] ||= OrderedHash.new
70
+
71
+ hash.keys.each do |sub_key|
72
+ old = cf(column_family)[key][sub_key] || OrderedHash.new
73
+ cf(column_family)[key][sub_key] = merge_and_sort(old, hash[sub_key])
74
+ end
75
+ end
76
+
77
+ def batch(options={})
78
+ @batch = Cassandra::Batch.new(self, options)
79
+ yield
80
+ flush_batch(options)
81
+ ensure
82
+ @batch = nil
83
+ end
84
+
85
+ def flush_batch(options)
86
+ b = @batch
87
+ @batch = nil
88
+ b.each do |mutation|
89
+ send(*mutation)
90
+ end
91
+ @batch = b
92
+ end
93
+
94
+ def get(column_family, key, *columns_and_options)
95
+ column_family, column, sub_column, options =
96
+ extract_and_validate_params_for_real(column_family, [key], columns_and_options, READ_DEFAULTS)
97
+ if !is_super(column_family)
98
+ get_standard(column_family, key, column, options)
99
+ else
100
+ get_super(column_family, key, column, sub_column, options)
101
+ end
102
+ end
103
+
104
+ def get_standard(column_family, key, column, options)
105
+ columns = cf(column_family)[key] || OrderedHash.new
106
+ row = columns_to_hash(column_family, columns)
107
+
108
+ if column
109
+ row[column]
110
+ else
111
+ row = apply_range(row, column_family, options[:start], options[:finish])
112
+ row = apply_count(row, options[:count], options[:reversed])
113
+ end
114
+ end
115
+
116
+ def get_super(column_family, key, column, sub_column, options)
117
+ columns = cf(column_family)[key] || OrderedHash.new
118
+ row = columns_to_hash(column_family, columns)
119
+
120
+ if column
121
+ if sub_column
122
+ if row[column] &&
123
+ row[column][sub_column]
124
+ row[column][sub_column]
125
+ else
126
+ nil
127
+ end
128
+ else
129
+ row = row[column] || OrderedHash.new
130
+ row = apply_range(row, column_family, options[:start], options[:finish], false)
131
+ row = apply_count(row, options[:count], options[:reversed])
132
+ end
133
+ else
134
+ row
135
+ end
136
+ end
137
+
138
+ def exists?(column_family, key, *columns_and_options)
139
+ column_family, column, sub_column, options = extract_and_validate_params_for_real(column_family, [key], columns_and_options, READ_DEFAULTS)
140
+ results = get(column_family, key, column, sub_column)
141
+
142
+ ![{}, nil].include?(results)
143
+ end
144
+
145
+ def multi_get(column_family, keys, *columns_and_options)
146
+ column_family, column, sub_column, options = extract_and_validate_params_for_real(column_family, keys, columns_and_options, READ_DEFAULTS)
147
+ keys.inject(OrderedHash.new) do |hash, key|
148
+ hash[key] = get(column_family, key)
149
+ hash
150
+ end
151
+ end
152
+
153
+ def remove(column_family, key, *columns_and_options)
154
+ column_family, columns, sub_column, options = extract_and_validate_params_for_real(column_family, key, columns_and_options, WRITE_DEFAULTS)
155
+
156
+ if @batch
157
+ @batch << [:remove, column_family, key, columns, sub_column]
158
+ else
159
+ if columns
160
+ if sub_column
161
+ if columns.is_a? Array
162
+ raise ArgumentError, 'remove does not support sub_columns with array of columns'
163
+ end
164
+
165
+ if cf(column_family)[key][columns]
166
+ cf(column_family)[key][columns].delete(sub_column.to_s)
167
+ end
168
+ else
169
+ if cf(column_family)[key]
170
+ Array(columns).each do |column|
171
+ cf(column_family)[key].delete(column.to_s)
172
+ end
173
+ end
174
+ end
175
+ else
176
+ cf(column_family).delete(key)
177
+ end
178
+ end
179
+ end
180
+
181
+ def get_columns(column_family, key, *columns_and_options)
182
+ column_family, columns, sub_columns, options = extract_and_validate_params_for_real(column_family, key, columns_and_options, READ_DEFAULTS)
183
+ d = get(column_family, key)
184
+
185
+ if sub_columns
186
+ sub_columns.collect do |sub_column|
187
+ d[columns][sub_column]
188
+ end
189
+ else
190
+ columns.collect do |column|
191
+ d[column]
192
+ end
193
+ end
194
+ end
195
+
196
+ def count_columns(column_family, key, *columns_and_options)
197
+ column_family, columns, sub_columns, options = extract_and_validate_params_for_real(column_family, key, columns_and_options, READ_DEFAULTS)
198
+
199
+ get(column_family, key, columns, options).keys.length
200
+ end
201
+
202
+ def multi_get_columns(column_family, keys, columns)
203
+ keys.inject(OrderedHash.new) do |hash, key|
204
+ hash[key] = get_columns(column_family, key, columns)
205
+ hash
206
+ end
207
+ end
208
+
209
+ def multi_count_columns(column_family, keys)
210
+ keys.inject(OrderedHash.new) do |hash, key|
211
+ hash[key] = count_columns(column_family, key)
212
+ hash
213
+ end
214
+ end
215
+
216
+ def get_range(column_family, options = {}, &blk)
217
+ column_family, _, _, options = extract_and_validate_params_for_real(column_family, "", [options],
218
+ READ_DEFAULTS.merge(:start_key => nil,
219
+ :finish_key => nil,
220
+ :key_count => 100,
221
+ :columns => nil,
222
+ :reversed => false
223
+ )
224
+ )
225
+ res = _get_range(column_family,
226
+ options[:start_key],
227
+ options[:finish_key],
228
+ options[:key_count],
229
+ options[:columns],
230
+ options[:start],
231
+ options[:finish],
232
+ options[:count],
233
+ options[:consistency],
234
+ options[:reversed], &blk)
235
+
236
+ if blk.nil?
237
+ res
238
+ else
239
+ nil
240
+ end
241
+ end
242
+
243
+ def get_range_keys(column_family, options = {})
244
+ get_range(column_family,options.merge!(:columns => [])).keys
245
+ end
246
+
247
+ def count_range(column_family, options = {})
248
+ Hash[get_range(column_family, options).select{|k,v| v.length > 0}].keys.compact.length
249
+ end
250
+
251
+ def each_key(column_family, options = {})
252
+ each(column_family, options.merge!(:columns => [])) do |key, value|
253
+ yield key
254
+ end
255
+ end
256
+
257
+ def each(column_family, options = {})
258
+ batch_size = options.delete(:batch_size) || 100
259
+ count = options.delete(:key_count)
260
+ yielded_count = 0
261
+
262
+ options[:start_key] ||= ''
263
+ last_key = nil
264
+
265
+ while options[:start_key] != last_key && (count.nil? || count > yielded_count)
266
+ options[:start_key] = last_key
267
+ res = get_range(column_family, options.merge!(:start_key => last_key, :key_count => batch_size))
268
+ res.each do |key, columns|
269
+ next if options[:start_key] == key
270
+ next if yielded_count == count
271
+ yield key, columns
272
+ yielded_count += 1
273
+ last_key = key
274
+ end
275
+ end
276
+ end
277
+
278
+ def create_index(ks_name, cf_name, c_name, v_class)
279
+ if @indexes[ks_name] &&
280
+ @indexes[ks_name][cf_name] &&
281
+ @indexes[ks_name][cf_name][c_name]
282
+ nil
283
+
284
+ else
285
+ @indexes[ks_name] ||= {}
286
+ @indexes[ks_name][cf_name] ||= {}
287
+ @indexes[ks_name][cf_name][c_name] = true
288
+ end
289
+ end
290
+
291
+ def drop_index(ks_name, cf_name, c_name)
292
+ if @indexes[ks_name] &&
293
+ @indexes[ks_name][cf_name] &&
294
+ @indexes[ks_name][cf_name][c_name]
295
+
296
+ @indexes[ks_name][cf_name].delete(c_name)
297
+ else
298
+ nil
299
+ end
300
+ end
301
+
302
+ def create_index_expression(c_name, value, op)
303
+ {:column_name => c_name, :value => value, :comparison => op}
304
+ end
305
+ alias :create_idx_expr :create_index_expression
306
+
307
+ def create_index_clause(idx_expressions, start = "", count = 100)
308
+ {:start => start, :index_expressions => idx_expressions, :count => count, :type => :index_clause}
309
+ end
310
+ alias :create_idx_clause :create_index_clause
311
+
312
+ def get_indexed_slices(column_family, idx_clause, *columns_and_options)
313
+ column_family, columns, _, options =
314
+ extract_and_validate_params_for_real(column_family, [], columns_and_options,
315
+ READ_DEFAULTS.merge(:key_count => 100, :start_key => nil, :key_start => nil))
316
+
317
+ start_key = options[:start_key] || options[:key_start] || ""
318
+
319
+ unless [Hash, OrderedHash].include?(idx_clause.class) && idx_clause[:type] == :index_clause
320
+ idx_clause = create_index_clause(idx_clause, start_key, options[:key_count])
321
+ end
322
+
323
+ ret = OrderedHash.new
324
+ cf(column_family).each do |key, row|
325
+ next if idx_clause[:start] != '' && key < idx_clause[:start]
326
+ next if ret.length == idx_clause[:count]
327
+
328
+ matches = []
329
+ idx_clause[:index_expressions].each do |expr|
330
+ next if row[expr[:column_name]].nil?
331
+ next unless row[expr[:column_name]].send(expr[:comparison].to_sym, expr[:value])
332
+
333
+ matches << expr
334
+ end
335
+
336
+ ret[key] = row if matches.length == idx_clause[:index_expressions].length
337
+ end
338
+
339
+ ret
340
+ end
341
+
342
+ def add(column_family, key, value, *columns_and_options)
343
+ if @batch
344
+ @batch << [:add, column_family, key, value, *columns_and_options]
345
+ else
346
+ column_family, column, sub_column, options = extract_and_validate_params_for_real(column_family, key, columns_and_options, WRITE_DEFAULTS)
347
+
348
+ if is_super(column_family)
349
+ cf(column_family)[key] ||= OrderedHash.new
350
+ cf(column_family)[key][column] ||= OrderedHash.new
351
+ cf(column_family)[key][column][sub_column] ||= 0
352
+ cf(column_family)[key][column][sub_column] += value
353
+ else
354
+ cf(column_family)[key] ||= OrderedHash.new
355
+ cf(column_family)[key][column] ||= 0
356
+ cf(column_family)[key][column] += value
357
+ end
358
+
359
+ nil
360
+ end
361
+ end
362
+
363
+ def column_families
364
+ cf_defs = {}
365
+ schema.each do |key, value|
366
+ cf_def = Cassandra::ColumnFamily.new
367
+
368
+ value.each do |property, property_value|
369
+ cf_def.send(:"#{property}=", property_value)
370
+ end
371
+
372
+ cf_defs[key] = cf_def
373
+ end
374
+
375
+ cf_defs
376
+ end
377
+
378
+ def schema(load=true)
379
+ @schema
380
+ end
381
+
382
+ def column_family_property(column_family, key)
383
+ schema[column_family.to_s][key]
384
+ end
385
+
386
+ def add_column_family(cf)
387
+ @schema[cf.name.to_s] ||= OrderedHash.new
388
+
389
+ cf.instance_variables.each do |var|
390
+ @schema[cf.name.to_s][var.slice(1..-1)] = cf.instance_variable_get(var)
391
+ end
392
+ end
393
+
394
+ def update_column_family(cf)
395
+ return false unless @schema.include?(cf.name.to_s)
396
+
397
+ cf.instance_variables.each do |var|
398
+ @schema[cf.name.to_s][var.slice(1..-1)] = cf.instance_variable_get(var)
399
+ end
400
+ end
401
+
402
+ def drop_column_family(column_family_name)
403
+ @schema.delete(column_family_name)
404
+ end
405
+
406
+ private
407
+
408
+ def schema_for_keyspace(keyspace)
409
+ @schema
410
+ end
411
+
412
+ def _get_range(column_family, start_key, finish_key, key_count, columns, start, finish, count, consistency, reversed, &blk)
413
+ ret = OrderedHash.new
414
+ start = to_compare_with_type(start, column_family)
415
+ finish = to_compare_with_type(finish, column_family)
416
+ cf(column_family).keys.sort.each do |key|
417
+ break if ret.keys.size >= key_count
418
+ if (start_key.nil? || key >= start_key) && (finish_key.nil? || key <= finish_key)
419
+ if columns
420
+ #ret[key] = columns.inject(OrderedHash.new){|hash, column_name| hash[column_name] = cf(column_family)[key][column_name]; hash;}
421
+ selected_hash = OrderedHash.new
422
+ cf(column_family)[key].each do |k, v|
423
+ selected_hash.[]=(k, v, cf(column_family)[key].timestamps[k]) if columns.include?(k)
424
+ end
425
+ ret[key] = columns_to_hash(column_family, selected_hash)
426
+ ret[key] = apply_count(ret[key], count, reversed)
427
+ blk.call(key,ret[key]) unless blk.nil?
428
+ else
429
+ #ret[key] = apply_range(cf(column_family)[key], column_family, start, finish, !is_super(column_family))
430
+ start, finish = finish, start if reversed
431
+ ret[key] = apply_range(columns_to_hash(column_family, cf(column_family)[key]), column_family, start, finish)
432
+ ret[key] = apply_count(ret[key], count, reversed)
433
+ blk.call(key,ret[key]) unless blk.nil?
434
+ end
435
+ end
436
+ end
437
+ ret
438
+ end
439
+
440
+ def extract_and_validate_params_for_real(column_family, keys, args, options)
441
+ column_family, columns, sub_column, options = extract_and_validate_params(column_family, keys, args, options)
442
+ options[:start] = nil if options[:start] == ''
443
+ options[:finish] = nil if options[:finish] == ''
444
+ [column_family, to_compare_with_types(columns, column_family), to_compare_with_types(sub_column, column_family, false), options]
445
+ end
446
+
447
+ def to_compare_with_types(column_names, column_family, standard=true)
448
+ if column_names.is_a?(Array)
449
+ column_names.collect do |name|
450
+ to_compare_with_type(name, column_family, standard)
451
+ end
452
+ else
453
+ to_compare_with_type(column_names, column_family, standard)
454
+ end
455
+ end
456
+
457
+ def to_compare_with_type(column_name, column_family, standard=true)
458
+ return column_name if column_name.nil?
459
+ klass = if standard
460
+ column_name_class(column_family)
461
+ else
462
+ sub_column_name_class(column_family)
463
+ end
464
+
465
+ klass.new(column_name)
466
+ end
467
+
468
+ def cf(column_family)
469
+ @data[column_family.to_sym] ||= OrderedHash.new
470
+ end
471
+
472
+ def merge_and_sort(old_stuff, new_stuff)
473
+ if new_stuff.is_a?(Array)
474
+ new_stuff = new_stuff.inject({}){|h,k| h[k] = nil; h }
475
+ end
476
+
477
+ new_stuff = new_stuff.to_a.inject({}){|h,k| h[k[0].to_s] = k[1]; h }
478
+
479
+ new_stuff.each { |k,v| old_stuff.[]=(k, v, (Time.now.to_f * 1000000).to_i) }
480
+ hash = OrderedHash.new
481
+ old_stuff.sort{ |a,b| a[0] <=> b[0] }.each do |k, v|
482
+ hash.[]=(k, v, old_stuff.timestamps[k])
483
+ end
484
+ hash
485
+ end
486
+
487
+ def columns_to_hash(column_family, columns)
488
+ column_class, sub_column_class = column_name_class(column_family), sub_column_name_class(column_family)
489
+ output = OrderedHash.new
490
+
491
+ columns.each do |column_name, value|
492
+ timestamp = columns.timestamps[column_name]
493
+ column = column_class.new(column_name)
494
+
495
+ if [Hash, OrderedHash].include?(value.class)
496
+ output[column] ||= OrderedHash.new
497
+ value.each do |sub_column, sub_column_value|
498
+ timestamp = value.timestamps[sub_column]
499
+ output[column].[]=(sub_column_class.new(sub_column), sub_column_value, timestamp)
500
+ end
501
+ else
502
+ output.[]=(column_class.new(column_name), value, timestamp)
503
+ end
504
+ end
505
+
506
+ output
507
+ end
508
+
509
+ def apply_count(row, count, reversed=false)
510
+ if count
511
+ keys = row.keys.sort
512
+ keys = keys.reverse if reversed
513
+ keys = keys[0...count]
514
+ keys.inject(OrderedHash.new) do |memo, key|
515
+ memo.[]=(key, row[key], row.timestamps[key])
516
+ memo
517
+ end
518
+ else
519
+ row
520
+ end
521
+ end
522
+
523
+ def apply_range(row, column_family, strt, fin, standard=true)
524
+ start = to_compare_with_type(strt, column_family, standard)
525
+ finish = to_compare_with_type(fin, column_family, standard)
526
+ ret = OrderedHash.new
527
+ row.keys.each do |key|
528
+ if (start.nil? || key >= start) && (finish.nil? || key <= finish)
529
+ ret.[]=(key, row[key], row.timestamps[key])
530
+ end
531
+ end
532
+ ret
533
+ end
534
+
535
+ end
536
+ end