arel_extensions 1.1.9 → 1.1.10

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: 57e8a31276fb8b6bba831c0934378f6e45150e86
4
- data.tar.gz: 36aa4b3a0792e618cc2fce1ea7afd0736b2229f6
3
+ metadata.gz: 708dfbc3e662298b3d0cb782b5555182ea9758a3
4
+ data.tar.gz: 71bb77c55986474cf7a55b4687a2eca93517df47
5
5
  SHA512:
6
- metadata.gz: 0ea1d6ad9ee4b4417edee7773cc86982e8dc844e5e6d907fbf859c806b152a7b0dd96832fa452d760157e26a5774282544761aa045633ad19592dc6fea377585
7
- data.tar.gz: 1ee956c003f1d2edcae2d57c38b3e66205091c66323e9dda0c0c46138b9b0fe11679a7ad5c92aecda65e6cd9f0f03f4a1d59fb30f68a8c0cedbf6d8e39c39062
6
+ metadata.gz: b98769af5db36a1ad6bc978e5ca5787ef423ad4be3c8708024e199825809fb75fa6a34b7a92468842a55679dd11e4cfb3fcc5dc1105fca6bf7d289f0a120dca0
7
+ data.tar.gz: ff10289ae7c04a4849bddcdcf5046e9adc7dd20913ab37914d0a81e4825597ce9bff4273608ea524607086191df016d4e6719bf5e3d06258c9135a1756723a65
@@ -61,7 +61,6 @@ require 'arel_extensions/common_sql_functions'
61
61
 
62
62
  require 'arel_extensions/nodes/union'
63
63
  require 'arel_extensions/nodes/union_all'
64
- require 'arel_extensions/nodes/as'
65
64
  require 'arel_extensions/nodes/case'
66
65
  require 'arel_extensions/nodes/soundex'
67
66
  require 'arel_extensions/nodes/cast'
@@ -75,8 +74,16 @@ module Arel
75
74
  end
76
75
 
77
76
  def self.shorten s
78
- Base64.urlsafe_encode64(Digest::MD5.new.digest(s)).tr('=', '').tr('-', '_')
79
- end
77
+ Base64.urlsafe_encode64(Digest::MD5.new.digest(s)).tr('=', '').tr('-', '_')
78
+ end
79
+
80
+ def self.json *expr
81
+ if expr.length == 1
82
+ ArelExtensions::Nodes::Json.new(expr.first)
83
+ else
84
+ ArelExtensions::Nodes::Json.new(expr)
85
+ end
86
+ end
80
87
  end
81
88
 
82
89
  Arel::Attributes::Attribute.class_eval do
@@ -129,7 +136,7 @@ Arel::SelectManager.class_eval do
129
136
  include ArelExtensions::Nodes
130
137
  end
131
138
 
132
- Arel::Nodes::As.class_eval do
139
+ Arel::Nodes::As.class_eval do
133
140
  include ArelExtensions::Nodes
134
141
  end
135
142
 
@@ -1,106 +1,106 @@
1
1
  module ArelExtensions
2
- module Nodes
3
- if Arel::VERSION < "7.1.0"
4
- class Case < Arel::Nodes::Node
5
- attr_accessor :case, :conditions, :default
2
+ module Nodes
3
+ if Arel::VERSION < "7.1.0"
4
+ class Case < Arel::Nodes::Node
5
+ attr_accessor :case, :conditions, :default
6
6
 
7
- def initialize expression = nil, default = nil
8
- @case = expression
9
- @conditions = []
10
- @default = default
11
- end
7
+ def initialize expression = nil, default = nil
8
+ @case = expression
9
+ @conditions = []
10
+ @default = default
11
+ end
12
12
 
13
- class When < Arel::Nodes::Binary # :nodoc:
14
- end
13
+ class When < Arel::Nodes::Binary # :nodoc:
14
+ end
15
15
 
16
- class Else < Arel::Nodes::Unary # :nodoc:
17
- end
16
+ class Else < Arel::Nodes::Unary # :nodoc:
17
+ end
18
18
 
19
- end
20
- else
21
- class Case < Arel::Nodes::Case
22
- class When < Arel::Nodes::When # :nodoc:
23
- end
24
- class Else < Arel::Nodes::Else # :nodoc:
25
- end
26
- end
27
- end
19
+ end
20
+ else
21
+ class Case < Arel::Nodes::Case
22
+ class When < Arel::Nodes::When # :nodoc:
23
+ end
24
+ class Else < Arel::Nodes::Else # :nodoc:
25
+ end
26
+ end
27
+ end
28
28
 
29
- ArelExtensions::Nodes::Case.class_eval do
30
- include Arel::Expressions
31
- include Arel::OrderPredications
32
- include ArelExtensions::Math
33
- include ArelExtensions::Comparators
34
- include ArelExtensions::Predications
35
- include ArelExtensions::MathFunctions
36
- include ArelExtensions::StringFunctions
37
- include ArelExtensions::NullFunctions
29
+ ArelExtensions::Nodes::Case.class_eval do
30
+ include Arel::Expressions
31
+ include Arel::OrderPredications
32
+ include ArelExtensions::Math
33
+ include ArelExtensions::Comparators
34
+ include ArelExtensions::Predications
35
+ include ArelExtensions::MathFunctions
36
+ include ArelExtensions::StringFunctions
37
+ include ArelExtensions::NullFunctions
38
38
 
39
- def return_type
40
- obj = if @conditions.length > 0
41
- @conditions.last.right
42
- elsif @default
43
- @default.expr
44
- else
45
- nil
46
- end
47
- if obj.respond_to?(:return_type)
48
- obj.return_type
49
- else
50
- case obj
51
- when Integer, Float
52
- :number
53
- when Date, DateTime,Time
54
- :datetime
55
- when Arel::Attributes::Attribute
56
- begin
57
- Arel::Table.engine.connection.schema_cache.columns_hash(obj.relation.table_name)[obj.name.to_s].type
58
- rescue Exception
59
- :string
60
- end
61
- else
62
- :string
63
- end
64
- end
65
- end
39
+ def return_type
40
+ obj = if @conditions.length > 0
41
+ @conditions.last.right
42
+ elsif @default
43
+ @default.expr
44
+ else
45
+ nil
46
+ end
47
+ if obj.respond_to?(:return_type)
48
+ obj.return_type
49
+ else
50
+ case obj
51
+ when Integer, Float
52
+ :number
53
+ when Date, DateTime,Time
54
+ :datetime
55
+ when Arel::Attributes::Attribute
56
+ begin
57
+ Arel::Table.engine.connection.schema_cache.columns_hash(obj.relation.table_name)[obj.name.to_s].type
58
+ rescue Exception
59
+ :string
60
+ end
61
+ else
62
+ :string
63
+ end
64
+ end
65
+ end
66
66
 
67
- def when condition, expression = nil
68
- @conditions << Case::When.new(condition, expression)
69
- self
70
- end
67
+ def when condition, expression = nil
68
+ @conditions << Case::When.new(condition, expression)
69
+ self
70
+ end
71
71
 
72
- def then expression
73
- @conditions.last.right = expression
74
- self
75
- end
72
+ def then expression
73
+ @conditions.last.right = expression
74
+ self
75
+ end
76
76
 
77
- def else expression
78
- @default = Case::Else.new expression
79
- self
80
- end
77
+ def else expression
78
+ @default = Case::Else.new expression
79
+ self
80
+ end
81
81
 
82
- def initialize_copy other
83
- super
84
- @case = @case.clone if @case
85
- @conditions = @conditions.map { |x| x.clone }
86
- @default = @default.clone if @default
87
- end
82
+ def initialize_copy other
83
+ super
84
+ @case = @case.clone if @case
85
+ @conditions = @conditions.map { |x| x.clone }
86
+ @default = @default.clone if @default
87
+ end
88
88
 
89
- def hash
90
- [@case, @conditions, @default].hash
91
- end
89
+ def hash
90
+ [@case, @conditions, @default].hash
91
+ end
92
92
 
93
- def eql? other
94
- self.class == other.class &&
95
- self.case == other.case &&
96
- self.conditions == other.conditions &&
97
- self.default == other.default
98
- end
99
- alias :== :eql?
93
+ def eql? other
94
+ self.class == other.class &&
95
+ self.case == other.case &&
96
+ self.conditions == other.conditions &&
97
+ self.default == other.default
98
+ end
99
+ alias :== :eql?
100
100
 
101
- def as other
102
- ArelExtensions::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
103
- end
104
- end
105
- end
101
+ def as other
102
+ Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
103
+ end
104
+ end
105
+ end
106
106
  end
@@ -20,11 +20,6 @@ module ArelExtensions
20
20
  @expressions[1]
21
21
  end
22
22
 
23
-
24
- #def as other
25
- # Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other.to_s)
26
- #end
27
-
28
23
  end
29
24
  end
30
25
  end
@@ -17,7 +17,7 @@ module ArelExtensions
17
17
  end
18
18
 
19
19
  def as other
20
- ArelExtensions::Nodes::As.new(self, Arel.sql(other))
20
+ Arel::Nodes::As.new(self, Arel.sql(other))
21
21
  end
22
22
 
23
23
  def expr
@@ -17,8 +17,13 @@ module ArelExtensions
17
17
  def set key, value
18
18
  JsonSet.new(self,key,value)
19
19
  end
20
+
21
+ def group as_array = true, orders= nil
22
+ JsonGroup.new(self,as_array, orders)
23
+ end
24
+
20
25
  end
21
-
26
+
22
27
  class Json < JsonNode
23
28
 
24
29
  def initialize *expr
@@ -56,6 +61,22 @@ module ArelExtensions
56
61
  class JsonMerge < JsonNode
57
62
  end
58
63
 
64
+ class JsonGroup < JsonNode
65
+ attr_accessor :as_array, :orders
66
+
67
+ def initialize json, as_array = true, orders = nil
68
+ @hash = as_array ? json : json.hash
69
+ @as_array = as_array
70
+ if orders
71
+ if orders.is_a?(Array)
72
+ @orders = orders
73
+ else
74
+ @orders = [orders]
75
+ end
76
+ end
77
+ end
78
+ end
79
+
59
80
  class JsonGet < JsonNode
60
81
  attr_accessor :key
61
82
 
@@ -14,10 +14,6 @@ module ArelExtensions
14
14
  @expressions.first
15
15
  end
16
16
 
17
- #def as other
18
- # Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
19
- #end
20
-
21
17
  end
22
18
  end
23
19
  end
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.1.9".freeze
2
+ VERSION = "1.1.10".freeze
3
3
  end
@@ -386,7 +386,16 @@ module ArelExtensions
386
386
  collector
387
387
  end
388
388
 
389
+ # JSON if implemented only after 10.2.3 in MariaDb and 5.7 in MySql
390
+ def json_supported?
391
+ Arel::Table.engine.connection.send(:mariadb?) &&
392
+ Arel::Table.engine.connection.send(:version) >= '10.2.3' ||
393
+ !Arel::Table.engine.connection.send(:mariadb?) &&
394
+ Arel::Table.engine.connection.send(:version) >= '5.7.0'
395
+ end
396
+
389
397
  def visit_ArelExtensions_Nodes_Json o,collector
398
+ return super if !json_supported?
390
399
  case o.hash
391
400
  when Array
392
401
  collector << 'JSON_ARRAY('
@@ -454,6 +463,35 @@ module ArelExtensions
454
463
  collector
455
464
  end
456
465
 
466
+ def visit_ArelExtensions_Nodes_JsonGroup o, collector
467
+ if o.as_array
468
+ collector << 'JSON_ARRAYAGG('
469
+ collector = visit o.hash, collector
470
+ collector << ')'
471
+ else
472
+ case o.hash
473
+ when Hash
474
+ collector << 'JSON_MERGE_PATCH(' if o.hash.length > 1
475
+ o.hash.each.with_index do |(k,v),i|
476
+ if i != 0
477
+ collector << Arel::Visitors::MySQL::COMMA
478
+ end
479
+ collector << 'JSON_OBJECTAGG('
480
+ collector = visit k, collector
481
+ collector << Arel::Visitors::MySQL::COMMA
482
+ collector = visit v, collector
483
+ collector << ')'
484
+ end
485
+ collector << ')' if o.hash.length > 1
486
+ else
487
+ collector << 'JSON_OBJECTAGG('
488
+ collector = visit o.hash, collector
489
+ collector << ')'
490
+ end
491
+ end
492
+ collector
493
+ end
494
+
457
495
  end
458
496
  end
459
497
  end
@@ -536,6 +536,10 @@ module ArelExtensions
536
536
  collector
537
537
  end
538
538
 
539
+ def visit_ArelExtensions_Nodes_As o, collector
540
+ visit_Arel_Nodes_As o, collector
541
+ end
542
+
539
543
  alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
540
544
  def visit_Arel_Attributes_Attribute o, collector
541
545
  join_name = o.relation.table_alias || o.relation.name
@@ -464,6 +464,33 @@ module ArelExtensions
464
464
  collector
465
465
  end
466
466
 
467
+ def visit_ArelExtensions_Nodes_JsonGroup o, collector
468
+ if o.as_array
469
+ collector << 'jsonb_agg('
470
+ collector = visit o.hash, collector
471
+ collector << ')'
472
+ else
473
+ case o.hash
474
+ when Hash
475
+ o.hash.each.with_index do |(k,v),i|
476
+ if i != 0
477
+ collector << ' || '
478
+ end
479
+ collector << 'jsonb_object_agg('
480
+ collector = visit k, collector
481
+ collector << Arel::Visitors::MySQL::COMMA
482
+ collector = visit v, collector
483
+ collector << ')'
484
+ end
485
+ else
486
+ collector << 'jsonb_object_agg('
487
+ collector = visit o.hash, collector
488
+ collector << ')'
489
+ end
490
+ end
491
+ collector
492
+ end
493
+
467
494
  end
468
495
  end
469
496
  end
@@ -459,20 +459,7 @@ module ArelExtensions
459
459
  collector = visit o.right, collector
460
460
  collector
461
461
  end
462
-
463
- def visit_ArelExtensions_Nodes_As o, collector
464
- if o.left.is_a?(ArelExtensions::Nodes::Union) || o.left.is_a?(ArelExtensions::Nodes::UnionAll)
465
- collector << "("
466
- collector = visit o.left, collector
467
- collector << ") "
468
- visit o.right, collector
469
- else
470
- collector = visit o.left, collector
471
- collector << " AS "
472
- visit o.right, collector
473
- end
474
- end
475
-
462
+
476
463
  def visit_ArelExtensions_Nodes_Case o, collector
477
464
  collector << "CASE "
478
465
  if o.case
@@ -591,7 +578,7 @@ module ArelExtensions
591
578
  res += ', '
592
579
  end
593
580
  res += Arel::Nodes.build_quoted('"')+k + '": '
594
- if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.try(:return_type) == :string) # TODO : remove the try
581
+ if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.respond_to?(:return_type) && v.return_type == :string)
595
582
  res = res + '"' + v + '"'
596
583
  else
597
584
  res += v
@@ -605,6 +592,31 @@ module ArelExtensions
605
592
  collector
606
593
  end
607
594
 
595
+ def visit_ArelExtensions_Nodes_JsonGroup o, collector
596
+ if o.as_array
597
+ res = Arel::Nodes.build_quoted('[') + (o.orders ? o.hash.group_concat(', ',o.orders) : o.hash.group_concat(', ')) + ']'
598
+ collector = visit res, collector
599
+ else
600
+ res = Arel::Nodes.build_quoted('{')
601
+ orders = o.orders || o.hash.keys
602
+ o.hash.each.with_index do |(k,v),i|
603
+ if i != 0
604
+ res = res + ', '
605
+ end
606
+ kv = Arel::Nodes.build_quoted('"')+k + '": '
607
+ if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.respond_to?(:return_type) && v.return_type == :string)
608
+ kv = kv + '"' + v + '"'
609
+ else
610
+ kv += v
611
+ end
612
+ res = res + kv.group_concat(', ',orders)
613
+ end
614
+ res = res + '}'
615
+ collector = visit res, collector
616
+ end
617
+ collector
618
+ end
619
+
608
620
  end
609
621
  end
610
622
  end
@@ -694,18 +694,25 @@ module ArelExtensions
694
694
  def test_json
695
695
  skip "Can't be tested on travis"
696
696
  #creation
697
- assert_equal 'Arthur', t(@arthur,ArelExtensions::Nodes::Json.new(@name))
698
- assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,ArelExtensions::Nodes::Json.new(@name,@name)))
699
- assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,ArelExtensions::Nodes::Json.new({@name => @name,@name+"2" => @name+@name})))
700
- assert_equal ({"Arthur" => "Arthur","Arthur2" => 1}), parse_json(t(@arthur,ArelExtensions::Nodes::Json.new({@name => @name,@name+"2" => 1})))
701
- assert_equal ([{"age" => 21},{"name" => "Arthur","score" => 65.62}]), parse_json(t(@arthur,ArelExtensions::Nodes::Json.new([{age: @age},{name: @name,score: @score}])))
702
-
697
+ assert_equal 'Arthur', t(@arthur,Arel.json(@name))
698
+ assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,Arel.json(@name,@name)))
699
+ assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => @name+@name})))
700
+ assert_equal ({"Arthur" => "Arthur","Arthur2" => 1}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => 1})))
701
+ assert_equal ([{"age" => 21},{"name" => "Arthur","score" => 65.62}]), parse_json(t(@arthur,Arel.json([{age: @age},{name: @name,score: @score}])))
702
+
703
+ # aggregate
704
+ assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure"}),
705
+ parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(false)))
706
+ assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure", "Laure"=>25, "Lucas"=>5, "Myung"=>23, "Sophie"=>15}),
707
+ parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
708
+ assert_equal ([{"5" => "Lucas"},{ "15" => "Sophie"},{ "23" => "Myung"},{ "25" => "Laure"}]),
709
+ parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(true,[@age])))
710
+
703
711
  skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
704
-
705
712
  #get
706
- h1 = ArelExtensions::Nodes::Json.new({@name => @name+@name,@name+"2" => 1})
713
+ h1 = Arel.json({@name => @name+@name,@name+"2" => 1})
707
714
  assert_equal "ArthurArthur", parse_json(t(@arthur,h1.get(@name)))
708
- h2 = ArelExtensions::Nodes::Json.new([{age: @age},{name: @name,score: @score}])
715
+ h2 = Arel.json([{age: @age},{name: @name,score: @score}])
709
716
  assert_equal ({"age" => 21}), parse_json(t(@arthur,h2.get(0)))
710
717
  assert_equal 21, parse_json(t(@arthur,h2.get(0).get('age')))
711
718
  assert_nil t(@arthur,h2.get('age'))
@@ -724,7 +731,7 @@ module ArelExtensions
724
731
  name = @arthur.select(@name.as('NaMe')).first.attributes
725
732
  assert_equal 'Arthur', name["NaMe"] || name["name"] #because of Oracle
726
733
  assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
727
- assert_equal 'Arthur', @arthur.select(@name.as('Na-Me')).first.attributes["Na-Me"]
734
+ assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
728
735
  end
729
736
  end
730
737
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.9
4
+ version: 1.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yann Azoury
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-04-01 00:00:00.000000000 Z
13
+ date: 2019-04-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: arel
@@ -120,7 +120,6 @@ files:
120
120
  - lib/arel_extensions/math_functions.rb
121
121
  - lib/arel_extensions/nodes.rb
122
122
  - lib/arel_extensions/nodes/abs.rb
123
- - lib/arel_extensions/nodes/as.rb
124
123
  - lib/arel_extensions/nodes/blank.rb
125
124
  - lib/arel_extensions/nodes/case.rb
126
125
  - lib/arel_extensions/nodes/cast.rb
@@ -1,12 +0,0 @@
1
- module ArelExtensions
2
- module Nodes
3
- class As < Arel::Nodes::As
4
-
5
- def initialize left,right
6
- return super(left,right)
7
- end
8
- end
9
- end
10
- end
11
-
12
-