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