cassie 1.0.0.alpha.17 → 1.0.0.alpha.18

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1db615986664ba9778d7e97248400a71ff53bc5d
4
- data.tar.gz: 717c516823cfef09d656843aabd7f271beec5b93
3
+ metadata.gz: d1574a96d31d99ad837fc8325c8cb705cdb86e28
4
+ data.tar.gz: 850b78f9859b02aa5b3593c0c550ac048fb6ce74
5
5
  SHA512:
6
- metadata.gz: c9acfa78a37ed8a612aec6a8e3f424f6bfd8f25b8f0667791e9025b7d7c85f250bae8dde1dd520c386134d23bd4f1a0a71df49958abf61c002f951f8c4aab28e
7
- data.tar.gz: 00013b88d5c35b2a729c9197a6805270f45b6d09718a094b50d9d785bec1683ffb5186db6ee088bcaf8f7117b0e0f69e709ece7db6e5e64c9b4121e872ac4f75
6
+ metadata.gz: 107e8b6f43aac80be85470fcd210c900603e205fd013074742aba1b9b4bad979bc5da21ccbfa2da2a05228b1135e39428cc7b676a60eb9029c74414251bb324b
7
+ data.tar.gz: 0b4c6c105b51fe8515979c10543080cc9767aa4f382ddc36ff1c27bb914dc9403b4fc741d82ec7a2fd5eec04b9eefef499ab91e72bf34de4d72a53864740fea3
@@ -1,6 +1,12 @@
1
1
  require 'benchmark'
2
2
 
3
3
  module Cassie::ConnectionHandler
4
+ # ## Cassie::ConnectionHandler::Cluster
5
+ #
6
+ # Adds cluster instance configuration and memoization.
7
+ #
8
+ # Include in any class or module that responds to `configuration` with
9
+ # a cassandra cluster options hash.
4
10
  module Cluster
5
11
 
6
12
  def cluster
@@ -15,7 +21,7 @@ module Cassie::ConnectionHandler
15
21
  _cluster = Cassandra.cluster(config)
16
22
  end
17
23
 
18
- logger.info "Connected to Cassandra cluster #{config[:hosts]} (#{sec.round(3)}s)"
24
+ logger.info "(#{(sec/1000.0).round(2)}ms) Connected to Cassandra cluster #{config[:hosts]}"
19
25
  _cluster
20
26
  end
21
27
  end
@@ -20,7 +20,7 @@ module Cassie::ConnectionHandler
20
20
  _session = cluster.connect(_keyspace)
21
21
  end
22
22
 
23
- logger.info "Session opened to Cassandra[#{_keyspace}] (#{sec.round(3)}s)"
23
+ logger.info "(#{(sec/1000.0).round(2)}ms) Session opened to Cassandra[#{_keyspace}]"
24
24
  @sessions[_keyspace] = _session
25
25
  end
26
26
  end
@@ -148,6 +148,62 @@ or
148
148
  end
149
149
  ```
150
150
 
151
+ #### Consistency configuration
152
+
153
+ The [consistency level](http://datastax.github.io/ruby-driver/v2.1.6/api/cassandra/#consistencies-constant) for a query is determined by your `Cassie::configuration` by default, falling to back to the `Cassandra` default if none is given.
154
+
155
+ ```ruby
156
+ Cassie.configuration[:consistency]
157
+ => nil
158
+
159
+ Cassie.cluster.instance_variable_get(:@execution_options).consistency
160
+ => :one
161
+ ```
162
+
163
+ A Cassie::Query looks for a consistency level defined on the object, subclass, then base class levels. If one is found, it will override the `Cassandra` default when the query is executed.
164
+
165
+ ```ruby
166
+ select :posts_by_author_category
167
+
168
+ where :author_id, :eq
169
+ where :category, :eq, if: :filter_by_category?
170
+
171
+ def filter_by_category?
172
+ #true or false, as makes sense for your query
173
+ end
174
+
175
+ def consistency
176
+ #dynamically determine a query object's consistency level
177
+ if filter_by_category?
178
+ :quorum
179
+ else
180
+ super
181
+ end
182
+ end
183
+ ```
184
+
185
+ ```ruby
186
+ select :posts_by_author_category
187
+
188
+ where :author_id, :eq
189
+ where :category, :eq
190
+
191
+ consistency :quorum
192
+ ```
193
+
194
+ ```ruby
195
+ # lib/tasks/interesting_task.rake
196
+ require_relative "interesting_worker"
197
+
198
+ task :interesting_task do
199
+ Cassandra::Query.consistency = :all
200
+
201
+ InterestingWorker.new.perform
202
+ end
203
+
204
+
205
+ ```
206
+
151
207
  #### Object Mapping
152
208
  For Selection Queries, resources are returned as structs by default for manipulation using accessor methods.
153
209
 
@@ -1,5 +1,6 @@
1
1
  require 'active_support/core_ext/string/filters'
2
2
  require 'active_support/hash_with_indifferent_access'
3
+ require_relative 'statement/execution'
3
4
  require_relative 'statement/preparation'
4
5
  require_relative 'statement/callbacks'
5
6
  require_relative 'statement/limiting'
@@ -16,6 +17,7 @@ module Cassie::Queries
16
17
  extend ::ActiveSupport::Concern
17
18
 
18
19
  included do
20
+ include Execution
19
21
  include Preparation
20
22
  include Callbacks
21
23
  include Limiting
@@ -37,13 +39,6 @@ module Cassie::Queries
37
39
  self.class.table
38
40
  end
39
41
 
40
- # Executes the statment, populates result
41
- # returns true or false indicating a successful execution or not
42
- def execute
43
- @result = session.execute(statement)
44
- execution_successful?
45
- end
46
-
47
42
  # returns a CQL string, or a Cassandra::Statement
48
43
  # that is ready for execution
49
44
  def statement
@@ -60,19 +55,6 @@ module Cassie::Queries
60
55
  end
61
56
  end
62
57
 
63
- def execution_successful?
64
- #TODO: rethink this, it knows too much
65
- raise "execution not complete, no results to parse" unless result
66
-
67
- # empty select
68
- return true if result.empty?
69
-
70
- # failed upsert
71
- return false if (!result.rows.first["[applied]"].nil?) && (result.rows.first["[applied]"] == false)
72
-
73
- true
74
- end
75
-
76
58
  private
77
59
 
78
60
  def eval_if_opt?(value)
@@ -0,0 +1,33 @@
1
+ module Cassie::Queries::Statement
2
+ module Consistency
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attr_writer :consistency
7
+ end
8
+
9
+ module ClassMethods
10
+ def inherited(subclass)
11
+ subclass.consistency = consistency
12
+ super
13
+ end
14
+
15
+ def consistency=(val)
16
+ @consistency = val
17
+ end
18
+
19
+ def consistency(val=:get)
20
+ if val == :get
21
+ @consistency if defined?(@consistency)
22
+ else
23
+ self.consistency = val
24
+ end
25
+ end
26
+ end
27
+
28
+ def consistency
29
+ return @consistency if defined?(@consistency)
30
+ self.class.consistency
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'consistency'
2
+
3
+ module Cassie::Queries::Statement
4
+ module Execution
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Consistency
9
+ end
10
+
11
+ # Executes the statment, populates result
12
+ # returns true or false indicating a successful execution or not
13
+ def execute
14
+ @result = session.execute(statement, execution_options)
15
+ execution_successful?
16
+ end
17
+
18
+ def execution_options
19
+ {}.tap do |opts|
20
+ #TODO: rework consistency module to be more
21
+ # abstract implementation for all execution options
22
+ opts[:consistency] = consistency if consistency
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ def execution_successful?
29
+ #TODO: rethink this, it knows too much
30
+ raise "execution not complete, no results to parse" unless result
31
+
32
+ # empty select
33
+ return true if result.empty?
34
+
35
+ # failed upsert
36
+ return false if (!result.rows.first["[applied]"].nil?) && (result.rows.first["[applied]"] == false)
37
+
38
+ true
39
+ end
40
+ end
41
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cassie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.17
4
+ version: 1.0.0.alpha.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Prothro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-10 00:00:00.000000000 Z
11
+ date: 2016-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cassandra-driver
@@ -128,7 +128,9 @@ files:
128
128
  - lib/cassie/queries/statement/assignments.rb
129
129
  - lib/cassie/queries/statement/callbacks.rb
130
130
  - lib/cassie/queries/statement/conditions.rb
131
+ - lib/cassie/queries/statement/consistency.rb
131
132
  - lib/cassie/queries/statement/deleting.rb
133
+ - lib/cassie/queries/statement/execution.rb
132
134
  - lib/cassie/queries/statement/fetching.rb
133
135
  - lib/cassie/queries/statement/inserting.rb
134
136
  - lib/cassie/queries/statement/limiting.rb