sunstone 1.6.8 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/active_record/connection_adapters/sunstone/database_statements.rb +7 -6
- data/lib/arel/collectors/sunstone.rb +4 -3
- data/lib/arel/visitors/sunstone.rb +22 -12
- data/lib/ext/active_record/calculations.rb +28 -0
- data/lib/sunstone.rb +1 -0
- data/sunstone.gemspec +1 -1
- metadata +4 -4
- data/lib/sunstone/model/associations.rb +0 -89
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f199678115b092025dfcacc613338734a4fcd233
|
4
|
+
data.tar.gz: 0cf2e737fff1dd02536ceacf622f702915efc292
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b950838b5a920260ada34a8e40bcf13cf99740f0348b765458ff380105d264202993b3b0d399ea671412722dc637e5d24cb2db7279db2f4dbe844950bf83f33
|
7
|
+
data.tar.gz: f5413976e8d8a1bbaded1394701cf81bc854953e4a029e792b2b87825e543f258222448e9141a79cf85af42f9cf812c8a93869af80defe33011e40b9f9d4fb64
|
@@ -19,16 +19,17 @@ module ActiveRecord
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def exec_query(arel, name = 'SAR', binds = [])
|
22
|
-
|
22
|
+
sar = to_sar(arel, binds)
|
23
|
+
result = exec(sar, name)
|
23
24
|
|
24
|
-
if
|
25
|
-
|
25
|
+
if sar.instance_variable_get(:@sunstone_calculation)
|
26
|
+
# this is a count, min, max.... yea i know..
|
27
|
+
ActiveRecord::Result.new(['all'], [result], {:all => type_map.lookup('integer')})
|
26
28
|
else
|
27
|
-
|
28
|
-
ActiveRecord::Result.new(['all'], [[result]], {:all => type_map.lookup('integer')})
|
29
|
+
ActiveRecord::Result.new(result[0] ? result[0].keys : [], result.map{|r| r.values})
|
29
30
|
end
|
30
31
|
end
|
31
|
-
|
32
|
+
|
32
33
|
end
|
33
34
|
end
|
34
35
|
end
|
@@ -62,9 +62,9 @@ module Arel
|
|
62
62
|
case operation
|
63
63
|
when :count
|
64
64
|
path += "/#{operation}"
|
65
|
-
when :
|
66
|
-
|
67
|
-
|
65
|
+
when :calculate
|
66
|
+
path += "/calculate"
|
67
|
+
get_params[:select] = columns
|
68
68
|
when :update, :delete
|
69
69
|
path += "/#{get_params[:where]['id']}"
|
70
70
|
get_params.delete(:where)
|
@@ -75,6 +75,7 @@ module Arel
|
|
75
75
|
end
|
76
76
|
|
77
77
|
request = request_type.new(path)
|
78
|
+
request.instance_variable_set(:@sunstone_calculation, true) if operation == :calculate
|
78
79
|
|
79
80
|
if updates
|
80
81
|
request.body = body
|
@@ -46,7 +46,7 @@ module Arel
|
|
46
46
|
collector.request_type = Net::HTTP::Get
|
47
47
|
|
48
48
|
unless o.projections.empty?
|
49
|
-
|
49
|
+
o.projections.each { |proj| visit(proj, collector) }
|
50
50
|
else
|
51
51
|
collector.operation = :select
|
52
52
|
end
|
@@ -391,8 +391,11 @@ module Arel
|
|
391
391
|
# end
|
392
392
|
#
|
393
393
|
def visit_Arel_Nodes_Count o, collector
|
394
|
-
collector.operation = :
|
395
|
-
|
394
|
+
collector.operation = :calculate
|
395
|
+
|
396
|
+
collector.columns ||= []
|
397
|
+
collector.columns << {:count => (o.expressions.first.is_a?(Arel::Attributes::Attribute) ? o.expressions.first.name : o.expressions.first) }
|
398
|
+
# collector.columns = visit o.expressions.first, collector
|
396
399
|
end
|
397
400
|
#
|
398
401
|
# def visit_Arel_Nodes_Sum o, collector
|
@@ -400,35 +403,42 @@ module Arel
|
|
400
403
|
# end
|
401
404
|
#
|
402
405
|
def visit_Arel_Nodes_Max o, collector
|
403
|
-
collector.operation = :
|
406
|
+
collector.operation = :calculate
|
407
|
+
|
408
|
+
collector.columns ||= []
|
404
409
|
if o.expressions.first.is_a?(Arel::Attributes::Attribute)
|
405
410
|
relation = o.expressions.first.relation
|
406
411
|
join_name = relation.table_alias || relation.name
|
407
|
-
collector.columns
|
412
|
+
collector.columns << {:maximum => join_name ? o.expressions.first.name : "#{join_name}.#{o.expressions.first.name}"}
|
408
413
|
else
|
409
|
-
collector.columns
|
414
|
+
collector.columns << {:maximum => o.expressions.first}
|
410
415
|
end
|
411
416
|
end
|
412
417
|
|
413
418
|
def visit_Arel_Nodes_Min o, collector
|
414
|
-
collector.operation = :
|
419
|
+
collector.operation = :calculate
|
420
|
+
|
421
|
+
collector.columns ||= []
|
415
422
|
if o.expressions.first.is_a?(Arel::Attributes::Attribute)
|
416
423
|
relation = o.expressions.first.relation
|
417
424
|
join_name = relation.table_alias || relation.name
|
418
|
-
collector.columns
|
425
|
+
collector.columns << {:minimum => join_name ? o.expressions.first.name : "#{join_name}.#{o.expressions.first.name}"}
|
419
426
|
else
|
420
|
-
collector.columns
|
427
|
+
collector.columns << {:minimum => o.expressions.first}
|
421
428
|
end
|
422
429
|
end
|
423
430
|
|
424
431
|
def visit_Arel_Nodes_Avg o, collector
|
425
|
-
collector.operation = :
|
432
|
+
collector.operation = :calculate
|
433
|
+
|
434
|
+
collector.columns ||= []
|
426
435
|
if o.expressions.first.is_a?(Arel::Attributes::Attribute)
|
427
436
|
relation = o.expressions.first.relation
|
428
437
|
join_name = relation.table_alias || relation.name
|
429
|
-
collector.columns
|
438
|
+
collector.columns << {:average => join_name ? o.expressions.first.name : "#{join_name}.#{o.expressions.first.name}"}
|
430
439
|
else
|
431
|
-
|
440
|
+
|
441
|
+
collector.columns << {:average => o.expressions.first}
|
432
442
|
end
|
433
443
|
end
|
434
444
|
#
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Calculations
|
3
|
+
def pluck(*column_names)
|
4
|
+
|
5
|
+
# column_names.map! do |column_name|
|
6
|
+
# if column_name.is_a?(Symbol) && attribute_alias?(column_name)
|
7
|
+
# attribute_alias(column_name)
|
8
|
+
# else
|
9
|
+
# column_name.to_s
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
|
13
|
+
if has_include?(column_names.first)
|
14
|
+
construct_relation_for_association_calculations.pluck(*column_names)
|
15
|
+
else
|
16
|
+
relation = spawn
|
17
|
+
relation.select_values = column_names.map { |cn|
|
18
|
+
columns_hash.key?(cn) ? arel_table[cn] : cn
|
19
|
+
}
|
20
|
+
|
21
|
+
result = klass.connection.exec_query(relation.arel, nil, relation.arel.bind_values + bind_values)
|
22
|
+
result.cast_values(klass.column_types)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
data/lib/sunstone.rb
CHANGED
@@ -12,6 +12,7 @@ require 'sunstone/connection'
|
|
12
12
|
require 'sunstone/exception'
|
13
13
|
require 'ext/active_record/statement_cache'
|
14
14
|
require 'ext/active_record/relation'
|
15
|
+
require 'ext/active_record/calculations'
|
15
16
|
require 'ext/active_record/associations/builder/has_and_belongs_to_many'
|
16
17
|
|
17
18
|
require 'ext/arel/select_manager'
|
data/sunstone.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sunstone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -270,6 +270,7 @@ files:
|
|
270
270
|
- lib/arel/visitors/sunstone.rb
|
271
271
|
- lib/ext/active_record/associations/builder/has_and_belongs_to_many.rb
|
272
272
|
- lib/ext/active_record/batches.rb
|
273
|
+
- lib/ext/active_record/calculations.rb
|
273
274
|
- lib/ext/active_record/finder_methods.rb
|
274
275
|
- lib/ext/active_record/relation.rb
|
275
276
|
- lib/ext/active_record/statement_cache.rb
|
@@ -279,7 +280,6 @@ files:
|
|
279
280
|
- lib/sunstone.rb
|
280
281
|
- lib/sunstone/connection.rb
|
281
282
|
- lib/sunstone/exception.rb
|
282
|
-
- lib/sunstone/model/associations.rb
|
283
283
|
- lib/sunstone/parser.rb
|
284
284
|
- sunstone.gemspec
|
285
285
|
- test/sunstone/connection_test.rb
|
@@ -305,7 +305,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
305
305
|
version: '0'
|
306
306
|
requirements: []
|
307
307
|
rubyforge_project:
|
308
|
-
rubygems_version: 2.
|
308
|
+
rubygems_version: 2.4.5
|
309
309
|
signing_key:
|
310
310
|
specification_version: 4
|
311
311
|
summary: A library for interacting with REST APIs
|
@@ -1,89 +0,0 @@
|
|
1
|
-
module Sunstone
|
2
|
-
class Model
|
3
|
-
|
4
|
-
module Associations
|
5
|
-
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
attr_accessor :assoications
|
9
|
-
|
10
|
-
def initialize(*)
|
11
|
-
super
|
12
|
-
@associations = {}
|
13
|
-
end
|
14
|
-
|
15
|
-
def reflect_on_associations
|
16
|
-
self.class.reflect_on_associations
|
17
|
-
end
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
|
21
|
-
def inherited(subclass)
|
22
|
-
super
|
23
|
-
subclass.initialize_associations
|
24
|
-
end
|
25
|
-
|
26
|
-
def initialize_associations
|
27
|
-
@associations = {}
|
28
|
-
end
|
29
|
-
|
30
|
-
def reflect_on_associations
|
31
|
-
@associations
|
32
|
-
end
|
33
|
-
|
34
|
-
def belongs_to(name, options = {})
|
35
|
-
@associations[name] = {
|
36
|
-
:name => name,
|
37
|
-
:macro => :belongs_to,
|
38
|
-
:klass => (options[:class_name] || name).to_s.camelize.constantize,
|
39
|
-
:foreign_key => (options[:foreign_key] || :"#{name}_id")
|
40
|
-
}
|
41
|
-
|
42
|
-
attribute(@associations[name][:foreign_key], :integer)
|
43
|
-
define_association_reader(@associations[name])
|
44
|
-
define_association_writer(@associations[name])
|
45
|
-
end
|
46
|
-
|
47
|
-
def has_many(name, options = {})
|
48
|
-
@associations[name] = {
|
49
|
-
:name => name,
|
50
|
-
:macro => :has_many,
|
51
|
-
:klass => (options[:class_name] || name.to_s.singularize).to_s.camelize.constantize
|
52
|
-
}
|
53
|
-
|
54
|
-
define_association_reader(@associations[name])
|
55
|
-
define_association_writer(@associations[name])
|
56
|
-
end
|
57
|
-
|
58
|
-
def define_association_reader(association)
|
59
|
-
# if association[:macro] == :belongs_to
|
60
|
-
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
61
|
-
def #{association[:name]}
|
62
|
-
@associations[:#{association[:name]}]
|
63
|
-
end
|
64
|
-
EOV
|
65
|
-
# end
|
66
|
-
end
|
67
|
-
|
68
|
-
def define_association_writer(association)
|
69
|
-
if association[:macro] == :belongs_to
|
70
|
-
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
71
|
-
def #{association[:name]}=(value)
|
72
|
-
self.#{association[:foreign_key]} = value.id if !value.nil?
|
73
|
-
@associations[:#{association[:name]}] = value
|
74
|
-
end
|
75
|
-
EOV
|
76
|
-
elsif association[:macro] == :has_many
|
77
|
-
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
78
|
-
def #{association[:name]}=(value)
|
79
|
-
@associations[:#{association[:name]}] = value
|
80
|
-
end
|
81
|
-
EOV
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|