cassandra_store 1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 55cc964c9acca186677f0a9de4ea89d62526c050e50e52c09735c5948c5d7dd8
4
+ data.tar.gz: 63ae9aac6d672d2d45779a78fe7b911014ec752e4c878dc6f6e5c062f3bbe8a5
5
+ SHA512:
6
+ metadata.gz: a24dc8c1517c235b4c0a406199a3048e92724554f4072d34a106ac42e21d0778e02ff372fd17af5be0a0aae6a113b3340bad0bb06f3014d3ddbcb3afbf5eea74
7
+ data.tar.gz: 04c4394a2c87fab0cbfd947931f9602f600d04d4642a4ee9264ea087da861f75c17c2749805efb065c6fba5d04600d0ede89f12a314c09db71059cb1eb176cf5
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ gemfiles/*.lock
@@ -0,0 +1,123 @@
1
+ AllCops:
2
+ NewCops: enable
3
+
4
+ Naming/FileName:
5
+ Exclude:
6
+ - lib/cassandra-record.rb
7
+
8
+ Metrics/ParameterLists:
9
+ Enabled: false
10
+
11
+ Style/DoubleNegation:
12
+ Enabled: false
13
+
14
+ Style/FrozenStringLiteralComment:
15
+ Enabled: false
16
+
17
+ Style/RedundantPercentQ:
18
+ Enabled: false
19
+
20
+ Style/PercentLiteralDelimiters:
21
+ Enabled: false
22
+
23
+ Style/SpecialGlobalVars:
24
+ Enabled: false
25
+
26
+ Security/Eval:
27
+ Enabled: false
28
+
29
+ Style/WordArray:
30
+ Enabled: false
31
+
32
+ Style/ClassAndModuleChildren:
33
+ Enabled: false
34
+
35
+ Style/TrivialAccessors:
36
+ Enabled: false
37
+
38
+ Style/Alias:
39
+ Enabled: false
40
+
41
+ Style/StringLiteralsInInterpolation:
42
+ EnforcedStyle: double_quotes
43
+
44
+ Metrics/ClassLength:
45
+ Enabled: false
46
+
47
+ Naming/MethodParameterName:
48
+ Enabled: false
49
+
50
+ Style/SymbolArray:
51
+ Enabled: false
52
+
53
+ Layout/RescueEnsureAlignment:
54
+ Enabled: false
55
+
56
+ Layout/LineLength:
57
+ Enabled: false
58
+
59
+ Metrics/MethodLength:
60
+ Enabled: false
61
+
62
+ Metrics/ModuleLength:
63
+ Enabled: false
64
+
65
+ Style/ZeroLengthPredicate:
66
+ Enabled: false
67
+
68
+ Metrics/PerceivedComplexity:
69
+ Enabled: false
70
+
71
+ Metrics/AbcSize:
72
+ Enabled: false
73
+
74
+ Metrics/CyclomaticComplexity:
75
+ Enabled: false
76
+
77
+ Metrics/BlockLength:
78
+ Enabled: false
79
+
80
+ Metrics/BlockNesting:
81
+ Enabled: false
82
+
83
+ Style/NumericPredicate:
84
+ Enabled: false
85
+
86
+ Naming/AccessorMethodName:
87
+ Enabled: false
88
+
89
+ Naming/MemoizedInstanceVariableName:
90
+ Enabled: false
91
+
92
+ Style/StringLiterals:
93
+ EnforcedStyle: double_quotes
94
+
95
+ Style/Documentation:
96
+ Enabled: false
97
+
98
+ Naming/ConstantName:
99
+ Enabled: false
100
+
101
+ Style/MutableConstant:
102
+ Enabled: false
103
+
104
+ Layout/MultilineMethodCallIndentation:
105
+ EnforcedStyle: indented
106
+
107
+ Layout/ParameterAlignment:
108
+ EnforcedStyle: with_fixed_indentation
109
+
110
+ Lint/UnusedMethodArgument:
111
+ Enabled: false
112
+
113
+ Layout/FirstArrayElementIndentation:
114
+ EnforcedStyle: consistent
115
+
116
+ Style/IfUnlessModifier:
117
+ Enabled: false
118
+
119
+ Style/RedundantBegin:
120
+ Enabled: false
121
+
122
+ Style/OptionalArguments:
123
+ Enabled: false
@@ -0,0 +1,14 @@
1
+ rvm:
2
+ - 2.5.7
3
+ - 2.6.3
4
+ - 2.7.1
5
+
6
+ before_install:
7
+ - docker-compose up -d
8
+ - sleep 10
9
+
10
+ script:
11
+ - bundle exec rspec
12
+ - bundle exec rubocop
13
+
14
+ sudo: false
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "activesupport"
6
+ gem "cassandra-driver"
7
+ gem "hooks"
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Benjamin Vetter
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,282 @@
1
+ [![Build Status](https://secure.travis-ci.org/mrkamel/cassandra-store.png?branch=master)](http://travis-ci.org/mrkamel/cassandra-store)
2
+
3
+ # CassandraStore
4
+
5
+ CassandraStore is a fun to use ORM for Cassandra with a chainable,
6
+ ActiveStore like DSL for querying, inserting, updating and deleting records
7
+ plus built-in migration support. It is built on-top of the cassandra-driver
8
+ gem, using its built-in automated paging what is drastically reducing the
9
+ complexity of the code base.
10
+
11
+ ## Install
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'cassandra-store'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install cassandra-store
24
+
25
+ # Usage
26
+
27
+ ## Connecting
28
+
29
+ First and foremost, you need to connect to your cassandra cluster like so:
30
+
31
+ ```ruby
32
+ CassandraStore::Base.configure(
33
+ hosts: ["127.0.0.1"],
34
+ keyspace: "my_keyspace",
35
+ cluster_settings: { consistency: :quorum }
36
+ )
37
+ ```
38
+
39
+ When using rails, you want to do that in an initializer. If you do not yet have
40
+ a keyspace, you additionally want to pass `replication` settings:
41
+
42
+ ```ruby
43
+ CassandraStore::Base.configure(
44
+ hosts: ["127.0.0.1"],
45
+ keyspace: "my_keyspace",
46
+ cluster_settings: { consistency: :quorum },
47
+ replication: { class: 'SimpleStrategy', replication_factor: 1 }
48
+ )
49
+ ```
50
+
51
+ Afterwards, you can create/drop the specified keyspace:
52
+
53
+ ```ruby
54
+ rake cassandra:keyspace:create
55
+ rake cassandra:keyspace:drop
56
+ ```
57
+
58
+ ## Migrations
59
+
60
+ If you are on rails and you don't have any tables yet, you can add migrations
61
+ now. There is no generator yet, so you have to create them manually:
62
+
63
+ ```ruby
64
+ # cassandra/migrate/1589896040_create_posts.rb
65
+
66
+ class CreatePosts < CassandraStore::Migration
67
+ def up
68
+ execute <<-CQL
69
+ CREATE TABLE posts (
70
+ user TEXT,
71
+ domain TEXT,
72
+ id TIMEUUID,
73
+ message TEXT,
74
+ PRIMARY KEY ((user, domain), id)
75
+ )
76
+ CQL
77
+ end
78
+
79
+ def down
80
+ execute "DROP TABLE posts"
81
+ end
82
+ end
83
+ ```
84
+
85
+ Afterwards, simply run `rake cassandra:migrate`.
86
+
87
+ ## Models
88
+
89
+ Creating models couldn't be easier:
90
+
91
+ ```ruby
92
+ class Post < CassandraStore::Base
93
+ column :user, :text, partition_key: true
94
+ column :domain, :text, partition_key: true
95
+ column :id, :timeuuid, clustering_key: true
96
+ column :message, :text
97
+
98
+ validates_presence_of :user, :domain, :message
99
+
100
+ before_create do
101
+ self.id ||= generate_timeuuid
102
+ end
103
+ end
104
+ ```
105
+
106
+ Let's check this out in detail:
107
+
108
+ ```ruby
109
+ column :user, :text, partition_key: true
110
+ column :domain, :text, partition_key: true
111
+ ```
112
+
113
+ tells CassandraStore that your partition key is comprised of the `user` column
114
+ as well as the `domain` column. For more information regarding partition keys
115
+ and the data model of cassandra, please check out the cassandra docs. Afterwards,
116
+ the clustering/sorting key is specified via:
117
+
118
+ ```ruby
119
+ column :id, :timeuuid, clustering_key: true
120
+ ```
121
+
122
+ The `id` is assigned here:
123
+
124
+ ```ruby
125
+ self.id ||= generate_timeuuid
126
+ ```
127
+
128
+ Please note, CassandraStore never auto-assigns any values for you, but you
129
+ have to assign them. You can pass a timestamp to `generate_timeuuid` as well:
130
+
131
+ ```ruby
132
+ generate_timeuuid(Time.now)
133
+ ```
134
+
135
+ This is desirable when you have timestamp columns as well and you want them
136
+ to match with your timeuuid key.
137
+
138
+ Similarly, when using `UUID` instead of `TIMEUUID` you have to use
139
+ `generate_uuid` instead.
140
+
141
+ In addition, you can of course use all kinds of validations, hooks, etc.
142
+
143
+ ## Querying
144
+
145
+ The interface for dealing with records and querying them is very similar
146
+ to the interface of `ActiveRecord`:
147
+
148
+ ```ruby
149
+ Post.create!(user: "mrkamel", ...)
150
+ Post.create(...)
151
+ Post.new(...).save
152
+ Post.new(...).save!
153
+ Post.first.delete
154
+ Post.first.destroy
155
+ ```
156
+
157
+ CassandraStore supports comprehensive query methods in a chainable way:
158
+
159
+ * `all`
160
+
161
+ ```ruby
162
+ Post.all
163
+ ```
164
+
165
+ * `where`
166
+
167
+ ```ruby
168
+ Post.where(user: "mrkamel", domain: "example.com")
169
+ ```
170
+
171
+ * `where_cql`
172
+
173
+ ```ruby
174
+ Post.where_cql("user = :user", user: "mrkamel")
175
+ ```
176
+
177
+ * `limit`
178
+
179
+ ```ruby
180
+ Post.where(...).limit(10)
181
+ ```
182
+
183
+ * `order`
184
+
185
+ ```ruby
186
+ Post.where(...).order(id: "asc")
187
+ ```
188
+
189
+ * `distinct`
190
+
191
+ ```ruby
192
+ Post.select(:user, :domain).distinct
193
+ ```
194
+
195
+ * `select`
196
+
197
+ ```ruby
198
+ Post.select(:user, :domain)
199
+ ```
200
+
201
+ Please note, when using `select` in the end an array of hashes will be returned
202
+ instead of an array of `Post` objects.
203
+
204
+ * `count`
205
+
206
+ ```ruby
207
+ Post.where(...).count
208
+ ```
209
+
210
+ * `first`
211
+
212
+ ```ruby
213
+ Post.where(...).first
214
+ ```
215
+
216
+ * `find_each`
217
+
218
+ ```ruby
219
+ Post.where(...).find_each(batch_size: 100) do |post|
220
+ # ...
221
+ end
222
+ ```
223
+
224
+ * `find_in_batches`
225
+
226
+ ```ruby
227
+ Post.where(...).find_in_batches(batch_size: 100) do |batch|
228
+ # ...
229
+ end
230
+ ```
231
+
232
+ * `update_all`
233
+
234
+ ```ruby
235
+ Post.where(...).update_all("message = 'test'")
236
+ Post.where(...).update_all(message: "test")
237
+ ```
238
+
239
+ * `delete_all`
240
+
241
+ ```ruby
242
+ Post.where(...).delete_all
243
+ ```
244
+
245
+ Please note, that `delete_in_batches` will run `find_in_batches` iteratively
246
+ and then delete each batch. When dealing with large amounts of records to
247
+ delete you usually want to use `delete_in_batches` instead of `delete_all`, as
248
+ `delete_all` can time out.
249
+
250
+ * `delete_in_batches`
251
+
252
+ ```ruby
253
+ Post.where(...).delete_in_batches
254
+ ```
255
+
256
+ Again, please note, that `delete_in_batches` will run `find_in_batches` iteratively
257
+ and then delete each batch. When dealing with large amounts of records to
258
+ delete you usually want to use `delete_in_batches` instead of `delete_all`, as
259
+ `delete_all` can time out.
260
+
261
+ * `truncate_table`
262
+
263
+ ```ruby
264
+ Post.truncate_table
265
+ ```
266
+
267
+ Deletes all records from the table. This is much faster than `delete_all` or
268
+ `delete_in_batches`. However, it is not chainable, such that your only option
269
+ is to remove all records from the table.
270
+
271
+ ## Semantic Versioning
272
+
273
+ CassandraStore is using Semantic Versioning: [SemVer](http://semver.org/)
274
+
275
+ ## Contributing
276
+
277
+ 1. Fork it
278
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
279
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
280
+ 4. Push to the branch (`git push origin my-new-feature`)
281
+ 5. Create new Pull Request
282
+