cassie 1.0.0.alpha.5 → 1.0.0.alpha.6

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: d925ecc0efe8b9f80a3db861e19e0600aefafccc
4
- data.tar.gz: a691902f688cabb92e861b5e8117d620d6e783d0
3
+ metadata.gz: 2c9e654e90de48031b18a914e9151d6ac15d7766
4
+ data.tar.gz: bc7286b5a941bea47bdd6894d815445b670e20e5
5
5
  SHA512:
6
- metadata.gz: a7d29330368b459d759110f461589776c2552c06e496e2ba2be20bbd7e5f841abbbe617b26cdec7fcd4b919a979998bde14f596ba3f9c06930794cac0b6672a4
7
- data.tar.gz: a54572302c88f2fb902800481df8ee2b06dc4de63ab988e51f1e5575b561cc37cb851207f2fd81c9c87d28d0ecd7f2119e59accc4348ddde6bf7baca8b670feb
6
+ metadata.gz: d45abd16581859fe3f76952e2c809b82029b47ba123d064792ecd71a8bd2d622e4e8a5fbccbc9b3f7a524df2bb08c58f4f06dcba1b9cc42b476925847b0e8e43
7
+ data.tar.gz: 7a9cbcca9a46ba3e5e34a498962120edffedcb382e26d66f40bd091d398b702c5afa7b82db0f0198883387ad8edb088b4366ff4fb1f5aa801888e7524e04cbc0
@@ -0,0 +1,20 @@
1
+ module Cassie::Queries::Statement
2
+ module Callbacks
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include ActiveSupport::Callbacks
7
+ define_callbacks :failure
8
+ end
9
+
10
+ module ClassMethods
11
+ def after_failure(*args, &block)
12
+ set_callback(:failure, :after, *args, &block)
13
+ end
14
+ end
15
+
16
+ def execute
17
+ run_callbacks :failure unless super
18
+ end
19
+ end
20
+ end
@@ -18,7 +18,7 @@ module Cassie::Queries::Statement
18
18
  include Mapping
19
19
 
20
20
  self.table = table
21
- self.identifier = :delete
21
+ self.type = :delete
22
22
 
23
23
  yield(self) if block_given?
24
24
  end
@@ -11,7 +11,7 @@ module Cassie::Queries::Statement
11
11
  include Conditions
12
12
 
13
13
  self.table = table
14
- self.identifier = :insert
14
+ self.type = :insert
15
15
 
16
16
  yield(self) if block_given?
17
17
  end
@@ -3,15 +3,26 @@ module Cassie::Queries::Statement
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- attr_accessor :limit
6
+ attr_writer :limit
7
+ end
8
+
9
+ module ClassMethods
10
+ def limit=(val)
11
+ @limit = val
12
+ end
7
13
 
8
- class << self
9
- attr_accessor :limit
14
+ def limit(val=:get)
15
+ if val == :get
16
+ @limit if defined?(@limit)
17
+ else
18
+ self.limit = val
19
+ end
10
20
  end
11
21
  end
12
22
 
13
23
  def limit
14
- @limit || self.class.limit
24
+ return @limit if defined?(@limit)
25
+ self.class.limit
15
26
  end
16
27
 
17
28
  protected
@@ -5,18 +5,24 @@ module Cassie::Queries::Statement
5
5
  MAPPED_METHODS = [:insert, :update, :delete].freeze
6
6
 
7
7
  included do
8
+ # We are mapping term values from a client object.
9
+ # store this object in `_resource` attribte
10
+ # as they could reasonably want to name it `resource`
8
11
  attr_accessor :_resource
9
12
 
13
+ #TODO: consider simplifying by overriding
14
+ # `execute` and aliasing via mapped methods
10
15
  MAPPED_METHODS.each do |method|
11
- next unless method_defined?(method)
16
+ # overwrite mapper methods that are defined (yuk)
17
+ next if !method_defined?(method)
12
18
 
13
- define_method(method) do |resource=nil, opts={}|
14
- if resource.nil?
19
+ define_method(method) do |value=nil, opts={}|
20
+ if value.nil?
15
21
  # if no mapping is taking place, keep previously
16
22
  # defined behavior/return value
17
23
  return super(opts) if _resource.nil?
18
24
  else
19
- self._resource = resource
25
+ self._resource = value
20
26
  end
21
27
 
22
28
  if super(opts)
@@ -30,19 +36,20 @@ module Cassie::Queries::Statement
30
36
 
31
37
  module ClassMethods
32
38
  def map_from(resource_name)
33
- attr_accessor resource_name
34
-
35
- define_method "_resource" do
36
- send resource_name
39
+ define_method resource_name do
40
+ _resource
37
41
  end
38
42
 
39
- define_method "_resource=" do |val|
40
- send("#{resource_name}=", val)
43
+ define_method "#{resource_name}=" do |val|
44
+ self._resource = val
41
45
  end
42
46
  end
43
47
 
44
48
  protected
45
49
 
50
+ # define getter and setter
51
+ # methods that look up term values
52
+ # from resource object
46
53
  def define_term_methods(field)
47
54
  getter = field
48
55
  setter = "#{field}="
@@ -51,20 +58,41 @@ module Cassie::Queries::Statement
51
58
  raise "accessor or getter already defined for #{field}. Fix the collisions by using the `:value` option."
52
59
  else
53
60
  # Order of prefrence for finding term value
54
- # 1. overriden getter instance method
55
- # 2. value set by setter instance method
56
- # 3. (Eventually) Mapping getter instance method
57
- # 4. instance resource getter instance method
61
+ # 1. overriden getter instance method
62
+ # def id
63
+ # "some constant"
64
+ # end
65
+ # 2. value set by setter instance method
66
+ # def ensure_special_is_special
67
+ # @id = "one off value" if special?
68
+ # end
69
+ # 3. getter instance method on resource object
70
+ # query.user = User.new(id: 105)
71
+ # query.id
72
+ # => 105
58
73
  define_method getter do
74
+ # 1 is handled by definition
75
+
76
+ # 2: prefer instance value
59
77
  if instance_variable_defined?("@#{field}")
60
78
  return instance_variable_get("@#{field}")
61
79
  end
62
- _resource.send(field) if(_resource && _resource.respond_to?(field))
63
- end
64
80
 
65
- define_method setter do |val|
66
- instance_variable_set("@#{field}", val)
81
+ # 3: fetch from resource
82
+ if _resource && _resource.respond_to?(field)
83
+ _resource.send(field)
84
+ end
67
85
  end
86
+
87
+ # query.id = 'some val'
88
+ # initializes underlying instance var
89
+ # which is preferred over resource object attribute
90
+ #
91
+ # Issue: if client defines value for attribute
92
+ # they might assume later setting to nil would
93
+ # revert to behavior of fetching from resource object attribute
94
+ # but that is not the case since the variable is defined
95
+ attr_writer field
68
96
  end
69
97
  end
70
98
  end
@@ -0,0 +1,168 @@
1
+ require_relative '../relations'
2
+
3
+ module Cassie::Queries::Pagination
4
+ module Cursors
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Cassie::Queries::Statement::Relations
9
+ end
10
+
11
+ module ClassMethods
12
+ def max_cursor(key)
13
+ include Peeking
14
+
15
+ @max_cursor_key = key
16
+
17
+ where(key,:lteq,
18
+ value: :"max_#{key}",
19
+ if: :max_cursor_enabled?)
20
+
21
+ define_max_accessors(key)
22
+ define_next_max_cursor_alias(key)
23
+ end
24
+
25
+ def since_cursor(key)
26
+ include Peeking
27
+
28
+ @max_cursor_key = key
29
+
30
+ where(key, :gt,
31
+ value: :"since_#{key}",
32
+ if: :since_cursor_enabled?)
33
+
34
+ define_since_accessors(key)
35
+ define_next_max_cursor_alias(key)
36
+ end
37
+
38
+ def cursor_by(key)
39
+ max_cursor key
40
+ since_cursor key
41
+ end
42
+
43
+ private
44
+
45
+ def define_max_accessors(key)
46
+ attr_accessor :max_cursor
47
+
48
+ define_method :max_cursor_enabled? do
49
+ !max_cursor.nil?
50
+ end
51
+
52
+ getter = :"max_#{key}"
53
+ remove_method getter if method_defined?(getter)
54
+ define_method getter do
55
+ self.max_cursor
56
+ end
57
+
58
+ setter = :"max_#{key}="
59
+ remove_method setter if method_defined?(setter)
60
+ define_method setter do |val|
61
+ self.max_cursor = val
62
+ end
63
+ end
64
+
65
+ def define_since_accessors(key)
66
+ attr_accessor :since_cursor
67
+
68
+ define_method :since_cursor_enabled? do
69
+ !since_cursor.nil?
70
+ end
71
+
72
+ getter = :"since_#{key}"
73
+ remove_method getter if method_defined?(getter)
74
+ define_method getter do
75
+ self.since_cursor
76
+ end
77
+
78
+ setter = :"since_#{key}="
79
+ remove_method setter if method_defined?(setter)
80
+ define_method setter do |val|
81
+ self.since_cursor = val
82
+ end
83
+ end
84
+
85
+ def define_next_max_cursor_alias(key)
86
+ method = "next_max_#{key}"
87
+
88
+ unless method_defined?(method)
89
+ define_method method do
90
+ next_max_cursor
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ module Peeking
97
+ extend ActiveSupport::Concern
98
+
99
+ included do
100
+ attr_reader :next_max_cursor
101
+ end
102
+
103
+ module ClassMethods
104
+ def max_cursor_key
105
+ @max_cursor_key.to_s
106
+ end
107
+ end
108
+
109
+ def limit
110
+ super || page_size
111
+ end
112
+
113
+ def execute
114
+ # get 1 extra result to determing next page info
115
+ # but massage results to only have what client expects
116
+
117
+ val = peek_at_next_page do
118
+ super
119
+ end
120
+
121
+ extract_next_max_cursor
122
+
123
+ val
124
+ end
125
+
126
+ private
127
+
128
+ # cache query object instance page_size
129
+ # so we can revert _object_ back to
130
+ # same state and preserve value
131
+ # inheritance chain behavior
132
+ def peek_at_next_page(&block)
133
+ old_page_size = nil
134
+ was_defined = false
135
+
136
+ if defined?(@page_size)
137
+ old_page_size = @page_size
138
+ was_defined = true
139
+ end
140
+
141
+ @page_size = page_size + 1
142
+ yield
143
+ ensure
144
+ if was_defined
145
+ @page_size = old_page_size
146
+ else
147
+ remove_instance_variable(:@page_size)
148
+ end
149
+ end
150
+
151
+ # Extracts the next_max_cursor from the query results
152
+ # given then current max_cursor and since_cursor
153
+ # leaving the results as cursoring client expects
154
+ #
155
+ # Note: We modify cassie private attribute in place
156
+ # otherwise we have to copy rows, make results private
157
+ # or have a mismatch between rows in results
158
+ # and resources created by query class
159
+ def extract_next_max_cursor
160
+ raw_rows = result.instance_variable_get(:@rows)
161
+
162
+ @next_max_cursor = if raw_rows.count > page_size
163
+ raw_rows.delete_at(-1)[self.class.max_cursor_key]
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
@@ -70,9 +70,5 @@ module Cassie::Queries::Statement
70
70
  # we always generate bound statements
71
71
  @cql ||= "#{identifier} #{OPERATIONS[op_type]} ?"
72
72
  end
73
-
74
- def op_type
75
- @op_type
76
- end
77
73
  end
78
74
  end
@@ -32,7 +32,7 @@ module Cassie::Queries::Statement
32
32
  # if value option was nil and we
33
33
  # are implicilty creating getter/setters.
34
34
  if method_defined?(name) || method_defined?("#{name}=")
35
- raise "accessor or getter already defined for #{name}. Fix the collions by using the `:value` option."
35
+ raise "accessor or getter already defined for #{name}. Fix the collisions by using the `:value` option."
36
36
  else
37
37
  attr_accessor name
38
38
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'relations'
2
2
  require_relative 'limiting'
3
+ require_relative 'pagination'
3
4
  require_relative 'ordering'
4
5
  require_relative 'fetching'
5
6
 
@@ -15,12 +16,11 @@ module Cassie::Queries::Statement
15
16
  # end
16
17
  def select(table)
17
18
  include Relations
18
- include Limiting
19
19
  include Ordering
20
20
  include Fetching
21
21
 
22
22
  self.table = table
23
- self.identifier = :select
23
+ self.type = :select
24
24
 
25
25
  yield(self) if block_given?
26
26
  end
@@ -12,7 +12,7 @@ module Cassie::Queries::Statement
12
12
  include Conditions
13
13
 
14
14
  self.table = table
15
- self.identifier = :update
15
+ self.type = :update
16
16
 
17
17
  yield(self) if block_given?
18
18
  end
@@ -1,5 +1,8 @@
1
1
  require 'active_support/core_ext/string/filters'
2
2
  require_relative 'statement/preparation'
3
+ require_relative 'statement/callbacks'
4
+ require_relative 'statement/limiting'
5
+ require_relative 'statement/pagination'
3
6
  require_relative 'statement/selection'
4
7
  require_relative 'statement/deleting'
5
8
  require_relative 'statement/updating'
@@ -13,6 +16,9 @@ module Cassie::Queries
13
16
 
14
17
  included do
15
18
  include Preparation
19
+ include Callbacks
20
+ include Limiting
21
+ include Pagination
16
22
  include Selection
17
23
  include Deleting
18
24
  include Updating
@@ -22,7 +28,7 @@ module Cassie::Queries
22
28
 
23
29
  class << self
24
30
  attr_accessor :table
25
- attr_accessor :identifier
31
+ attr_accessor :type
26
32
  end
27
33
  end
28
34
 
@@ -46,10 +52,10 @@ module Cassie::Queries
46
52
  protected
47
53
 
48
54
  def build_cql_and_bindings
49
- if identifier
50
- send "build_#{identifier}_cql_and_bindings"
55
+ if type
56
+ send "build_#{type}_cql_and_bindings"
51
57
  else
52
- [cql, bindings]
58
+ raise "No statement type has been declared. Call `.select`, `.update`, `.delete`, or `.insert` to set query type."
53
59
  end
54
60
  end
55
61
 
@@ -68,8 +74,8 @@ module Cassie::Queries
68
74
 
69
75
  private
70
76
 
71
- def identifier
72
- self.class.identifier
77
+ def type
78
+ self.class.type
73
79
  end
74
80
 
75
81
  def eval_if_opt?(value)
data/lib/cassie/query.rb CHANGED
@@ -13,14 +13,12 @@ module Cassie
13
13
  require 'cassandra'
14
14
  require_relative 'queries/session'
15
15
  require_relative 'queries/statement'
16
- require_relative 'queries/pagination'
17
16
  require_relative 'queries/instrumentation'
18
17
  require_relative 'queries/logging'
19
18
 
20
19
  class Query
21
20
  include Queries::Session
22
21
  include Queries::Statement
23
- include Queries::Pagination
24
22
  include Queries::Instrumentation
25
23
  include Queries::Logging
26
24
 
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.5
4
+ version: 1.0.0.alpha.6
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-01-08 00:00:00.000000000 Z
11
+ date: 2016-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cassandra-driver
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: benchmark-ips
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -95,13 +109,11 @@ files:
95
109
  - lib/cassie/queries/logging/cql_execution_event.rb
96
110
  - lib/cassie/queries/logging/logger.rb
97
111
  - lib/cassie/queries/logging/subscription.rb
98
- - lib/cassie/queries/pagination.rb
99
- - lib/cassie/queries/pagination/cursors.rb
100
- - lib/cassie/queries/pagination/page_size.rb
101
112
  - lib/cassie/queries/session.rb
102
113
  - lib/cassie/queries/statement.rb
103
114
  - lib/cassie/queries/statement/assignment.rb
104
115
  - lib/cassie/queries/statement/assignments.rb
116
+ - lib/cassie/queries/statement/callbacks.rb
105
117
  - lib/cassie/queries/statement/conditions.rb
106
118
  - lib/cassie/queries/statement/deleting.rb
107
119
  - lib/cassie/queries/statement/fetching.rb
@@ -110,6 +122,9 @@ files:
110
122
  - lib/cassie/queries/statement/loading.rb
111
123
  - lib/cassie/queries/statement/mapping.rb
112
124
  - lib/cassie/queries/statement/ordering.rb
125
+ - lib/cassie/queries/statement/pagination.rb
126
+ - lib/cassie/queries/statement/pagination/cursors.rb
127
+ - lib/cassie/queries/statement/pagination/page_size.rb
113
128
  - lib/cassie/queries/statement/preparation.rb
114
129
  - lib/cassie/queries/statement/preparation/cache.rb
115
130
  - lib/cassie/queries/statement/relation.rb
@@ -1,15 +0,0 @@
1
- module Cassie::Queries::Pagination
2
- module Cursors
3
- extend ActiveSupport::Concern
4
-
5
- module ClassMethods
6
- def max_cursor(field, opts={})
7
- relation field, :lteq, opts
8
- end
9
-
10
- def since_cursor(field, opts={})
11
- relation field, :gt, opts
12
- end
13
- end
14
- end
15
- end