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

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: 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