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 +4 -4
- data/lib/cassie/queries/statement/callbacks.rb +20 -0
- data/lib/cassie/queries/statement/deleting.rb +1 -1
- data/lib/cassie/queries/statement/inserting.rb +1 -1
- data/lib/cassie/queries/statement/limiting.rb +15 -4
- data/lib/cassie/queries/statement/mapping.rb +46 -18
- data/lib/cassie/queries/statement/pagination/cursors.rb +168 -0
- data/lib/cassie/queries/{pagination → statement/pagination}/page_size.rb +0 -0
- data/lib/cassie/queries/{pagination.rb → statement/pagination.rb} +0 -0
- data/lib/cassie/queries/statement/relation.rb +0 -4
- data/lib/cassie/queries/statement/relations.rb +1 -1
- data/lib/cassie/queries/statement/selection.rb +2 -2
- data/lib/cassie/queries/statement/updating.rb +1 -1
- data/lib/cassie/queries/statement.rb +12 -6
- data/lib/cassie/query.rb +0 -2
- metadata +20 -5
- data/lib/cassie/queries/pagination/cursors.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c9e654e90de48031b18a914e9151d6ac15d7766
|
4
|
+
data.tar.gz: bc7286b5a941bea47bdd6894d815445b670e20e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
@@ -3,15 +3,26 @@ module Cassie::Queries::Statement
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
|
6
|
+
attr_writer :limit
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def limit=(val)
|
11
|
+
@limit = val
|
12
|
+
end
|
7
13
|
|
8
|
-
|
9
|
-
|
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
|
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
|
-
|
16
|
+
# overwrite mapper methods that are defined (yuk)
|
17
|
+
next if !method_defined?(method)
|
12
18
|
|
13
|
-
define_method(method) do |
|
14
|
-
if
|
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 =
|
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
|
-
|
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 "
|
40
|
-
|
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
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
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
|
-
|
66
|
-
|
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
|
File without changes
|
File without changes
|
@@ -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
|
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.
|
23
|
+
self.type = :select
|
24
24
|
|
25
25
|
yield(self) if block_given?
|
26
26
|
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 :
|
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
|
50
|
-
send "build_#{
|
55
|
+
if type
|
56
|
+
send "build_#{type}_cql_and_bindings"
|
51
57
|
else
|
52
|
-
|
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
|
72
|
-
self.class.
|
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.
|
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-
|
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
|