extendi-cassandra_object 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b509a1263a27a71b3d2630122bacca9ee3d368de35642199a684682ebcbd745
4
- data.tar.gz: 7909952a2d8ea54ec11650ec998cf9791a351addc6a07d3ce93ff2057864770b
3
+ metadata.gz: c5523ad43210b62402fbfb637042415f14a7fe174fa3f3646556b1b1e3701df9
4
+ data.tar.gz: a9ed0b2512e264395a1340c2fbccbaf9259d893105c738c9724d2ee0eba2a944
5
5
  SHA512:
6
- metadata.gz: 8b29fb05f1f56287337ae5569a5cbc5468c8c1a999cc34070a1f7c7448915c9f613abd659ef891e7b832f14aef0f6efa17c022e5795b8d85ed686d9122e2bde8
7
- data.tar.gz: 4b86c92a501f97636a4a4e544683fddffcdeeddd27aa6c8395d670438e628100dd5825e2a7a2e542e2f37466010a747d6a9e4f29d8915db5146486260453ab92
6
+ metadata.gz: f038a28315870cef3b0bc1366e3baa46d4098b7a7c3a4733ec02a2a71281861f87a111e9dfbf1d5c9a0c167b8e1e72198662dded4c7a7b90acbd154b5131e305
7
+ data.tar.gz: 58ab0a6d6347d97533334ee017ef8d7f9aaf9890e770d1b2abf3629f7e1b80f0a372241985c7c38e47dc4cebd8a2efa100a5c98384ff6ca17dea6927f976ea76
data/CHANGELOG CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
3
  ## [1.1.0] - 2020-06-18
4
- ### cHANGED
4
+ ### Changed
5
5
  - load_balancing_policy now accept only Cassandra::LoadBalancing::Policies objects
6
+
7
+ ## [1.1.1] - 2020-06-18
8
+ ### Changed
9
+ - add write_consistency on cassandra object config
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Cassandra Object
2
2
  [![Build Status](https://secure.travis-ci.org/giovannelli/cassandra_object.png)](http://travis-ci.org/giovannelli/cassandra_object) [![Code Climate](https://codeclimate.com/github/giovannelli/cassandra_object/badges/gpa.svg)](https://codeclimate.com/github/giovannelli/cassandra_object)
3
3
 
4
- Cassandra Object uses ActiveModel to mimic much of the behavior in ActiveRecord.
4
+ Cassandra Object uses ActiveModel to mimic much of the behavior in ActiveRecord.
5
5
  Use cql3 provided by ruby-driver gem and uses the old thrift structure with the possible option at [this link](https://docs.datastax.com/en/cql/3.1/cql/cql_reference/create_table_r.html?hl=create%2Ctable):
6
6
 
7
7
  ```shell
@@ -118,16 +118,16 @@ You can define a custom configuration for the cassandra connection, allowing you
118
118
  ```ruby
119
119
  class Widget < CassandraObject::BaseSchema
120
120
  string :name
121
-
121
+
122
122
  def self.custom_config
123
- #return custom cassandra configuration
123
+ #return custom cassandra configuration
124
124
  { }
125
125
  end
126
126
  end
127
127
  ```
128
-
128
+
129
129
  ## Using with Cassandra
130
-
130
+
131
131
  Add a config/cassandra.yml:
132
132
 
133
133
  ```yaml
@@ -138,6 +138,7 @@ development:
138
138
  connect_timeout: 0.1,
139
139
  request_timeout: 0.1,
140
140
  consistency: :any/:one/:two/:three/:quorum/:all/:local_quorum/:each_quorum/:serial/:local_serial/:local_one,
141
+ write_consistency: :any/:one/:two/:three/:quorum/:all/:local_quorum/:each_quorum/:serial/:local_serial/:local_one,
141
142
  protocol_version: 3,
142
143
  page_size: 10000,
143
144
  trace: true/false
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'extendi-cassandra_object'
5
- s.version = '1.1.0'
5
+ s.version = '1.1.1'
6
6
  s.description = 'Cassandra ActiveModel'
7
7
  s.summary = 'Cassandra ActiveModel'
8
8
  s.authors = ['Duccio Giovannelli', 'gotime']
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  gem 'cassandra-driver'
2
4
  require 'cassandra'
3
5
  require 'logger'
@@ -6,7 +8,6 @@ module CassandraObject
6
8
  module Adapters
7
9
  class CassandraAdapter < AbstractAdapter
8
10
  class QueryBuilder
9
-
10
11
  def initialize(adapter, scope)
11
12
  @adapter = adapter
12
13
  @scope = scope
@@ -27,7 +28,7 @@ module CassandraObject
27
28
  "SELECT #{select_string} FROM #{@scope.klass.column_family}",
28
29
  where_string_async(nil)
29
30
  ]
30
- str << "ALLOW FILTERING" if @scope.klass.allow_filtering
31
+ str << 'ALLOW FILTERING' if @scope.klass.allow_filtering
31
32
  return [] << str.delete_if(&:blank?) * ' '
32
33
  end
33
34
 
@@ -43,10 +44,10 @@ module CassandraObject
43
44
  wheres = @scope.where_values.dup.select.each_with_index { |_, i| i.even? }
44
45
  if ids.present?
45
46
  wheres << if ids.size > 1
46
- "#{@scope._key} IN (#{ids.map { |id| "'#{id}'" }.join(',')})"
47
- else
48
- "#{@scope._key} = '#{ids.first}'"
49
- end
47
+ "#{@scope._key} IN (#{ids.map { |id| "'#{id}'" }.join(',')})"
48
+ else
49
+ "#{@scope._key} = '#{ids.first}'"
50
+ end
50
51
  end
51
52
  "WHERE #{wheres * ' AND '}" if wheres.any?
52
53
  end
@@ -62,6 +63,7 @@ module CassandraObject
62
63
  :connections_per_local_node,
63
64
  :connections_per_remote_node,
64
65
  :consistency,
66
+ :write_consistency,
65
67
  :credentials,
66
68
  :futures_factory,
67
69
  :hosts,
@@ -94,7 +96,7 @@ module CassandraObject
94
96
  params = cluster_options[policy_key]
95
97
  if params
96
98
  if params.is_a?(Hash)
97
- cluster_options[policy_key] = (class_template % [params[:policy].classify]).constantize.new(*params[:params]||[])
99
+ cluster_options[policy_key] = (class_template % [params[:policy].classify]).constantize.new(*params[:params] || [])
98
100
  else
99
101
  cluster_options[policy_key] = (class_template % [params.classify]).constantize.new
100
102
  end
@@ -106,7 +108,8 @@ module CassandraObject
106
108
  heartbeat_interval: cluster_options.keys.include?(:heartbeat_interval) ? cluster_options[:heartbeat_interval] : 30,
107
109
  idle_timeout: cluster_options[:idle_timeout] || 60,
108
110
  max_schema_agreement_wait: 1,
109
- consistency: cluster_options[:consistency] || :one,
111
+ consistency: cluster_options[:consistency] || :local_one,
112
+ write_consistency: cluster_options[:write_consistency] || cluster_options[:consistency] || :local_one,
110
113
  protocol_version: cluster_options[:protocol_version] || 3,
111
114
  page_size: cluster_options[:page_size] || 10000
112
115
  })
@@ -121,6 +124,8 @@ module CassandraObject
121
124
  end
122
125
 
123
126
  def execute(statement, arguments = [])
127
+ consistency = config[:write_consistency] || config[:consistency]
128
+ # puts "cassandra adapter: #{consistency}"
124
129
  ActiveSupport::Notifications.instrument('cql.cassandra_object', cql: statement) do
125
130
  type_hints = []
126
131
  arguments.each { |a| type_hints << CassandraObject::Types::TypeHelper.guess_type(a) } unless arguments.nil?
@@ -129,6 +134,8 @@ module CassandraObject
129
134
  end
130
135
 
131
136
  def execute_async(queries, arguments = [])
137
+ consistency = config[:consistency]
138
+ # puts "execute_async adapter: #{consistency}"
132
139
  retries = 0
133
140
  futures = queries.map do |q|
134
141
  ActiveSupport::Notifications.instrument('cql.cassandra_object', cql: q) do
@@ -151,8 +158,8 @@ module CassandraObject
151
158
  def select(scope)
152
159
  queries = QueryBuilder.new(self, scope).to_query_async
153
160
  # todo paginate
154
- arguments = scope.where_values.select.each_with_index{ |_, i| i.odd? }.reject{ |c| c.blank? }
155
- cql_rows = execute_async(queries, arguments).map{|item| item.rows.map{|x| x}}.flatten!
161
+ arguments = scope.where_values.select.each_with_index { |_, i| i.odd? }.reject { |c| c.blank? }
162
+ cql_rows = execute_async(queries, arguments).map { |item| item.rows.map { |x| x } }.flatten!
156
163
  cql_rows.each do |cql_row|
157
164
  attributes = cql_row.to_hash
158
165
  key = attributes.delete(scope._key)
@@ -170,31 +177,31 @@ module CassandraObject
170
177
 
171
178
  def write(table, id, attributes, ttl = nil)
172
179
  statement = "INSERT INTO #{table} (#{(attributes.keys).join(',')}) VALUES (#{(['?'] * attributes.size).join(',')})"
173
- statement += " USING TTL #{ttl.to_s}" if ttl.present?
180
+ statement += " USING TTL #{ttl}" if ttl.present?
174
181
  arguments = attributes.values
175
182
  execute(statement, arguments)
176
183
  end
177
184
 
178
185
  def write_update(table, id, attributes)
179
- queries =[]
186
+ queries = []
180
187
  # id here is the name of the key of the model
181
188
  id_value = attributes[id]
182
189
  if (not_nil_attributes = attributes.reject { |key, value| value.nil? }).any?
183
190
  statement = "INSERT INTO #{table} (#{(not_nil_attributes.keys).join(',')}) VALUES (#{(['?'] * not_nil_attributes.size).join(',')})"
184
- queries << {query: statement, arguments: not_nil_attributes.values}
191
+ queries << { query: statement, arguments: not_nil_attributes.values }
185
192
  end
186
193
  if (nil_attributes = attributes.select { |key, value| value.nil? }).any?
187
- queries << {query: "DELETE #{nil_attributes.keys.join(',')} FROM #{table} WHERE #{id} = ?", arguments: [id_value.to_s]}
194
+ queries << { query: "DELETE #{nil_attributes.keys.join(',')} FROM #{table} WHERE #{id} = ?", arguments: [id_value.to_s] }
188
195
  end
189
196
  execute_batchable(queries)
190
197
  end
191
198
 
192
199
  def delete(scope, ids, attributes = {})
193
200
  ids = [ids] if !ids.is_a?(Array)
194
- statement = "DELETE FROM #{scope.column_family} WHERE #{scope._key} IN (#{ids.map{|id| '?'}.join(',')})"
201
+ statement = "DELETE FROM #{scope.column_family} WHERE #{scope._key} IN (#{ids.map { |id| '?' }.join(',')})"
195
202
  arguments = ids
196
203
  unless attributes.blank?
197
- statement += " AND #{attributes.keys.map{ |k| "#{k} = ?" }.join(' AND ')}"
204
+ statement += " AND #{attributes.keys.map { |k| "#{k} = ?" }.join(' AND ')}"
198
205
  arguments += attributes.values
199
206
  end
200
207
  execute(statement, arguments)
@@ -202,20 +209,23 @@ module CassandraObject
202
209
 
203
210
  def delete_single(obj)
204
211
  keys = obj.class._keys
205
- wheres = keys.map{ |k| "#{k} = ?" }.join(' AND ')
206
- arguments = keys.map{ |k| obj.attributes[k] }
212
+ wheres = keys.map { |k| "#{k} = ?" }.join(' AND ')
213
+ arguments = keys.map { |k| obj.attributes[k] }
207
214
  statement = "DELETE FROM #{obj.class.column_family} WHERE #{wheres}"
208
215
  execute(statement, arguments)
209
216
  end
210
217
 
211
218
  def execute_batch(statements)
212
- raise 'No can do' if statements.empty?
219
+ raise 'Statements is empty!' if statements.empty?
220
+ consistency = config[:write_consistency] || config[:consistency]
221
+ # puts "cassandra adapter execute batch #{consistency}"
222
+
213
223
  batch = connection.batch do |b|
214
224
  statements.each do |statement|
215
225
  b.add(statement[:query], arguments: statement[:arguments])
216
226
  end
217
227
  end
218
- connection.execute(batch, page_size: config[:page_size])
228
+ connection.execute(batch, consistency: consistency, page_size: config[:page_size])
219
229
  end
220
230
 
221
231
  # SCHEMA
@@ -244,7 +254,7 @@ module CassandraObject
244
254
  def schema_execute(cql, keyspace)
245
255
  schema_db = Cassandra.cluster cassandra_cluster_options
246
256
  connection = schema_db.connect keyspace
247
- connection.execute cql, consistency: consistency
257
+ connection.execute cql, consistency: config[:write_consistency] || config[:consistency]
248
258
  end
249
259
 
250
260
  def cassandra_version
@@ -253,14 +263,6 @@ module CassandraObject
253
263
 
254
264
  # /SCHEMA
255
265
 
256
- def consistency
257
- defined?(@consistency) ? @consistency : nil
258
- end
259
-
260
- def consistency=(val)
261
- @consistency = val
262
- end
263
-
264
266
  def statement_create_with_options(stmt, options = '')
265
267
  if !options.nil?
266
268
  statement_with_options stmt, options
@@ -45,10 +45,10 @@ module CassandraObject
45
45
 
46
46
  if ids.present?
47
47
  conditions << if ids.size > 1
48
- "#{@adapter.primary_key_column} IN (#{ids.map { |id| "'#{id}'" }.join(',')})"
49
- else
50
- "#{@adapter.primary_key_column} = '#{ids.first}'"
51
- end
48
+ "#{@adapter.primary_key_column} IN (#{ids.map { |id| "'#{id}'" }.join(',')})"
49
+ else
50
+ "#{@adapter.primary_key_column} = '#{ids.first}'"
51
+ end
52
52
  end
53
53
 
54
54
  select_values = @scope.select_values.select { |sv| sv != :column1 }
@@ -75,6 +75,7 @@ module CassandraObject
75
75
  :connections_per_local_node,
76
76
  :connections_per_remote_node,
77
77
  :consistency,
78
+ :write_consistency,
78
79
  :credentials,
79
80
  :futures_factory,
80
81
  :hosts,
@@ -107,7 +108,7 @@ module CassandraObject
107
108
  params = cluster_options[policy_key]
108
109
  if params
109
110
  if params.is_a?(Hash)
110
- cluster_options[policy_key] = (class_template % [params[:policy].classify]).constantize.new(*params[:params]||[])
111
+ cluster_options[policy_key] = (class_template % [params[:policy].classify]).constantize.new(*params[:params] || [])
111
112
  else
112
113
  cluster_options[policy_key] = (class_template % [params.classify]).constantize.new
113
114
  end
@@ -119,7 +120,8 @@ module CassandraObject
119
120
  heartbeat_interval: cluster_options.keys.include?(:heartbeat_interval) ? cluster_options[:heartbeat_interval] : 30,
120
121
  idle_timeout: cluster_options[:idle_timeout] || 60,
121
122
  max_schema_agreement_wait: 1,
122
- consistency: cluster_options[:consistency] || :one,
123
+ consistency: cluster_options[:consistency] || :local_one,
124
+ write_consistency: cluster_options[:write_consistency] || cluster_options[:consistency] || :local_one,
123
125
  protocol_version: cluster_options[:protocol_version] || 3,
124
126
  page_size: cluster_options[:page_size] || 10000
125
127
  })
@@ -134,12 +136,17 @@ module CassandraObject
134
136
  end
135
137
 
136
138
  def execute(statement, arguments = [])
139
+ consistency = config[:write_consistency] || config[:consistency]
140
+ # puts "schemaless adapter: #{consistency}"
137
141
  ActiveSupport::Notifications.instrument('cql.cassandra_object', cql: statement) do
138
142
  connection.execute statement, arguments: arguments, consistency: consistency, page_size: config[:page_size]
139
143
  end
140
144
  end
141
145
 
142
146
  def execute_async(queries, arguments = [], per_page = nil, next_cursor = nil)
147
+ consistency = config[:consistency]
148
+ # puts "schemaless adapter async: #{consistency}"
149
+
143
150
  retries = 0
144
151
  per_page ||= config[:page_size]
145
152
  futures = queries.map { |q|
@@ -169,7 +176,7 @@ module CassandraObject
169
176
  item.rows.each { |x| ids << x[primary_key_column] }
170
177
  new_next_cursor = item.paging_state unless item.last_page?
171
178
  end
172
- return {ids: ids, new_next_cursor: new_next_cursor}
179
+ { ids: ids, new_next_cursor: new_next_cursor }
173
180
  end
174
181
 
175
182
  def select(scope)
@@ -177,19 +184,19 @@ module CassandraObject
177
184
  queries.compact! if queries.present?
178
185
  raise CassandraObject::RecordNotFound if !queries.present?
179
186
 
180
- arguments = scope.select_values.select{ |sv| sv != :column1 }.map(&:to_s)
181
- arguments += scope.where_values.select.each_with_index{ |_, i| i.odd? }.reject{ |c| c.empty? }.map(&:to_s)
187
+ arguments = scope.select_values.select { |sv| sv != :column1 }.map(&:to_s)
188
+ arguments += scope.where_values.select.each_with_index { |_, i| i.odd? }.reject { |c| c.empty? }.map(&:to_s)
182
189
  records = execute_async(queries, arguments).map do |item|
183
190
  # pagination
184
191
  elems = []
185
192
  loop do
186
- item.rows.each{ |x| elems << x }
193
+ item.rows.each { |x| elems << x }
187
194
  break if item.last_page?
188
195
  item = item.next_page
189
196
  end
190
197
  elems
191
198
  end
192
- {results: records.flatten!}
199
+ { results: records.flatten! }
193
200
  end
194
201
 
195
202
  def select_paginated(scope)
@@ -197,15 +204,15 @@ module CassandraObject
197
204
  queries.compact! if queries.present?
198
205
  raise CassandraObject::RecordNotFound if !queries.present?
199
206
 
200
- arguments = scope.select_values.select{ |sv| sv != :column1 }.map(&:to_s)
201
- arguments += scope.where_values.select.each_with_index{ |_, i| i.odd? }.reject{ |c| c.empty? }.map(&:to_s)
207
+ arguments = scope.select_values.select { |sv| sv != :column1 }.map(&:to_s)
208
+ arguments += scope.where_values.select.each_with_index { |_, i| i.odd? }.reject { |c| c.empty? }.map(&:to_s)
202
209
  new_next_cursor = nil
203
210
  records = []
204
211
  execute_async(queries, arguments, scope.limit_value, scope.next_cursor).each do |item|
205
212
  new_next_cursor = item.paging_state unless item.last_page?
206
- item.rows.each{ |x| records << x }
213
+ item.rows.each { |x| records << x }
207
214
  end
208
- {results: records, new_next_cursor: new_next_cursor}
215
+ { results: records, new_next_cursor: new_next_cursor }
209
216
  end
210
217
 
211
218
  def insert(table, id, attributes, ttl = nil)
@@ -218,16 +225,15 @@ module CassandraObject
218
225
 
219
226
  def write(table, id, attributes, ttl)
220
227
  queries = []
221
- # puts attributes
222
228
  attributes.each do |column, value|
223
229
  if !value.nil?
224
230
  query = "INSERT INTO #{table} (#{primary_key_column},column1,value) VALUES (?,?,?)"
225
- query += " USING TTL #{ttl.to_s}" if !ttl.nil?
231
+ query += " USING TTL #{ttl}" if !ttl.nil?
226
232
  args = [id.to_s, column.to_s, value.to_s]
227
233
 
228
- queries << {query: query, arguments: args}
234
+ queries << { query: query, arguments: args }
229
235
  else
230
- queries << {query: "DELETE FROM #{table} WHERE #{primary_key_column} = ? AND column1= ?", arguments: [id.to_s, column.to_s]}
236
+ queries << { query: "DELETE FROM #{table} WHERE #{primary_key_column} = ? AND column1= ?", arguments: [id.to_s, column.to_s] }
231
237
  end
232
238
  end
233
239
  execute_batchable(queries)
@@ -237,18 +243,20 @@ module CassandraObject
237
243
  ids = [ids] if !ids.is_a?(Array)
238
244
  arguments = nil
239
245
  arguments = ids if ids.size == 1
240
- statement = "DELETE FROM #{table} WHERE #{create_ids_where_clause(ids)}" #.gsub('?', ids.map { |id| "'#{id}'" }.join(','))
246
+ statement = "DELETE FROM #{table} WHERE #{create_ids_where_clause(ids)}" # .gsub('?', ids.map { |id| "'#{id}'" }.join(','))
241
247
  execute(statement, arguments)
242
248
  end
243
249
 
244
250
  def execute_batch(statements)
245
- raise 'No can do' if statements.empty?
251
+ consistency = config[:write_consistency] || config[:consistency]
252
+ # puts "schemaless execute batch #{consistency}"
253
+ raise 'Statements is empty!' if statements.empty?
246
254
  batch = connection.batch do |b|
247
255
  statements.each do |statement|
248
256
  b.add(statement[:query], arguments: statement[:arguments])
249
257
  end
250
258
  end
251
- connection.execute(batch, page_size: config[:page_size])
259
+ connection.execute(batch, consistency: consistency, page_size: config[:page_size])
252
260
  end
253
261
 
254
262
  # SCHEMA
@@ -275,7 +283,7 @@ module CassandraObject
275
283
  def schema_execute(cql, keyspace)
276
284
  schema_db = Cassandra.cluster cassandra_cluster_options
277
285
  connection = schema_db.connect keyspace
278
- connection.execute cql, consistency: consistency
286
+ connection.execute cql, consistency: config[:write_consistency] || config[:consistency]
279
287
  end
280
288
 
281
289
  def cassandra_version
@@ -284,14 +292,6 @@ module CassandraObject
284
292
 
285
293
  # /SCHEMA
286
294
 
287
- def consistency
288
- defined?(@consistency) ? @consistency : nil
289
- end
290
-
291
- def consistency=(val)
292
- @consistency = val
293
- end
294
-
295
295
  def statement_create_with_options(stmt, options)
296
296
  if !options.nil?
297
297
  statement_with_options stmt, options
@@ -338,9 +338,8 @@ module CassandraObject
338
338
  return ids if ids.empty?
339
339
  ids = ids.first if ids.is_a?(Array) && ids.one?
340
340
  sql = ids.is_a?(Array) ? "#{primary_key_column} IN (#{ids.map { |id| "'#{id}'" }.join(',')})" : "#{primary_key_column} = ?"
341
- return sql
341
+ sql
342
342
  end
343
-
344
343
  end
345
344
  end
346
345
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module CassandraObject
2
4
  class Scope
3
5
  module FinderMethods
@@ -16,60 +18,60 @@ module CassandraObject
16
18
  end
17
19
 
18
20
  def find_in_batches(id, next_cursor = nil)
19
- obj = self.clone
21
+ obj = clone
20
22
  obj.is_all = true
21
23
  obj.next_cursor = next_cursor
22
24
  obj.where_ids(id).execute_paged
23
25
  end
24
26
 
25
27
  def find_all_in_batches(next_cursor = nil)
26
- obj = self.clone
28
+ obj = clone
27
29
  obj.is_all = true
28
30
  obj.next_cursor = next_cursor
29
31
  obj.execute
30
32
  end
31
33
 
32
34
  def first
33
- return limit(1).find_all_in_batches[:results].first if self.schema_type == :dynamic_attributes || self.schema_type == :schemaless
35
+ return limit(1).find_all_in_batches[:results].first if schema_type == :dynamic_attributes || schema_type == :schemaless
34
36
  limit(1).execute.first
35
37
  end
36
38
 
37
39
  private
38
40
 
39
- def find_one(id)
40
- if id.blank?
41
- not_found(id)
42
- elsif self.schema_type == :dynamic_attributes
43
- record = where_ids(id).execute
44
- not_found(id) if record.empty?
45
- record
46
- elsif record = where_ids(id)[0]
47
- record
48
- else
49
- not_found(id)
41
+ def find_one(id)
42
+ if id.blank?
43
+ not_found(id)
44
+ elsif schema_type == :dynamic_attributes
45
+ record = where_ids(id).execute
46
+ not_found(id) if record.empty?
47
+ record
48
+ elsif record = where_ids(id)[0]
49
+ record
50
+ else
51
+ not_found(id)
52
+ end
50
53
  end
51
- end
52
54
 
53
- def find_some(pids)
54
- ids = pids.flatten.compact.uniq.map(&:to_s)
55
- return [] if ids.empty?
55
+ def find_some(pids)
56
+ ids = pids.flatten.compact.uniq.map(&:to_s)
57
+ return [] if ids.empty?
56
58
 
57
- qr = where_ids(ids).execute
58
- is_dymnamic = qr.is_a?(Hash)
59
+ qr = where_ids(ids).execute
60
+ is_dymnamic = qr.is_a?(Hash)
59
61
 
60
- results = qr.sort_by do |r|
61
- id = r.keys.first if r.is_a?(Hash)
62
- id = r[0] if r.is_a?(Array)
63
- id = r.id if id.nil?
64
- ids.index(id)
65
- end
62
+ results = qr.sort_by do |r|
63
+ id = r.keys.first if r.is_a?(Hash)
64
+ id = r[0] if r.is_a?(Array)
65
+ id = r.id if id.nil?
66
+ ids.index(id)
67
+ end
66
68
 
67
- is_dymnamic ? Hash[results] : results
68
- end
69
+ is_dymnamic ? Hash[results] : results
70
+ end
69
71
 
70
- def not_found(id)
71
- raise CassandraObject::RecordNotFound, "Couldn't find #{name} with key #{id.inspect}"
72
- end
72
+ def not_found(id)
73
+ raise CassandraObject::RecordNotFound, "Couldn't find #{name} with key #{id.inspect}"
74
+ end
73
75
  end
74
76
  end
75
77
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module CassandraObject
2
4
  module Scoping
3
5
  extend ActiveSupport::Concern
@@ -38,9 +38,6 @@ CassandraObject::Schemaless.create_column_family 'IssueDynamics'
38
38
  CassandraObject::Schemaless.create_column_family 'IssuesCustomConfig'
39
39
  CassandraObject::Schema.create_column_family 'IssueSchemaFathers', { attributes: 'id text, title text, field float, created_at timestamp, updated_at timestamp, PRIMARY KEY (id)', options: {} }
40
40
  CassandraObject::Schema.create_column_family 'IssueSchemaChildren', { attributes: 'id text, title text, description text, field float, created_at timestamp, updated_at timestamp, issue_schema_father_id text, PRIMARY KEY (id)', options: {} }
41
- CassandraObject::BaseSchemaless.adapter.consistency = :quorum
42
- CassandraObject::BaseSchemalessDynamic.adapter.consistency = :quorum
43
- CassandraObject::BaseSchema.adapter.consistency = :quorum
44
41
 
45
42
  CassandraObject::Base.class_eval do
46
43
  class_attribute :created_records
@@ -16,8 +16,6 @@ class CassandraObject::ConnectionsTest < CassandraObject::TestCase
16
16
  threads = []
17
17
 
18
18
  (0..10).collect do |i|
19
-
20
- # puts "spawn thread #{i}"
21
19
  thr = Thread.new do
22
20
  begin
23
21
  IssueSchema.find(ids)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: extendi-cassandra_object
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Duccio Giovannelli