superstore 1.2.0 → 2.0.0

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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -13
  3. data/CHANGELOG.md +16 -0
  4. data/Gemfile +0 -5
  5. data/README.md +15 -33
  6. data/lib/superstore/adapters/jsonb_adapter.rb +245 -0
  7. data/lib/superstore/associations/association.rb +38 -0
  8. data/lib/superstore/associations/belongs_to.rb +35 -0
  9. data/lib/superstore/associations/builder/association.rb +38 -0
  10. data/lib/superstore/associations/builder/belongs_to.rb +7 -0
  11. data/lib/superstore/associations/builder/has_many.rb +7 -0
  12. data/lib/superstore/associations/builder/has_one.rb +7 -0
  13. data/lib/superstore/associations/has_many.rb +26 -0
  14. data/lib/superstore/associations/has_one.rb +24 -0
  15. data/lib/superstore/associations/reflection.rb +65 -0
  16. data/lib/superstore/associations.rb +72 -0
  17. data/lib/superstore/attribute_methods/definition.rb +5 -10
  18. data/lib/superstore/attribute_methods/dirty.rb +12 -2
  19. data/lib/superstore/attribute_methods/typecasting.rb +6 -12
  20. data/lib/superstore/base.rb +3 -4
  21. data/lib/superstore/connection.rb +3 -5
  22. data/lib/superstore/core.rb +0 -5
  23. data/lib/superstore/model.rb +32 -33
  24. data/lib/superstore/persistence.rb +4 -10
  25. data/lib/superstore/railtie.rb +2 -20
  26. data/lib/superstore/scope/batches.rb +17 -22
  27. data/lib/superstore/scope/finder_methods.rb +33 -35
  28. data/lib/superstore/scope/query_methods.rb +38 -44
  29. data/lib/superstore/scope.rb +24 -0
  30. data/lib/superstore/type.rb +3 -3
  31. data/lib/superstore/types/array_type.rb +2 -9
  32. data/lib/superstore/types/base_type.rb +4 -7
  33. data/lib/superstore/types/boolean_type.rb +2 -1
  34. data/lib/superstore/types/float_type.rb +6 -5
  35. data/lib/superstore/types/integer_type.rb +3 -3
  36. data/lib/superstore/types/json_type.rb +0 -21
  37. data/lib/superstore.rb +16 -5
  38. data/superstore.gemspec +2 -1
  39. data/test/support/jsonb.rb +8 -0
  40. data/test/support/{issue.rb → models.rb} +9 -0
  41. data/test/support/pg.rb +11 -15
  42. data/test/test_helper.rb +7 -6
  43. data/test/unit/{belongs_to_test.rb → associations/belongs_to_test.rb} +1 -10
  44. data/test/unit/associations/has_many_test.rb +13 -0
  45. data/test/unit/associations/has_one_test.rb +14 -0
  46. data/test/unit/{belongs_to → associations}/reflection_test.rb +2 -2
  47. data/test/unit/attribute_methods/definition_test.rb +6 -3
  48. data/test/unit/attribute_methods/dirty_test.rb +17 -14
  49. data/test/unit/attribute_methods/typecasting_test.rb +0 -14
  50. data/test/unit/base_test.rb +3 -3
  51. data/test/unit/connection_test.rb +0 -4
  52. data/test/unit/persistence_test.rb +4 -4
  53. data/test/unit/schema_test.rb +9 -17
  54. data/test/unit/scope/query_methods_test.rb +10 -1
  55. data/test/unit/types/array_type_test.rb +12 -10
  56. data/test/unit/types/base_type_test.rb +2 -10
  57. data/test/unit/types/boolean_type_test.rb +15 -13
  58. data/test/unit/types/date_type_test.rb +3 -3
  59. data/test/unit/types/float_type_test.rb +14 -7
  60. data/test/unit/types/integer_type_test.rb +11 -9
  61. data/test/unit/types/json_type_test.rb +0 -23
  62. data/test/unit/types/string_type_test.rb +6 -6
  63. data/test/unit/types/time_type_test.rb +7 -7
  64. metadata +35 -26
  65. data/CHANGELOG +0 -0
  66. data/lib/superstore/adapters/cassandra_adapter.rb +0 -203
  67. data/lib/superstore/adapters/hstore_adapter.rb +0 -170
  68. data/lib/superstore/belongs_to/association.rb +0 -65
  69. data/lib/superstore/belongs_to/builder.rb +0 -40
  70. data/lib/superstore/belongs_to/reflection.rb +0 -38
  71. data/lib/superstore/belongs_to.rb +0 -63
  72. data/lib/superstore/cassandra_schema/statements.rb +0 -52
  73. data/lib/superstore/cassandra_schema/tasks.rb +0 -47
  74. data/lib/superstore/cassandra_schema.rb +0 -9
  75. data/lib/superstore/log_subscriber.rb +0 -44
  76. data/lib/superstore/railties/controller_runtime.rb +0 -45
  77. data/lib/superstore/tasks/ks.rake +0 -59
  78. data/test/support/cassandra.rb +0 -46
  79. data/test/support/hstore.rb +0 -24
  80. data/test/support/user.rb +0 -2
  81. data/test/unit/cassandra_schema/statements_test.rb +0 -47
  82. data/test/unit/cassandra_schema/tasks_test.rb +0 -31
  83. data/test/unit/log_subscriber_test.rb +0 -26
  84. data/test/unit/railties/controller_runtime_test.rb +0 -48
@@ -1,24 +1,26 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class Superstore::Types::BooleanTypeTest < Superstore::Types::TestCase
4
- test 'encode' do
5
- assert_equal '1', coder.encode(true)
6
- assert_equal '1', coder.encode('true')
7
- assert_equal '1', coder.encode('1')
4
+ if Superstore::Base.adapter.class.name == 'Superstore::Adapters::CassandraAdapter'
5
+ test 'encode' do
6
+ assert_equal '1', type.encode(true)
7
+ assert_equal '1', type.encode('true')
8
+ assert_equal '1', type.encode('1')
8
9
 
9
- assert_equal '0', coder.encode(false)
10
- assert_equal '0', coder.encode('false')
11
- assert_equal '0', coder.encode('0')
12
- assert_equal '0', coder.encode('')
10
+ assert_equal '0', type.encode(false)
11
+ assert_equal '0', type.encode('false')
12
+ assert_equal '0', type.encode('0')
13
+ assert_equal '0', type.encode('')
13
14
 
14
- assert_raise ArgumentError do
15
- coder.encode('wtf')
15
+ assert_raise ArgumentError do
16
+ type.encode('wtf')
17
+ end
16
18
  end
17
19
  end
18
20
 
19
21
  test 'decode' do
20
- assert_equal true, coder.decode('1')
21
- assert_equal false, coder.decode('0')
22
- # assert_nil coder.decode(nil)
22
+ assert_equal true, type.decode('1')
23
+ assert_equal false, type.decode('0')
24
+ # assert_nil type.decode(nil)
23
25
  end
24
26
  end
@@ -2,14 +2,14 @@ require 'test_helper'
2
2
 
3
3
  class Superstore::Types::DateTypeTest < Superstore::Types::TestCase
4
4
  test 'encode' do
5
- assert_equal '2004-04-25', coder.encode(Date.new(2004, 4, 25))
5
+ assert_equal '2004-04-25', type.encode(Date.new(2004, 4, 25))
6
6
  end
7
7
 
8
8
  test 'decode' do
9
- assert_equal Date.new(2004, 4, 25), coder.decode('2004-04-25')
9
+ assert_equal Date.new(2004, 4, 25), type.decode('2004-04-25')
10
10
  end
11
11
 
12
12
  test 'decoding a blank dates' do
13
- assert_nil coder.decode('')
13
+ assert_nil type.decode('')
14
14
  end
15
15
  end
@@ -1,17 +1,24 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class Superstore::Types::FloatTypeTest < Superstore::Types::TestCase
4
- test 'encode' do
5
- assert_equal '5.01', coder.encode(5.01)
4
+ if Superstore::Base.adapter.class.name == 'Superstore::Adapters::CassandraAdapter'
5
+ test 'encode' do
6
+ assert_equal '5.01', type.encode(5.01)
6
7
 
7
- assert_raise ArgumentError do
8
- coder.encode('x')
8
+ assert_raise ArgumentError do
9
+ type.encode('x')
10
+ end
9
11
  end
10
12
  end
11
13
 
12
14
  test 'decode' do
13
- assert_equal 0.0, coder.decode('xyz')
14
- assert_equal 3.14, coder.decode('3.14')
15
- assert_equal 5, coder.decode('5')
15
+ assert_equal 0.0, type.decode('xyz')
16
+ assert_equal 3.14, type.decode('3.14')
17
+ assert_equal 5, type.decode('5')
18
+ end
19
+
20
+ test 'typecast' do
21
+ assert_equal 1.1, type.typecast('1.1')
22
+ assert_equal 42.0, type.typecast(42)
16
23
  end
17
24
  end
@@ -1,19 +1,21 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class Superstore::Types::IntegerTypeTest < Superstore::Types::TestCase
4
- test 'encode' do
5
- assert_equal '3', coder.encode(3)
6
- assert_equal '-3', coder.encode(-3)
4
+ if Superstore::Base.adapter.class.name == 'Superstore::Adapters::CassandraAdapter'
5
+ test 'encode' do
6
+ assert_equal '3', type.encode(3)
7
+ assert_equal '-3', type.encode(-3)
7
8
 
8
- assert_raise ArgumentError do
9
- coder.encode('xx')
9
+ assert_raise ArgumentError do
10
+ type.encode('xx')
11
+ end
10
12
  end
11
13
  end
12
14
 
13
15
  test 'decode' do
14
- assert_nil coder.decode('')
15
- assert_equal 0, coder.decode('abc')
16
- assert_equal 3, coder.decode('3')
17
- assert_equal -3, coder.decode('-3')
16
+ assert_nil type.decode('')
17
+ assert_equal 0, type.decode('abc')
18
+ assert_equal 3, type.decode('3')
19
+ assert_equal -3, type.decode('-3')
18
20
  end
19
21
  end
@@ -1,27 +1,4 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class Superstore::Types::JsonTypeTest < Superstore::Types::TestCase
4
- test 'encode' do
5
- assert_equal({a: 'b'}.to_json, coder.encode(a: 'b'))
6
- assert_equal '-3', coder.encode(-3)
7
- end
8
-
9
- test 'decode' do
10
- assert_equal({'a' => 'b'}, coder.decode({'a' => 'b'}.to_json))
11
- end
12
-
13
- test 'encode array' do
14
- assert_equal(['a', 'b'].to_json, coder.encode(['a', 'b']))
15
- assert_equal '-3', coder.encode(-3)
16
- end
17
-
18
- test 'decode array' do
19
- assert_equal(['a', 'b'], coder.decode(['a', 'b'].to_json))
20
- end
21
-
22
- test 'typecast' do
23
- assert_equal({'enabled' => false}, coder.typecast('enabled' => false))
24
- assert_equal({'born_at' => "2004-12-24T00:00:00.000Z"}, coder.typecast('born_at' => Time.utc(2004, 12, 24)))
25
- assert_equal(["2004-12-24T00:00:00.000Z"], coder.typecast([Time.utc(2004, 12, 24)]))
26
- end
27
4
  end
@@ -2,29 +2,29 @@ require 'test_helper'
2
2
 
3
3
  class Superstore::Types::StringTypeTest < Superstore::Types::TestCase
4
4
  test 'encode' do
5
- assert_equal 'abc', coder.encode('abc')
5
+ assert_equal 'abc', type.encode('abc')
6
6
 
7
7
  assert_raise ArgumentError do
8
- coder.encode(123)
8
+ type.encode(123)
9
9
  end
10
10
  end
11
11
 
12
12
  test 'encode as utf' do
13
13
  assert_equal(
14
14
  '123'.force_encoding('UTF-8').encoding,
15
- coder.encode('123'.force_encoding('ASCII-8BIT')).encoding
15
+ type.encode('123'.force_encoding('ASCII-8BIT')).encoding
16
16
  )
17
17
  end
18
18
 
19
19
  test 'encode frozen as utf' do
20
20
  assert_equal(
21
21
  '123'.force_encoding('UTF-8').encoding,
22
- coder.encode('123'.force_encoding('ASCII-8BIT').freeze).encoding
22
+ type.encode('123'.force_encoding('ASCII-8BIT').freeze).encoding
23
23
  )
24
24
  end
25
25
 
26
26
  test 'typecast' do
27
- assert_equal '123', coder.typecast(123)
28
- assert_equal '123', coder.typecast('123')
27
+ assert_equal '123', type.typecast(123)
28
+ assert_equal '123', type.typecast('123')
29
29
  end
30
30
  end
@@ -2,20 +2,20 @@ require 'test_helper'
2
2
 
3
3
  class Superstore::Types::TimeTypeTest < Superstore::Types::TestCase
4
4
  test 'encode' do
5
- assert_equal '2004-12-24T01:02:03.000000Z', coder.encode(Time.utc(2004, 12, 24, 1, 2, 3))
6
- assert_equal '2004-12-24T01:02:03.000000Z', coder.encode(DateTime.new(2004, 12, 24, 1, 2, 3))
5
+ assert_equal '2004-12-24T01:02:03.000000Z', type.encode(Time.utc(2004, 12, 24, 1, 2, 3))
6
+ assert_equal '2004-12-24T01:02:03.000000Z', type.encode(DateTime.new(2004, 12, 24, 1, 2, 3))
7
7
  assert_raise ArgumentError do
8
- coder.encode 123
8
+ type.encode 123
9
9
  end
10
10
  end
11
11
 
12
12
  test 'decode' do
13
- assert_nil coder.decode(nil)
14
- assert_nil coder.decode('bad format')
15
- assert_equal Time.utc(2004, 12, 24, 1, 2, 3), coder.decode('2004-12-24T01:02:03.000000Z')
13
+ assert_nil type.decode(nil)
14
+ assert_nil type.decode('bad format')
15
+ assert_equal Time.utc(2004, 12, 24, 1, 2, 3), type.decode('2004-12-24T01:02:03.000000Z')
16
16
 
17
17
  Time.use_zone 'Central Time (US & Canada)' do
18
- with_zone = coder.decode('2013-07-18 13:12:46 -0700')
18
+ with_zone = type.decode('2013-07-18 13:12:46 -0700')
19
19
  assert_equal Time.utc(2013, 07, 18, 20, 12, 46), with_zone
20
20
  assert_equal 'CDT', with_zone.zone
21
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: superstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Koziarski
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-03-13 00:00:00.000000000 Z
12
+ date: 2015-12-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: oj
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: bundler
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -62,7 +76,7 @@ extra_rdoc_files:
62
76
  files:
63
77
  - ".gitignore"
64
78
  - ".travis.yml"
65
- - CHANGELOG
79
+ - CHANGELOG.md
66
80
  - Gemfile
67
81
  - LICENSE
68
82
  - MIT-LICENSE
@@ -70,40 +84,39 @@ files:
70
84
  - Rakefile
71
85
  - lib/superstore.rb
72
86
  - lib/superstore/adapters/abstract_adapter.rb
73
- - lib/superstore/adapters/cassandra_adapter.rb
74
- - lib/superstore/adapters/hstore_adapter.rb
87
+ - lib/superstore/adapters/jsonb_adapter.rb
88
+ - lib/superstore/associations.rb
89
+ - lib/superstore/associations/association.rb
90
+ - lib/superstore/associations/belongs_to.rb
91
+ - lib/superstore/associations/builder/association.rb
92
+ - lib/superstore/associations/builder/belongs_to.rb
93
+ - lib/superstore/associations/builder/has_many.rb
94
+ - lib/superstore/associations/builder/has_one.rb
95
+ - lib/superstore/associations/has_many.rb
96
+ - lib/superstore/associations/has_one.rb
97
+ - lib/superstore/associations/reflection.rb
75
98
  - lib/superstore/attribute_methods.rb
76
99
  - lib/superstore/attribute_methods/definition.rb
77
100
  - lib/superstore/attribute_methods/dirty.rb
78
101
  - lib/superstore/attribute_methods/primary_key.rb
79
102
  - lib/superstore/attribute_methods/typecasting.rb
80
103
  - lib/superstore/base.rb
81
- - lib/superstore/belongs_to.rb
82
- - lib/superstore/belongs_to/association.rb
83
- - lib/superstore/belongs_to/builder.rb
84
- - lib/superstore/belongs_to/reflection.rb
85
104
  - lib/superstore/caching.rb
86
105
  - lib/superstore/callbacks.rb
87
- - lib/superstore/cassandra_schema.rb
88
- - lib/superstore/cassandra_schema/statements.rb
89
- - lib/superstore/cassandra_schema/tasks.rb
90
106
  - lib/superstore/connection.rb
91
107
  - lib/superstore/core.rb
92
108
  - lib/superstore/errors.rb
93
109
  - lib/superstore/identity.rb
94
110
  - lib/superstore/inspect.rb
95
- - lib/superstore/log_subscriber.rb
96
111
  - lib/superstore/model.rb
97
112
  - lib/superstore/persistence.rb
98
113
  - lib/superstore/railtie.rb
99
- - lib/superstore/railties/controller_runtime.rb
100
114
  - lib/superstore/schema.rb
101
115
  - lib/superstore/scope.rb
102
116
  - lib/superstore/scope/batches.rb
103
117
  - lib/superstore/scope/finder_methods.rb
104
118
  - lib/superstore/scope/query_methods.rb
105
119
  - lib/superstore/scoping.rb
106
- - lib/superstore/tasks/ks.rake
107
120
  - lib/superstore/timestamps.rb
108
121
  - lib/superstore/type.rb
109
122
  - lib/superstore/types.rb
@@ -118,33 +131,29 @@ files:
118
131
  - lib/superstore/types/time_type.rb
119
132
  - lib/superstore/validations.rb
120
133
  - superstore.gemspec
121
- - test/support/cassandra.rb
122
- - test/support/hstore.rb
123
- - test/support/issue.rb
134
+ - test/support/jsonb.rb
135
+ - test/support/models.rb
124
136
  - test/support/pg.rb
125
- - test/support/user.rb
126
137
  - test/test_helper.rb
127
138
  - test/unit/active_model_test.rb
128
139
  - test/unit/adapters/adapter_test.rb
140
+ - test/unit/associations/belongs_to_test.rb
141
+ - test/unit/associations/has_many_test.rb
142
+ - test/unit/associations/has_one_test.rb
143
+ - test/unit/associations/reflection_test.rb
129
144
  - test/unit/attribute_methods/definition_test.rb
130
145
  - test/unit/attribute_methods/dirty_test.rb
131
146
  - test/unit/attribute_methods/primary_key_test.rb
132
147
  - test/unit/attribute_methods/typecasting_test.rb
133
148
  - test/unit/attribute_methods_test.rb
134
149
  - test/unit/base_test.rb
135
- - test/unit/belongs_to/reflection_test.rb
136
- - test/unit/belongs_to_test.rb
137
150
  - test/unit/caching_test.rb
138
151
  - test/unit/callbacks_test.rb
139
- - test/unit/cassandra_schema/statements_test.rb
140
- - test/unit/cassandra_schema/tasks_test.rb
141
152
  - test/unit/connection_test.rb
142
153
  - test/unit/core_test.rb
143
154
  - test/unit/identity_test.rb
144
155
  - test/unit/inspect_test.rb
145
- - test/unit/log_subscriber_test.rb
146
156
  - test/unit/persistence_test.rb
147
- - test/unit/railties/controller_runtime_test.rb
148
157
  - test/unit/schema_test.rb
149
158
  - test/unit/scope/batches_test.rb
150
159
  - test/unit/scope/finder_methods_test.rb
@@ -181,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
190
  version: 1.3.5
182
191
  requirements: []
183
192
  rubyforge_project:
184
- rubygems_version: 2.4.5
193
+ rubygems_version: 2.4.8
185
194
  signing_key:
186
195
  specification_version: 4
187
196
  summary: Cassandra ActiveModel
data/CHANGELOG DELETED
File without changes
@@ -1,203 +0,0 @@
1
- gem 'cassandra-cql'
2
- require 'cassandra-cql'
3
-
4
- module Superstore
5
- module Adapters
6
- class CassandraAdapter < AbstractAdapter
7
- class QueryBuilder
8
- def initialize(adapter, scope)
9
- @adapter = adapter
10
- @scope = scope
11
- end
12
-
13
- def to_query
14
- [
15
- "SELECT #{select_string} FROM #{@scope.klass.table_name}",
16
- @adapter.write_option_string,
17
- where_string,
18
- limit_string
19
- ].delete_if(&:blank?) * ' '
20
- end
21
-
22
- def select_string
23
- if @scope.select_values.any?
24
- (['KEY'] | @scope.select_values) * ','
25
- else
26
- '*'
27
- end
28
- end
29
-
30
- def where_string
31
- wheres = @scope.where_values.dup
32
- if @scope.id_values.any?
33
- wheres << @adapter.create_ids_where_clause(@scope.id_values)
34
- end
35
-
36
- if wheres.any?
37
- "WHERE #{wheres * ' AND '}"
38
- end
39
- end
40
-
41
- def limit_string
42
- if @scope.limit_value
43
- "LIMIT #{@scope.limit_value}"
44
- else
45
- ""
46
- end
47
- end
48
- end
49
-
50
- def primary_key_column
51
- 'KEY'
52
- end
53
-
54
- def connection
55
- @connection ||= begin
56
- thrift_options = (config[:thrift] || {})
57
- CassandraCQL::Database.new(
58
- servers,
59
- {keyspace: config[:keyspace], username: username, password: password, cql_version: '2.0.0'},
60
- thrift_options)
61
- end
62
- end
63
-
64
- def servers
65
- @servers ||= begin
66
- if config[:servers].is_a?(String)
67
- config[:servers].split(',')
68
- elsif config[:servers].is_a?(Array)
69
- config[:servers]
70
- else
71
- "127.0.0.1:9160"
72
- end
73
- end
74
- end
75
-
76
- def execute(statement)
77
- ActiveSupport::Notifications.instrument("cql.cassandra_object", cql: statement) do
78
- connection.execute statement
79
- end
80
- end
81
-
82
- def select(scope)
83
- statement = QueryBuilder.new(self, scope).to_query
84
-
85
- execute(statement).fetch do |cql_row|
86
- attributes = cql_row.to_hash
87
- key = attributes.delete(primary_key_column)
88
- yield(key, attributes) unless attributes.empty?
89
- end
90
- end
91
-
92
- def insert(table, id, attributes)
93
- write(table, id, attributes)
94
- end
95
-
96
- def update(table, id, attributes)
97
- write(table, id, attributes)
98
- end
99
-
100
- def write(table, id, attributes)
101
- if (not_nil_attributes = attributes.reject { |key, value| value.nil? }).any?
102
- insert_attributes = {primary_key_column => id}.update(not_nil_attributes)
103
- statement = "INSERT INTO #{table} (#{quote_columns(insert_attributes.keys) * ','}) VALUES (#{Array.new(insert_attributes.size, '?') * ','})#{write_option_string}"
104
- execute_batchable sanitize(statement, *insert_attributes.values)
105
- end
106
-
107
- if (nil_attributes = attributes.select { |key, value| value.nil? }).any?
108
- execute_batchable sanitize("DELETE #{quote_columns(nil_attributes.keys) * ','} FROM #{table}#{write_option_string} WHERE #{primary_key_column} = ?", id)
109
- end
110
- end
111
-
112
- def delete(table, ids)
113
- statement = "DELETE FROM #{table}#{write_option_string} WHERE #{create_ids_where_clause(ids)}"
114
-
115
- execute_batchable statement
116
- end
117
-
118
- def execute_batch(statements)
119
- raise 'No can do' if statements.empty?
120
-
121
- stmt = [
122
- "BEGIN BATCH#{write_option_string(true)}",
123
- statements * "\n",
124
- 'APPLY BATCH'
125
- ] * "\n"
126
-
127
- execute stmt
128
- end
129
-
130
- # SCHEMA
131
- def create_table(table_name, options = {})
132
- stmt = "CREATE COLUMNFAMILY #{table_name} " +
133
- "(KEY varchar PRIMARY KEY)"
134
-
135
- schema_execute statement_with_options(stmt, options), config[:keyspace]
136
- end
137
-
138
- def drop_table(table_name)
139
- schema_execute "DROP TABLE #{table_name}", config[:keyspace]
140
- end
141
-
142
- def schema_execute(cql, keyspace)
143
- schema_db = CassandraCQL::Database.new(
144
- servers,
145
- {keyspace: keyspace, username: username, password: password, cql_version: '2.0.0'},
146
- {connect_timeout: 30, timeout: 30}
147
- )
148
- schema_db.execute cql
149
- end
150
-
151
- def consistency
152
- @consistency ||= config[:consistency]
153
- end
154
-
155
- def consistency=(val)
156
- @consistency = val
157
- end
158
-
159
- def write_option_string(ignore_batching = false)
160
- if (ignore_batching || !batching?) && consistency
161
- " USING CONSISTENCY #{consistency}"
162
- end
163
- end
164
-
165
- def statement_with_options(stmt, options)
166
- if options.any?
167
- with_stmt = options.map do |k,v|
168
- "#{k} = #{CassandraCQL::Statement.quote(v)}"
169
- end.join(' AND ')
170
-
171
- "#{stmt} WITH #{with_stmt}"
172
- else
173
- stmt
174
- end
175
- end
176
-
177
- def create_ids_where_clause(ids)
178
- ids = ids.first if ids.is_a?(Array) && ids.one?
179
- sql = ids.is_a?(Array) ? "#{primary_key_column} IN (?)" : "#{primary_key_column} = ?"
180
- sanitize(sql, ids)
181
- end
182
-
183
- private
184
-
185
- def username
186
- config[:username].presence
187
- end
188
-
189
- def password
190
- config[:password].presence
191
- end
192
-
193
- def sanitize(statement, *bind_vars)
194
- CassandraCQL::Statement.sanitize(statement, bind_vars).force_encoding(Encoding::UTF_8)
195
- end
196
-
197
- def quote_columns(column_names)
198
- column_names.map { |name| "'#{name}'" }
199
- end
200
-
201
- end
202
- end
203
- end