cassie-queries 0.0.1.a4 → 0.0.1.alpha.5

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: 43d357d81ed74c4e0e24a0536842f3cb0c135681
4
- data.tar.gz: 246a0d7be210bbdea3bc1c1ce3f70fdd445d7eb7
3
+ metadata.gz: 24b13bcc78da6a2d63d65cdf05e117668e1f579f
4
+ data.tar.gz: c3fde5752744563dc4a1e335d62bc2c62b515600
5
5
  SHA512:
6
- metadata.gz: 4561e775d74984005a279c954b4ad638da526830b6a1ab52a82f17def1208604180b168b2011b9baed3e993e9e0a0e5e730e88e70698604b8a439c91781541a1
7
- data.tar.gz: 4922dbc93622b6cbc63bf89643e149165fd0484b91b8b617b61acde5291b02f8dc17dcff3e8916ffc57bcc9241e949f00ef8ecb0239d0603faf6101a0db8d76f
6
+ metadata.gz: 7608f07e36d0ee0cf82d02b1cc84d0a17ab0967ac66f7964ce1bc0820135dd225a3f564fa431b6125693c6e999ce2797725972b7f17331598865f47013f82b63
7
+ data.tar.gz: 1d5a2f4d059f160477f7ad0dcc7d48e61006c64aa4b6cf50a412ff5c12b4994794af5e7f363a3c6d5e166590c8fed8611dc6999165f325f6a56bb7f985857e16
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cassie-queries
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.a4
4
+ version: 0.0.1.alpha.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Prothro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-22 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cassandra-driver
@@ -86,35 +86,8 @@ email: evan.prothro@gmail.com
86
86
  executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
- files:
90
- - lib/cassie-queries.rb
91
- - lib/cassie/queries/instrumentation.rb
92
- - lib/cassie/queries/logging.rb
93
- - lib/cassie/queries/logging/cql_execution_event.rb
94
- - lib/cassie/queries/logging/logger.rb
95
- - lib/cassie/queries/logging/subscription.rb
96
- - lib/cassie/queries/pagination.rb
97
- - lib/cassie/queries/pagination/cursors.rb
98
- - lib/cassie/queries/pagination/page_size.rb
99
- - lib/cassie/queries/session.rb
100
- - lib/cassie/queries/statement.rb
101
- - lib/cassie/queries/statement/assignment.rb
102
- - lib/cassie/queries/statement/assignments.rb
103
- - lib/cassie/queries/statement/deleting.rb
104
- - lib/cassie/queries/statement/fetching.rb
105
- - lib/cassie/queries/statement/inserting.rb
106
- - lib/cassie/queries/statement/limiting.rb
107
- - lib/cassie/queries/statement/loading.rb
108
- - lib/cassie/queries/statement/mapping.rb
109
- - lib/cassie/queries/statement/ordering.rb
110
- - lib/cassie/queries/statement/preparation.rb
111
- - lib/cassie/queries/statement/preparation/cache.rb
112
- - lib/cassie/queries/statement/relation.rb
113
- - lib/cassie/queries/statement/relations.rb
114
- - lib/cassie/queries/statement/selection.rb
115
- - lib/cassie/queries/statement/updating.rb
116
- - lib/cassie/query.rb
117
- homepage: https://github.com/eprothro/cassie-queries
89
+ files: []
90
+ homepage: https://github.com/eprothro/cassie/tree/master/queries
118
91
  licenses:
119
92
  - MIT
120
93
  metadata: {}
@@ -1,24 +0,0 @@
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
-
13
- payload[:execution_info] = result.execution_info if result.respond_to?(:execution_info)
14
- execution_val
15
- end
16
- end
17
-
18
- protected
19
-
20
- def instrumenter
21
- ActiveSupport::Notifications
22
- end
23
- end
24
- end
@@ -1,44 +0,0 @@
1
- module Cassie::Queries::Logging
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
- if execution_info
23
- statement = execution_info.statement
24
- str = statement.cql
25
- str += " [#{statement.params}]" if statement.respond_to? :params
26
- str
27
- else
28
- "CQL executed: (`execution_info` was not present?)"
29
- end
30
- end
31
-
32
- def traced?
33
- execution_info && !!trace
34
- end
35
-
36
- def trace
37
- execution_info.trace
38
- end
39
-
40
- def color(message)
41
- "\e[1m\e[37m#{message}\e[0m\e[22m"
42
- end
43
- end
44
- end
@@ -1,27 +0,0 @@
1
- module Cassie::Queries
2
- module Logging
3
-
4
- def self.logger
5
- @logger ||= init_logger
6
- end
7
-
8
- def self.logger=(new_logger)
9
- @logger = new_logger || Logger.new('/dev/null')
10
- end
11
-
12
- def self.init_logger(target = STDOUT)
13
- previous_logger = defined?(@logger) ? @logger : nil
14
-
15
- @logger = Logger.new(target)
16
- @logger.level = Logger::INFO
17
- @logger.formatter = log_formatter
18
-
19
- previous_logger.close if previous_logger
20
- @logger
21
- end
22
-
23
- def self.log_formatter
24
- ActiveSupport::Logger::SimpleFormatter.new
25
- end
26
- end
27
- end
@@ -1,22 +0,0 @@
1
- require_relative 'cql_execution_event'
2
-
3
- module Cassie::Queries::Logging
4
- module Subscription
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
- # [:exception] => if raised during event
16
- unless args.last[:exception]
17
- logger.debug(CqlExecutionEvent.new(*args).message)
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,22 +0,0 @@
1
- require_relative 'logging/logger'
2
- require_relative 'logging/subscription'
3
-
4
- module Cassie::Queries
5
- module Logging
6
- extend ::ActiveSupport::Concern
7
-
8
- included do
9
- include Subscription
10
- end
11
-
12
- module ClassMethods
13
- def logger
14
- Cassie::Queries::Logging.logger
15
- end
16
- end
17
-
18
- def logger
19
- self.class.logger
20
- end
21
- end
22
- end
@@ -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
@@ -1,7 +0,0 @@
1
- module Cassie::Queries::Pagination
2
- module PageSize
3
- def self.default
4
- 100
5
- end
6
- end
7
- end
@@ -1,37 +0,0 @@
1
- require_relative 'pagination/cursors'
2
- require_relative 'pagination/page_size'
3
-
4
- module Cassie::Queries
5
- module Pagination
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- include Cursors
10
- end
11
-
12
- module ClassMethods
13
- def inherited(subclass)
14
- subclass.page_size = page_size
15
- super
16
- end
17
-
18
- def page_size
19
- return @page_size if defined?(@page_size)
20
- Cassie::Queries::Pagination::PageSize.default
21
- end
22
-
23
- def page_size=(val)
24
- @page_size = val
25
- end
26
- end
27
-
28
- def page_size
29
- return @page_size if defined?(@page_size)
30
- self.class.page_size
31
- end
32
-
33
- def page_size=(val)
34
- @page_size = val
35
- end
36
- end
37
- end
@@ -1,22 +0,0 @@
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
@@ -1,36 +0,0 @@
1
- module Cassie::Queries::Statement
2
- # set "username = ?", value: :username
3
- # set "favs = favs + ?" value: "{ 'movie' : 'Cassablanca' }"
4
- # set :username
5
- class Assignment
6
- # https://cassandra.apache.org/doc/cql3/CQL.html#updateStmt
7
-
8
- attr_reader :identifier
9
-
10
- def initialize(identifier, opts={})
11
- if String === identifier
12
- # custom assignment is being defined:
13
- #
14
- # `assign "username = ?", value: :username`
15
- @cql = identifier
16
- @custom = true
17
- else
18
- @identifier = identifier
19
- end
20
- end
21
-
22
- def to_insert_cql
23
- return @cql if defined?(@cql)
24
- identifier
25
- end
26
-
27
- def to_update_cql
28
- return @cql if defined?(@cql)
29
- "#{identifier} = ?"
30
- end
31
-
32
- def custom?
33
- !!@custom
34
- end
35
- end
36
- end
@@ -1,67 +0,0 @@
1
- require_relative 'assignment'
2
- require_relative 'mapping'
3
-
4
- module Cassie::Queries::Statement
5
- module Assignments
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- include Mapping
10
- end
11
-
12
- module ClassMethods
13
- def set(identifier, opts={})
14
- assignment = Assignment.new(identifier, opts)
15
- opts[:value] ||= identifier.to_sym
16
-
17
- if Symbol === opts[:value]
18
- define_term_methods(opts[:value])
19
- end
20
-
21
- assignments[assignment] = opts
22
- end
23
-
24
- def assignments
25
- @assignments ||= {}
26
- end
27
- end
28
-
29
- def assignments
30
- self.class.assignments
31
- end
32
-
33
- def build_update_and_bindings
34
- cql = ""
35
- bindings = []
36
- assignment_strings = []
37
-
38
- assignments.each do |a, opts|
39
- if eval_if_opt?(opts[:if])
40
- assignment_strings << a.to_update_cql
41
- bindings << eval_value_opt(opts[:value])
42
- end
43
- end
44
-
45
- cql = "#{assignment_strings.join(', ')}" unless bindings.empty?
46
-
47
- [cql , bindings]
48
- end
49
-
50
- def build_insert_and_bindings
51
- identifiers = []
52
- bindings = []
53
-
54
- assignments.each do |a, opts|
55
- if eval_if_opt?(opts[:if])
56
- identifiers << a.to_insert_cql
57
- bindings << eval_value_opt(opts[:value])
58
- end
59
- end
60
-
61
- identifiers_cql = "#{identifiers.join(', ')}"
62
- terms_cql = Array.new(identifiers.count){"?"}.join(", ")
63
-
64
- [identifiers_cql, terms_cql , bindings]
65
- end
66
- end
67
- end
@@ -1,60 +0,0 @@
1
- require_relative 'relations'
2
-
3
- module Cassie::Queries::Statement
4
- module Deleting
5
- extend ::ActiveSupport::Concern
6
-
7
- module ClassMethods
8
- #TODO: accept block to add specific selectors and aliases
9
- # select :table do |t|
10
- # t.id
11
- # t.name as: :username
12
- # end
13
- def delete(table)
14
- include Relations
15
-
16
- self.table = table
17
- self.identifier = :delete
18
-
19
- yield(self) if block_given?
20
- end
21
-
22
- # TODO rename to identifiers and extract
23
- def selectors
24
- @selectors ||= []
25
- end
26
- end
27
-
28
- def delete(opts={})
29
- execute
30
- execution_successful?
31
- end
32
-
33
- protected
34
-
35
- def build_delete_cql_and_bindings
36
- where_str, bindings = build_where_and_bindings
37
-
38
- cql = %(
39
- DELETE #{build_delete_clause}
40
- FROM #{table}
41
- #{where_str}
42
- ).squish + ";"
43
-
44
- [cql, bindings]
45
- end
46
-
47
- # a select clause is built up of selectors
48
- def selectors
49
- self.class.selectors
50
- end
51
-
52
- def build_delete_clause
53
- str = if selectors.empty?
54
- ''
55
- else
56
- selectors.join(', ')
57
- end
58
- end
59
- end
60
- end
@@ -1,55 +0,0 @@
1
- require_relative 'relation'
2
- require_relative 'loading'
3
-
4
- class Cassie::Queries::RecordNotFound < StandardError; end
5
-
6
- module Cassie::Queries::Statement
7
- module Fetching
8
- extend ActiveSupport::Concern
9
-
10
- included do
11
- include Loading
12
- end
13
-
14
- # Returns array of rows or empty array
15
- #
16
- # query.fetch(id: 1)
17
- # => [{id: 1, name: 'eprothro'}]
18
- def fetch(args={})
19
- args.each do |k, v|
20
- setter = "#{k}="
21
- send(setter, v) if respond_to? setter
22
- end
23
-
24
- execute
25
- result.rows
26
- end
27
-
28
- # Returns first result or nil
29
- #
30
- # query.find(id: 1)
31
- # => {id: 1, name: 'eprothro'}
32
- #
33
- # query.find(id: 2)
34
- # => nil
35
- def find(args={})
36
- old_limit = defined?(@limit) ? @limit : nil
37
- self.limit = 1
38
-
39
- fetch.first
40
- ensure
41
- self.limit = old_limit
42
- end
43
-
44
- # Returns first result or raises RecordNotFound
45
- #
46
- # query.find!(id: 1)
47
- # => {id: 1, name: 'eprothro'}
48
- #
49
- # query.find!(id: 2)
50
- # RecordNotFound: RecordNotFound
51
- def find!(args={})
52
- find || raise(Cassie::Queries::RecordNotFound)
53
- end
54
- end
55
- end
@@ -1,37 +0,0 @@
1
- require_relative 'assignments'
2
-
3
- module Cassie::Queries::Statement
4
- module Inserting
5
- extend ::ActiveSupport::Concern
6
-
7
- module ClassMethods
8
- def insert(table)
9
- include Assignments
10
-
11
- self.table = table
12
- self.identifier = :insert
13
-
14
- yield(self) if block_given?
15
- end
16
- end
17
-
18
- def insert(opts={})
19
- execute
20
- execution_successful?
21
- end
22
-
23
- protected
24
-
25
- def build_insert_cql_and_bindings
26
- identifiers_str, terms_str, bindings = build_insert_and_bindings
27
-
28
- cql = %(
29
- INSERT INTO #{table}
30
- (#{identifiers_str})
31
- VALUES (#{terms_str})
32
- ).squish + ";"
33
-
34
- [cql, bindings]
35
- end
36
- end
37
- end
@@ -1,25 +0,0 @@
1
- module Cassie::Queries::Statement
2
- module Limiting
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- attr_accessor :limit
7
-
8
- class << self
9
- attr_accessor :limit
10
- end
11
- end
12
-
13
- def limit
14
- @limit || self.class.limit
15
- end
16
-
17
- protected
18
-
19
- def build_limit_str
20
- return "" if limit.nil?
21
-
22
- "LIMIT #{limit}"
23
- end
24
- end
25
- end
@@ -1,16 +0,0 @@
1
- module Cassie::Queries::Statement
2
- module Loading
3
- extend ActiveSupport::Concern
4
-
5
- def fetch(args={})
6
- rows = super(args)
7
- rows.map {|r| build_resource(r) }
8
- end
9
-
10
- # When class doesn't override
11
- # simply return a struct with the row data
12
- def build_resource(row)
13
- Struct.new(*row.keys).new(*row.values)
14
- end
15
- end
16
- end
@@ -1,66 +0,0 @@
1
- module Cassie::Queries::Statement
2
- module Mapping
3
- extend ActiveSupport::Concern
4
-
5
- MAPPED_METHODS = [:insert, :update, :delete].freeze
6
-
7
- included do
8
- MAPPED_METHODS.each do |method|
9
- next unless method_defined?(method)
10
-
11
- define_method(method) do |resource=nil, opts={}|
12
- return super(opts) if _resource.nil? && resource.nil?
13
-
14
- self._resource = resource
15
-
16
- if super(opts)
17
- _resource
18
- else
19
- false
20
- end
21
- end
22
- end
23
- end
24
-
25
- module ClassMethods
26
- def map_from(resource_name)
27
- attr_accessor resource_name
28
-
29
- define_method "_resource" do
30
- send resource_name
31
- end
32
-
33
- define_method "_resource=" do |val|
34
- send("#{resource_name}=", val)
35
- end
36
- end
37
-
38
- protected
39
-
40
- def define_term_methods(field)
41
- getter = field
42
- setter = "#{field}="
43
-
44
- if method_defined?(getter) || method_defined?(setter)
45
- raise "accessor or getter already defined for #{field}. Fix the collisions by using the `:value` option."
46
- else
47
- # Order of prefrence for finding term value
48
- # 1. overriden getter instance method
49
- # 2. value set by setter instance method
50
- # 3. (Eventually) Mapping getter instance method
51
- # 4. instance resource getter instance method
52
- define_method getter do
53
- if instance_variable_defined?("@#{field}")
54
- return instance_variable_get("@#{field}")
55
- end
56
- _resource.send(field) if(_resource && _resource.respond_to?(field))
57
- end
58
-
59
- define_method setter do |val|
60
- instance_variable_set("@#{field}", val)
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,11 +0,0 @@
1
- module Cassie::Queries::Statement
2
- module Ordering
3
- extend ActiveSupport::Concern
4
-
5
- protected
6
-
7
- def build_order_str
8
- ""
9
- end
10
- end
11
- end
@@ -1,55 +0,0 @@
1
- module Cassie::Queries::Statement
2
- module Preparation
3
- class Cache
4
- attr_reader :data
5
-
6
- def initialize
7
- clear
8
- @monitor = Monitor.new
9
- end
10
-
11
- def write(key, value)
12
- synchronize do
13
- @data[key] = value
14
- end
15
- end
16
- def read(key)
17
- synchronize do
18
- data[key]
19
- end
20
- end
21
- def fetch(key)
22
- return read(key) if data.has_key?(key)
23
- write(key, yield) if block_given?
24
- end
25
- def clear
26
- @data = {}
27
- end
28
- def close
29
- clear
30
- end
31
-
32
- private
33
-
34
- def synchronize(&block)
35
- @monitor.synchronize(&block)
36
- end
37
- end
38
-
39
- def self.cache
40
- @cache ||= init_cache
41
- end
42
-
43
- def self.init_cache
44
- previous_cache = defined?(@cache) ? @cache : nil
45
-
46
- #TODO: research why memory story is blowing up when
47
- # serializing the Cassandra prepared statement result
48
- # @cache = ActiveSupport::Cache::MemoryStore.new
49
- @cache = Cache.new
50
-
51
- previous_cache.close if previous_cache
52
- @cache
53
- end
54
- end
55
- end
@@ -1,47 +0,0 @@
1
- require_relative 'preparation/cache'
2
-
3
- module Cassie::Queries::Statement
4
- module Preparation
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
- super
18
- end
19
-
20
- def prepare?
21
- !!prepare
22
- end
23
- end
24
-
25
- def statement
26
- statement = super
27
-
28
- if self.class.prepare?
29
- key = statement.cql if statement.respond_to?(:cql)
30
- key ||= statement.to_s
31
-
32
- unbound = statement_cache.fetch(key) do
33
- session.prepare(statement)
34
- end
35
- unbound.bind(statement.params)
36
- else
37
- statement
38
- end
39
- end
40
-
41
- private
42
-
43
- def statement_cache
44
- Cassie::Queries::Statement::Preparation.cache
45
- end
46
- end
47
- end
@@ -1,59 +0,0 @@
1
- module Cassie::Queries::Statement
2
- #
3
- #
4
- # relation "username = ?", value: :username
5
- # relation :username, :eq
6
- # relation :username, :eq, value: :method
7
- # relation :phone, :in
8
- class Relation
9
- # https://cassandra.apache.org/doc/cql3/CQL.html#selectStmt
10
-
11
- OPERATIONS = {
12
- eq: "=",
13
- lt: "<",
14
- lteq: "<=",
15
- gt: ">",
16
- gteq: ">=",
17
- contains: "CONTAINS",
18
- contains_key: "CONTAINS KEY",
19
- }
20
-
21
- attr_reader :identifier,
22
- :op_type
23
-
24
- def initialize(identifier, op_type, opts={})
25
- if Hash === op_type
26
- # custom relation is being defined:
27
- # `relation "username = ?", value: :username`
28
-
29
- # swap the 2nd arg that sucked in options hash
30
- opts.merge!(op_type)
31
-
32
- @cql = identifier
33
- @custom = true
34
- else
35
- @identifier = identifier
36
- @op_type = op_type.to_sym
37
- end
38
- end
39
-
40
- def custom?
41
- !!@custom
42
- end
43
-
44
- def to_cql
45
- cql
46
- end
47
-
48
- protected
49
-
50
- def cql
51
- # we always generate bound statements
52
- @cql ||= "#{identifier} #{OPERATIONS[op_type]} ?"
53
- end
54
-
55
- def op_type
56
- @op_type
57
- end
58
- end
59
- end
@@ -1,64 +0,0 @@
1
- require_relative 'relation'
2
-
3
- module Cassie::Queries::Statement
4
- module Relations
5
- extend ActiveSupport::Concern
6
-
7
- module ClassMethods
8
- # where :username, :eq, value: :method
9
- # where :phone, :in
10
- # were "username = ?", value: :username
11
- def where(identifier, op, opts={})
12
- relation = Relation.new(identifier, op, opts)
13
-
14
- opts[:value] ||= identifier.to_sym
15
-
16
- if Symbol === opts[:value]
17
- define_term_methods(opts[:value])
18
- end
19
-
20
- relations[relation] = opts
21
- end
22
-
23
- # a where clause is built up of multiple 'relations'
24
- def relations
25
- @relations ||= {}
26
- end
27
-
28
- private
29
-
30
- def define_term_methods(name)
31
- #TODO: this should probably only raise
32
- # if value option was nil and we
33
- # are implicilty creating getter/setters.
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."
36
- else
37
- attr_accessor name
38
- end
39
- end
40
- end
41
-
42
- # a where clause is built up of multiple 'relations'
43
- def relations
44
- self.class.relations
45
- end
46
-
47
- def build_where_and_bindings
48
- cql = ""
49
- bindings = []
50
- relation_strings = []
51
-
52
- relations.each do |r, opts|
53
- if eval_if_opt?(opts[:if])
54
- relation_strings << r.to_cql
55
- bindings << eval_value_opt(opts[:value])
56
- end
57
- end
58
-
59
- cql = "WHERE #{relation_strings.join(' AND ')}" unless bindings.empty?
60
-
61
- [cql , bindings]
62
- end
63
- end
64
- end
@@ -1,63 +0,0 @@
1
- require_relative 'relations'
2
- require_relative 'limiting'
3
- require_relative 'ordering'
4
- require_relative 'fetching'
5
-
6
- module Cassie::Queries::Statement
7
- module Selection
8
- extend ::ActiveSupport::Concern
9
-
10
- module ClassMethods
11
- #TODO: accept block to add specific selectors and aliases
12
- # select :table do |t|
13
- # t.id
14
- # t.name as: :username
15
- # end
16
- def select(table)
17
- include Relations
18
- include Limiting
19
- include Ordering
20
- include Fetching
21
-
22
- self.table = table
23
- self.identifier = :select
24
-
25
- yield(self) if block_given?
26
- end
27
-
28
- # a select clause is built up of selectors
29
- def selectors
30
- @selectors ||= []
31
- end
32
- end
33
-
34
- protected
35
-
36
- def build_select_cql_and_bindings
37
- where_str, bindings = build_where_and_bindings
38
-
39
- cql = %(
40
- SELECT #{build_select_clause}
41
- FROM #{table}
42
- #{where_str}
43
- #{build_order_str}
44
- #{build_limit_str}
45
- ).squish + ";"
46
-
47
- [cql, bindings]
48
- end
49
-
50
- # a select clause is built up of selectors
51
- def selectors
52
- self.class.selectors
53
- end
54
-
55
- def build_select_clause
56
- str = if selectors.empty?
57
- '*'
58
- else
59
- selectors.join(', ')
60
- end
61
- end
62
- end
63
- end
@@ -1,39 +0,0 @@
1
- require_relative 'assignments'
2
-
3
- module Cassie::Queries::Statement
4
- module Updating
5
- extend ::ActiveSupport::Concern
6
-
7
- module ClassMethods
8
- def update(table)
9
- include Relations
10
- include Assignments
11
-
12
- self.table = table
13
- self.identifier = :update
14
-
15
- yield(self) if block_given?
16
- end
17
- end
18
-
19
- def update(opts={})
20
- execute
21
- execution_successful?
22
- end
23
-
24
- protected
25
-
26
- def build_update_cql_and_bindings
27
- assignment_str, update_bindings = build_update_and_bindings
28
- where_str, where_bindings = build_where_and_bindings
29
-
30
- cql = %(
31
- UPDATE #{table}
32
- SET #{assignment_str}
33
- #{where_str}
34
- ).squish + ";"
35
-
36
- [cql, update_bindings + where_bindings]
37
- end
38
- end
39
- end
@@ -1,99 +0,0 @@
1
- require 'active_support/core_ext/string/filters'
2
- require_relative 'statement/preparation'
3
- require_relative 'statement/selection'
4
- require_relative 'statement/deleting'
5
- require_relative 'statement/updating'
6
- require_relative 'statement/inserting'
7
-
8
-
9
- module Cassie::Queries
10
- module Statement
11
- # https://cassandra.apache.org/doc/cql3/CQL.html#selectStmt
12
- extend ::ActiveSupport::Concern
13
-
14
- included do
15
- include Preparation
16
- include Selection
17
- include Deleting
18
- include Updating
19
- include Inserting
20
-
21
- attr_reader :result
22
-
23
- class << self
24
- attr_accessor :table
25
- attr_accessor :identifier
26
- end
27
- end
28
-
29
- def table
30
- self.class.table
31
- end
32
-
33
- # Executes the statment, populates result
34
- # returns true or false indicating a successful execution or not
35
- def execute
36
- @result = session.execute(statement)
37
- execution_successful?
38
- end
39
-
40
- # returns a CQL string, or a Cassandra::Statement
41
- # that is ready for execution
42
- def statement
43
- Cassandra::Statements::Simple.new(*build_cql_and_bindings)
44
- end
45
-
46
- protected
47
-
48
- def build_cql_and_bindings
49
- if identifier
50
- send "build_#{identifier}_cql_and_bindings"
51
- else
52
- [cql, bindings]
53
- end
54
- end
55
-
56
- def execution_successful?
57
- #TODO: rethink this, it knows too much
58
- raise "execution not complete, no results to parse" unless result
59
-
60
- # empty select
61
- return true if result.empty?
62
-
63
- # failed upsert
64
- return false if (!result.rows.first["[applied]"].nil?) && (result.rows.first["[applied]"] == false)
65
-
66
- true
67
- end
68
-
69
- private
70
-
71
- def identifier
72
- self.class.identifier
73
- end
74
-
75
- def eval_if_opt?(value)
76
- case value
77
- when nil
78
- true # if is true by default
79
- when Symbol
80
- !!send(value)
81
- when String
82
- !!eval(value)
83
- else
84
- !!value
85
- end
86
- end
87
-
88
- def eval_value_opt(value)
89
- case value
90
- when Symbol
91
- send(value)
92
- when String
93
- eval(value)
94
- else
95
- value
96
- end
97
- end
98
- end
99
- end
data/lib/cassie/query.rb DELETED
@@ -1,25 +0,0 @@
1
- module Cassie
2
- require 'cassandra'
3
- require_relative 'queries/session'
4
- require_relative 'queries/statement'
5
- require_relative 'queries/pagination'
6
- require_relative 'queries/instrumentation'
7
- require_relative 'queries/logging'
8
-
9
- class Query
10
- include Queries::Session
11
- include Queries::Statement
12
- include Queries::Pagination
13
- include Queries::Instrumentation
14
- include Queries::Logging
15
-
16
- def initialize(*args)
17
- value = super(*args)
18
- after_initialize(*args)
19
- value
20
- end
21
-
22
- def after_initialize(*args)
23
- end
24
- end
25
- end
@@ -1,16 +0,0 @@
1
- # Active Support used for
2
- # * include convenience via ActiveSupport::Concern
3
- # * string extensions
4
- # * notification pub/sub
5
- # * log formatting
6
- #
7
- # We require/autoload extensions only as needed,
8
- # this base require has almost no overhead
9
- #
10
- # http://guides.rubyonrails.org/active_support_core_extensions.html
11
- require 'active_support'
12
-
13
- # Use cassie directory instead of cassie-queries
14
- # to allow sharing of cassie module with other libraries
15
- # but maintain folder/file/module/class naming conventions
16
- require_relative 'cassie/query'