cassie-queries 0.0.1.a1 → 0.0.1.a2

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
  SHA1:
3
- metadata.gz: 616d830ce0e5af7de3bae56c7d8b0375e628bfbb
4
- data.tar.gz: 0a2971a05512cc8038dff5a4ae2aad8c0ffdb7d6
3
+ metadata.gz: 292e17b52cc92a211e404495ca0835bd2a3bb368
4
+ data.tar.gz: edede8b8ef33b3625cba57ce64699ee11556ad86
5
5
  SHA512:
6
- metadata.gz: 605d2082d4d825745d1f565fd1e4d5f8ac58798d688506ceaa8f184861eb52b33c5a55fe075ddfbf307da7f63b7f3edadd41a91f6a9e3d7478a6d78e7de17cdf
7
- data.tar.gz: 0af76ba1a61bb514cce49bdc7b6968939f4f20ff939276549c8e6ef9db895de822a6e1581b39f52d08af63c8ad465e587f57163558d15f9c9ea4b816d42bf239
6
+ metadata.gz: 813f15ce1672f5f0a7cfb3adced562b0ee94a2f3a4e523a048e5b6973d22d38562068059a1cbc53fc0353c24fd20a1685b9246b19a9e9c03a24cd01327e98f28
7
+ data.tar.gz: b063aba0e91ef6bdb58bf68f732ec1bb5a490ffe37c63ac5b4c22f60e664c11fdf2a85ea787bc451fb3cf30d2d347e33a35f65929fa4b486932cf09821b8b3d7
@@ -0,0 +1,23 @@
1
+ module Cassie::Queries
2
+ module Instrumentation
3
+ extend ::ActiveSupport::Concern
4
+
5
+ def execute
6
+ instrument { super }
7
+ end
8
+
9
+ def instrument #:nodoc:
10
+ instrumenter.instrument("cql.execute") do |payload|
11
+ execution_val = yield # execution populates #result
12
+ payload[:execution_info] = result.try(:execution_info)
13
+ execution_val
14
+ end
15
+ end
16
+
17
+ protected
18
+
19
+ def instrumenter
20
+ ActiveSupport::Notifications
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ module Cassie::Queries::LogSubscription
2
+ class CqlExecutionEvent < ActiveSupport::Notifications::Event
3
+
4
+ def duration # in milliseconds
5
+ return super unless traced?
6
+
7
+ # trace duration is in microseconds
8
+ trace.duration / 1000.0
9
+ end
10
+
11
+ def message
12
+ color "(#{duration.round(1)}ms) #{statement}"
13
+ end
14
+
15
+ protected
16
+
17
+ def execution_info
18
+ payload[:execution_info]
19
+ end
20
+
21
+ def statement
22
+ statement = execution_info.statement
23
+ str = statement.cql
24
+ str += " [#{statement.params}]" if statement.respond_to? :params
25
+ str
26
+ end
27
+
28
+ def traced?
29
+ execution_info && !!trace
30
+ end
31
+
32
+ def trace
33
+ execution_info.trace
34
+ end
35
+
36
+ def color(message)
37
+ "\e[1m\e[37m#{message}\e[0m\e[22m"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'log_subscription/cql_execution_event'
2
+
3
+ module Cassie::Queries
4
+ module LogSubscription
5
+ extend ::ActiveSupport::Concern
6
+
7
+ included do
8
+ ActiveSupport::Notifications.subscribe('cql.execute') do |*args|
9
+ # args:
10
+ # name # => String, name of the event (such as 'render' from above)
11
+ # start # => Time, when the instrumented block started execution
12
+ # finish # => Time, when the instrumented block ended execution
13
+ # id # => String, unique ID for this notification
14
+ # payload # => Hash, the payload
15
+ unless args.last[:exception]
16
+ logger.debug(CqlExecutionEvent.new(*args).message)
17
+ end
18
+ end
19
+ end
20
+
21
+ module ClassMethods
22
+ def logger
23
+ @logger ||= begin
24
+ l = Logger.new(STDOUT)
25
+ l.formatter = ActiveSupport::Logger::SimpleFormatter.new
26
+ l
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ require 'active_support/core_ext/string/filters'
2
+
3
+ module Cassie::Queries
4
+ module PreparedStatement
5
+ extend ::ActiveSupport::Concern
6
+
7
+ included do
8
+ class << self
9
+ attr_accessor :prepare
10
+ end
11
+ self.prepare = true
12
+ end
13
+
14
+ module ClassMethods
15
+ def inherited(subclass)
16
+ subclass.prepare = prepare
17
+ end
18
+
19
+ def prepare?
20
+ !!prepare
21
+ end
22
+
23
+ def prepared_statement
24
+ # use class instance variable to esnure only 1
25
+ # statement is prepared per process
26
+ # no mutex required in MRI because of GIL
27
+ #
28
+ # note: cassandra-driver handles the case
29
+ # of executing a prepared statement
30
+ # on a host where it has not been prepared
31
+ # yet, by re-preparing.
32
+ @prepared_statement ||= begin
33
+ session.prepare(statement)
34
+ end
35
+ end
36
+ end
37
+
38
+ def statement
39
+ self.class.prepare? ? self.class.prepared_statement : super
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,22 @@
1
+ module Cassie::Queries
2
+ module Session
3
+ extend ::ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def session
7
+ # until cassie-configuration exists,
8
+ # we're relying on the client to
9
+ # supply the session
10
+ if defined?(super)
11
+ super
12
+ else
13
+ raise "Oops! Cassie::Queries doesn't manage a Cassandra session for you, yet. You must provide a .session class method that returns a valid session."
14
+ end
15
+ end
16
+ end
17
+
18
+ def session
19
+ self.class.session
20
+ end
21
+ end
22
+ end
@@ -19,26 +19,14 @@ module Cassie::Queries
19
19
 
20
20
  def statement
21
21
  self.const_get(:STATEMENT)
22
- end
23
-
24
- def prepared_statement
25
- # use class instance variable to esnure only 1
26
- # statement is prepared per process
27
- # no mutex required in MRI because of GIL
28
- #
29
- # note: cassandra-driver handles the case
30
- # of executing a prepared statement
31
- # on a host where it has not been prepared
32
- # yet, by re-preparing.
33
- @prepared_statement ||= begin
34
- session.prepare(statement)
35
- end
22
+ rescue NameError
36
23
  end
37
24
  end
38
25
 
26
+ # Executes the statment, populates result
27
+ # returns true or false indicating a successful execution or not
39
28
  def execute
40
- @result = session.execute(prepared_statement, arguments: bindings)
41
-
29
+ @result = session.execute(statement, arguments: bindings)
42
30
  execution_successful?
43
31
  end
44
32
 
@@ -46,10 +34,6 @@ module Cassie::Queries
46
34
  self.class.statement
47
35
  end
48
36
 
49
- def prepared_statement
50
- self.class.prepared_statement
51
- end
52
-
53
37
  protected
54
38
 
55
39
  def bindings
data/lib/cassie/query.rb CHANGED
@@ -1,8 +1,16 @@
1
1
  module Cassie
2
2
  # think about ActiveSupport autoloading
3
+ require_relative 'queries/session'
3
4
  require_relative 'queries/statement'
5
+ require_relative 'queries/prepared_statement'
6
+ require_relative 'queries/instrumentation'
7
+ require_relative 'queries/log_subscription'
4
8
 
5
9
  class Query
6
- include Cassie::Queries::Statement
10
+ include Queries::Session
11
+ include Queries::Statement
12
+ include Queries::PreparedStatement
13
+ include Queries::Instrumentation
14
+ include Queries::LogSubscription
7
15
  end
8
16
  end
@@ -3,4 +3,4 @@ require 'active_support'
3
3
  # cassie directory instead of cassie_queries
4
4
  # to allow sharing of cassie module with other libraries
5
5
  # but maintain folder/file/module/class naming conventions
6
- require 'cassie/query'
6
+ require_relative 'cassie/query'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cassie-queries
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.a1
4
+ version: 0.0.1.a2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Prothro
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: '`cassie-queries` is a lightweight interface adapter allowing easy use
56
70
  of the functionality provided by the `cassandra-driver`.'
57
71
  email: evan.prothro@gmail.com
@@ -59,6 +73,11 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
76
+ - lib/cassie/queries/instrumentation.rb
77
+ - lib/cassie/queries/log_subscription/cql_execution_event.rb
78
+ - lib/cassie/queries/log_subscription.rb
79
+ - lib/cassie/queries/prepared_statement.rb
80
+ - lib/cassie/queries/session.rb
62
81
  - lib/cassie/queries/statement.rb
63
82
  - lib/cassie/query.rb
64
83
  - lib/cassie-queries.rb