extendi-cassandra_object 1.0.17 → 1.0.18

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: 2eb80f8a2bc136c5333d17e73df717ed4d2d33f8e28fa31ff30fdf7c8648e645
4
- data.tar.gz: 57c5cb2c0939b8eca99790ac0b7f80a643e04617f31762138aea076a6e868bea
3
+ metadata.gz: 35c334a18f8c02dcc3fa80aedd61b32d750ad798199d4ead39c4fc5948cf6bc8
4
+ data.tar.gz: 5d31df130a07772d2334d0c8dc97d14cfd6dd6e7d2bf3f5369d5d84206698a34
5
5
  SHA512:
6
- metadata.gz: ccdf0d3c0599fd1373d9dc214f5ebd3409acd43b80f27ace5951d5d31fad059bee0f8a78f719b2075fbe472e2639c1d4a7f510ad4570b49fa0e3db6f3fa2be34
7
- data.tar.gz: c61f6366852d7bbff248c80dee0ae620c0b4b087ae4905b45982e255563f8c560fbfbee8d217cbf23292b9ef0c2395a392cb9470f154bb7da17820e32a703c23
6
+ metadata.gz: 4dce7aed3855ebacfef2b79df27b0b598ca3f7caaa144e468560acbf1b823435ed3564ecd12922909fda502f5f2db69562823fd4e304a533a13af5cf9352d339
7
+ data.tar.gz: f78455454cb989f92c9190a6c421570e3cbd402b7aa3613aa18d4a334c038ef65b3dafa054b477c0c5d7e5ddf9c587893cf1a69db4489f2aa6e8050b528efd30
data/.travis.yml CHANGED
@@ -1,20 +1,21 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.4.0
4
- - 2.4.1
5
- - 2.4.2
6
3
  - 2.5.1
4
+ - 2.6.1
7
5
  env:
8
- - CASSANDRA_VERSION=2.1.2
6
+ - SCYLLA_VERSION=3.0.2
9
7
  - CASSANDRA_VERSION=3.0.10
10
8
  - CASSANDRA_VERSION=3.9
11
- - CASSANDRA_VERSION=2.1.2 ACTIVEMODEL_VERSION='< 5'
9
+ - SCYLLA_VERSION=3.0.2 ACTIVEMODEL_VERSION='< 5'
12
10
  - CASSANDRA_VERSION=3.0.10 ACTIVEMODEL_VERSION='< 5'
13
11
  - CASSANDRA_VERSION=3.9 ACTIVEMODEL_VERSION='< 5'
14
12
 
15
13
  jdk:
16
14
  - oraclejdk8
17
15
 
16
+ services:
17
+ - docker
18
+
18
19
  before_install:
19
20
  - sudo apt-get install libjna-java
20
21
  - sudo apt-get install python-support
@@ -23,7 +24,21 @@ before_install:
23
24
  - sudo pip install ccm
24
25
 
25
26
  install:
26
- - ccm create -n 1 -v $CASSANDRA_VERSION -i 127.0.0. -s -b test-cluster
27
- - ccm start
28
- - if [ -n "$ACTIVEMODEL_VERSION" ];then bundle add activemodel --version "$ACTIVEMODEL_VERSION"; fi
29
- - bundle install
27
+ - |
28
+ if [ -n "$CASSANDRA_VERSION" ];then
29
+ ccm create -n 1 -v $CASSANDRA_VERSION -i 127.0.0. -s -b test-cluster;
30
+ ccm start;
31
+ fi
32
+ if [ -n "$SCYLLA_VERSION" ];then
33
+ SCYLLA_IMAGE=scylladb/scylla:$SCYLLA_VERSION
34
+ docker pull $SCYLLA_IMAGE
35
+ docker run --name cassandra_test -d -p "9042:9042" -p "9160:9160" $SCYLLA_IMAGE
36
+ function check_scylla(){ docker exec -it cassandra_test nodetool status | grep UN; }
37
+ until check_scylla; do
38
+ echo "waiting..."
39
+ done
40
+ fi
41
+ if [ -n "$ACTIVEMODEL_VERSION" ];then
42
+ bundle add activemodel --version "$ACTIVEMODEL_VERSION";
43
+ fi
44
+ bundle install
data/README.md CHANGED
@@ -11,22 +11,20 @@ CREATE TABLE keyspace.table (
11
11
  column1 text,
12
12
  value blob,
13
13
  PRIMARY KEY (key, column1)
14
- ) WITH
15
- COMPACT STORAGE
16
- AND CLUSTERING ORDER BY (column1 ASC)
17
- AND bloom_filter_fp_chance = 0.001
18
- AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
14
+ ) WITH bloom_filter_fp_chance = 0.01
15
+ AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
19
16
  AND comment = ''
20
- AND compaction = {'min_sstable_size': '52428800', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
21
- AND compression = {'chunk_length_kb': '64', 'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
22
- AND dclocal_read_repair_chance = 0.0
17
+ AND compaction = {'class': 'SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
18
+ AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
19
+ AND crc_check_chance = 1.0
20
+ AND dclocal_read_repair_chance = 0.1
23
21
  AND default_time_to_live = 0
24
22
  AND gc_grace_seconds = 864000
25
23
  AND max_index_interval = 2048
26
24
  AND memtable_flush_period_in_ms = 0
27
25
  AND min_index_interval = 128
28
- AND read_repair_chance = 1.0
29
- AND speculative_retry = 'NONE';
26
+ AND read_repair_chance = 0.0
27
+ AND speculative_retry = '99.0PERCENTILE';
30
28
  ```
31
29
 
32
30
  You can also use the a custom schema structure with the possible options at [this link](https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlCreateTable.html#tabProp):
@@ -39,20 +37,20 @@ CREATE TABLE keyspace.table (
39
37
  field2 varchar,
40
38
  field3 float,
41
39
  PRIMARY KEY (key)
42
- ) WITH
43
- bloom_filter_fp_chance = 0.001
44
- AND caching = {'keys':'ALL', 'rows_per_partition':'NONE'}'
40
+ ) WITH bloom_filter_fp_chance = 0.01
41
+ AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
45
42
  AND comment = ''
46
- AND compaction = {'min_sstable_size': '52428800', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
47
- AND compression = {'chunk_length_kb': '64', 'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
48
- AND dclocal_read_repair_chance = 0.0
43
+ AND compaction = {'class': 'SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
44
+ AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
45
+ AND crc_check_chance = 1.0
46
+ AND dclocal_read_repair_chance = 0.1
49
47
  AND default_time_to_live = 0
50
48
  AND gc_grace_seconds = 864000
51
49
  AND max_index_interval = 2048
52
50
  AND memtable_flush_period_in_ms = 0
53
51
  AND min_index_interval = 128
54
- AND read_repair_chance = 1.0
55
- AND speculative_retry = 'NONE';
52
+ AND read_repair_chance = 0.0
53
+ AND speculative_retry = '99.0PERCENTILE';
56
54
  ```
57
55
 
58
56
  ## Installation
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'extendi-cassandra_object'
5
- s.version = '1.0.17'
5
+ s.version = '1.0.18'
6
6
  s.description = 'Cassandra ActiveModel'
7
7
  s.summary = 'Cassandra ActiveModel'
8
8
  s.authors = ['Duccio Giovannelli', 'gotime']
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.test_files = `git ls-files -- {test}/*`.split("\n")
18
18
  s.require_paths = ['lib']
19
19
 
20
- s.add_runtime_dependency('activemodel', '<= 5.2')
20
+ s.add_runtime_dependency('activemodel', '>= 4.2.0', '< 6.0.0')
21
21
  s.add_runtime_dependency('cassandra-driver', '>= 3.2.3')
22
22
  s.add_runtime_dependency('lz4-ruby', '>= 0.3.3')
23
23
 
@@ -30,19 +30,24 @@ module CassandraObject
30
30
  str << "ALLOW FILTERING" if @scope.klass.allow_filtering
31
31
  return [] << str.delete_if(&:blank?) * ' '
32
32
  end
33
- @scope.id_values.map do |id|
34
- str = [
35
- "SELECT #{select_string} FROM #{@scope.klass.column_family}",
36
- where_string_async(id)
37
- ]
38
- str << "ALLOW FILTERING" if @scope.klass.allow_filtering
39
- str.delete_if(&:blank?) * ' '
40
- end
33
+
34
+ str = [
35
+ "SELECT #{select_string} FROM #{@scope.klass.column_family}",
36
+ where_string_async(@scope.id_values)
37
+ ]
38
+ str << 'ALLOW FILTERING' if @scope.klass.allow_filtering
39
+ [str.delete_if(&:blank?) * ' ']
41
40
  end
42
41
 
43
- def where_string_async(id)
42
+ def where_string_async(ids)
44
43
  wheres = @scope.where_values.dup.select.each_with_index { |_, i| i.even? }
45
- wheres << "#{@scope._key} = '#{id}'" if !id.nil?
44
+ if ids.present?
45
+ wheres << if ids.size > 1
46
+ "#{@scope._key} IN (#{ids.map { |id| "'#{id}'" }.join(',')})"
47
+ else
48
+ "#{@scope._key} = '#{ids.first}'"
49
+ end
50
+ end
46
51
  "WHERE #{wheres * ' AND '}" if wheres.any?
47
52
  end
48
53
  end
@@ -266,7 +271,7 @@ module CassandraObject
266
271
  AND caching = '{\"keys\":\"ALL\", \"rows_per_partition\":\"NONE\"}'
267
272
  AND comment = ''
268
273
  AND compaction = {'min_sstable_size': '52428800', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
269
- AND compression = {'chunk_length_kb': '64', 'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
274
+ AND compression = {'chunk_length_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
270
275
  AND dclocal_read_repair_chance = 0.0
271
276
  AND default_time_to_live = 0
272
277
  AND gc_grace_seconds = 864000
@@ -276,24 +281,24 @@ module CassandraObject
276
281
  AND read_repair_chance = 1.0
277
282
  AND speculative_retry = 'NONE';"
278
283
  else
279
- "#{stmt} WITH read_repair_chance = 0.0
280
- AND dclocal_read_repair_chance = 0.1
281
- AND gc_grace_seconds = 864000
282
- AND bloom_filter_fp_chance = 0.01
283
- AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' }
284
+ "#{stmt} WITH bloom_filter_fp_chance = 0.01
285
+ AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
284
286
  AND comment = ''
285
- AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 }
286
- AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' }
287
+ AND compaction = {'class': 'SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
288
+ AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
289
+ AND crc_check_chance = 1.0
290
+ AND dclocal_read_repair_chance = 0.1
287
291
  AND default_time_to_live = 0
288
- AND speculative_retry = '99PERCENTILE'
289
- AND min_index_interval = 128
292
+ AND gc_grace_seconds = 864000
290
293
  AND max_index_interval = 2048
291
- AND crc_check_chance = 1.0;
294
+ AND memtable_flush_period_in_ms = 0
295
+ AND min_index_interval = 128
296
+ AND read_repair_chance = 0.0
297
+ AND speculative_retry = '99.0PERCENTILE';
292
298
  "
293
299
  end
294
300
  end
295
301
  end
296
-
297
302
  end
298
303
  end
299
304
  end
@@ -26,34 +26,39 @@ module CassandraObject
26
26
 
27
27
  if @scope.id_values.empty?
28
28
  str = [
29
- "SELECT #{select_string} FROM #{@scope.klass.column_family}",
30
- where_string_async(nil)
29
+ "SELECT #{select_string} FROM #{@scope.klass.column_family}",
30
+ where_string_async(nil)
31
31
  ]
32
32
  str << 'ALLOW FILTERING' if @scope.klass.allow_filtering
33
33
  return [] << str.delete_if(&:blank?) * ' '
34
34
  end
35
- @scope.id_values.map do |id|
36
- str = [
37
- "SELECT #{select_string} FROM #{@scope.klass.column_family}",
38
- where_string_async(id)
39
- ]
40
- str << 'ALLOW FILTERING' if @scope.klass.allow_filtering
41
- str.delete_if(&:blank?) * ' '
42
- end
35
+ str = [
36
+ "SELECT #{select_string} FROM #{@scope.klass.column_family}",
37
+ where_string_async(@scope.id_values)
38
+ ]
39
+ str << 'ALLOW FILTERING' if @scope.klass.allow_filtering
40
+ [str.delete_if(&:blank?) * ' ']
43
41
  end
44
42
 
45
- def where_string_async(id)
43
+ def where_string_async(ids)
46
44
  conditions = []
47
- conditions << "#{@adapter.primary_key_column} = '#{id}'" if !id.nil?
45
+
46
+ if ids.present?
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
52
+ end
53
+
48
54
  select_values = @scope.select_values.select { |sv| sv != :column1 }
49
55
  if select_values.size > 0
50
56
  select_str = select_values.size > 1 ? "column1 IN (#{select_values.map { |sv| '?' }.join(',')})" : 'column1 = ?'
51
57
  conditions << select_str
52
58
  end
53
59
  conditions += @scope.where_values.select.each_with_index { |_, i| i.even? }
54
- return conditions.any? ? "WHERE #{conditions.join(' AND ')}" : nil
60
+ conditions.any? ? "WHERE #{conditions.join(' AND ')}" : nil
55
61
  end
56
-
57
62
  end
58
63
 
59
64
  def primary_key_column
@@ -299,7 +304,7 @@ module CassandraObject
299
304
  AND caching = '{\"keys\":\"ALL\", \"rows_per_partition\":\"NONE\"}'
300
305
  AND comment = ''
301
306
  AND compaction = {'min_sstable_size': '52428800', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
302
- AND compression = {'chunk_length_kb': '64', 'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
307
+ AND compression = {'chunk_length_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
303
308
  AND dclocal_read_repair_chance = 0.0
304
309
  AND default_time_to_live = 0
305
310
  AND gc_grace_seconds = 864000
@@ -309,19 +314,20 @@ module CassandraObject
309
314
  AND read_repair_chance = 1.0
310
315
  AND speculative_retry = 'NONE';"
311
316
  else
312
- "#{stmt} WITH read_repair_chance = 0.0
313
- AND dclocal_read_repair_chance = 0.1
314
- AND gc_grace_seconds = 864000
315
- AND bloom_filter_fp_chance = 0.01
316
- AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' }
317
+ "#{stmt} WITH bloom_filter_fp_chance = 0.01
318
+ AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
317
319
  AND comment = ''
318
- AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 }
319
- AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' }
320
+ AND compaction = {'class': 'SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
321
+ AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
322
+ AND crc_check_chance = 1.0
323
+ AND dclocal_read_repair_chance = 0.1
320
324
  AND default_time_to_live = 0
321
- AND speculative_retry = '99PERCENTILE'
322
- AND min_index_interval = 128
325
+ AND gc_grace_seconds = 864000
323
326
  AND max_index_interval = 2048
324
- AND crc_check_chance = 1.0;
327
+ AND memtable_flush_period_in_ms = 0
328
+ AND min_index_interval = 128
329
+ AND read_repair_chance = 0.0
330
+ AND speculative_retry = '99.0PERCENTILE';
325
331
  "
326
332
 
327
333
  end
@@ -5,9 +5,9 @@ module CassandraObject
5
5
 
6
6
  included do
7
7
  if ActiveModel::VERSION::STRING < '3.2'
8
- attribute_method_suffix("", "=")
8
+ attribute_method_suffix('', '=')
9
9
  else
10
- attribute_method_suffix("=")
10
+ attribute_method_suffix('=')
11
11
  end
12
12
 
13
13
  # (Alias for the protected read_attribute method).
@@ -4,10 +4,10 @@ module CassandraObject
4
4
 
5
5
  included do
6
6
  class_attribute :batch_statements
7
+ attr_accessor :store_updated_at
7
8
  end
8
9
 
9
10
  module ClassMethods
10
-
11
11
  def ttl=(value)
12
12
  @ttl = value
13
13
  end
@@ -15,7 +15,11 @@ module CassandraObject
15
15
 
16
16
  before_update if: :changed? do
17
17
  if self.class.timestamps
18
- self.updated_at = Time.current
18
+ if store_updated_at.present?
19
+ self.updated_at = store_updated_at
20
+ else
21
+ self.updated_at = Time.current
22
+ end
19
23
  end
20
24
  end
21
25
  end
@@ -21,7 +21,30 @@ class CassandraObject::TimestampsTest < CassandraObject::TestCase
21
21
  test 'created_at sets only if nil' do
22
22
  time = 5.days.ago
23
23
  issue = Issue.create created_at: time
24
-
25
24
  assert_equal time, issue.created_at
26
25
  end
26
+
27
+ test 'set updated_at to now when not passed as an attribute' do
28
+ udate = 1.year.ago
29
+ issue = Issue.create(description: 'foo', updated_at: udate)
30
+ assert_equal udate, issue.updated_at
31
+ issue.update_attributes(description: 'test')
32
+ assert_not_equal udate, issue.updated_at
33
+ end
34
+
35
+ test 'set updated_at to passed value' do
36
+ issue = Issue.create(description: 'foo')
37
+ updated_at = issue.updated_at
38
+ new_updated_at = updated_at + 5.days
39
+ issue.update_attributes(description: 'bar', store_updated_at: new_updated_at)
40
+ assert_equal new_updated_at, issue.updated_at
41
+ end
42
+
43
+ test 'set updated_at to passed value even if is equal to the stored value' do
44
+ udate = 1.year.ago
45
+ issue = Issue.create(description: 'foo', updated_at: udate)
46
+ assert_equal udate, issue.updated_at
47
+ issue.update_attributes(description: 'bar', store_updated_at: issue.updated_at)
48
+ assert_equal udate, issue.updated_at
49
+ end
27
50
  end
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.0.17
4
+ version: 1.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Duccio Giovannelli
@@ -9,22 +9,28 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-11-27 00:00:00.000000000 Z
12
+ date: 2019-02-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "<="
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 4.2.0
21
+ - - "<"
19
22
  - !ruby/object:Gem::Version
20
- version: '5.2'
23
+ version: 6.0.0
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
24
27
  requirements:
25
- - - "<="
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: 4.2.0
31
+ - - "<"
26
32
  - !ruby/object:Gem::Version
27
- version: '5.2'
33
+ version: 6.0.0
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: cassandra-driver
30
36
  requirement: !ruby/object:Gem::Requirement
@@ -198,8 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
204
  - !ruby/object:Gem::Version
199
205
  version: 1.3.5
200
206
  requirements: []
201
- rubyforge_project:
202
- rubygems_version: 2.7.6
207
+ rubygems_version: 3.0.2
203
208
  signing_key:
204
209
  specification_version: 4
205
210
  summary: Cassandra ActiveModel