arel_extensions 0.9.6 → 0.9.7

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: 709b543bdf84952b555236ce66c94f37e33b4183
4
- data.tar.gz: 053561c6aa304247471bf9effb7712eb913ec281
3
+ metadata.gz: e6b6035bcab431e9db110bac526dba5d7ae50cf9
4
+ data.tar.gz: afb3bd312dbcd6ecc15ba1658b4ad2229f47e8d7
5
5
  SHA512:
6
- metadata.gz: 72d08bc341ea513e51f0650cc1677b781929f4af3a2aff55af45c5044643cecd9d7fd82caaa353e4cf8a807477d46c8c2fe394d741d607df9726eb29c623c0a9
7
- data.tar.gz: 647156dfc77c72a0bef98112815ed16b050a7523402608c439ddbb704345bea69d990a4df8bc08600426bf92de24f2358cdd0196e1c423166d59378ea20719da
6
+ metadata.gz: f98fda0e062afc38ab6b9b10d9f72c857b348551095f396e0821b953296c9097067593ccdc50b764f35e5fb30e8994ef5c445491e7a0fc94a16ca19ed251da9f
7
+ data.tar.gz: e616f743571bde26c649646067dc3d25f8a60abdf8c479c204761ea2851824536534ba5d31d519ff3bc3b8b3fd04dc6056e696688fc732dfe2003282bb908742
data/SQL_Challenges.md CHANGED
@@ -7,7 +7,7 @@ A good way could be to create user defined functions to ensure a total transpare
7
7
 
8
8
  ## SQLite (without extension)
9
9
  - FIND_IN_SET
10
- - LOCATE
10
+ - LOCATE / instr
11
11
  - REGEXP
12
12
  - SOUNDEX
13
13
 
data/TODO CHANGED
@@ -17,7 +17,6 @@ Code quality:
17
17
 
18
18
 
19
19
  New features:
20
- - UPCASE / DOWNCASE
21
20
  - POSIX format numbers (%.2f)
22
21
  - easy unions
23
22
  - cast, to_char
@@ -12,6 +12,13 @@ module ArelExtensions
12
12
  #Date and integer adds or subtracts a specified time interval from a date.
13
13
  def +(other)
14
14
  return ArelExtensions::Nodes::Concat.new [self, other] if self.is_a?(Arel::Nodes::Quoted)
15
+ if self.is_a?(Arel::Nodes::Grouping)
16
+ if self.expr.left.is_a?(String) || self.expr.right.is_a?(String)
17
+ return ArelExtensions::Nodes::Concat.new [self, other]
18
+ else
19
+ return Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
20
+ end
21
+ end
15
22
  return case self.class.return_type
16
23
  when :string, :text
17
24
  ArelExtensions::Nodes::Concat.new [self, other]
@@ -0,0 +1,11 @@
1
+ module ArelExtensions
2
+ module Nodes
3
+ class Downcase < Function
4
+ @@return_type = :string
5
+ end
6
+
7
+ class Upcase < Function
8
+ @@return_type = :string
9
+ end
10
+ end
11
+ end
@@ -1,6 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Locate < Function
4
+ @@return_type = :integer
4
5
 
5
6
  def initialize expr
6
7
  tab = expr.map do |arg|
@@ -9,10 +10,6 @@ module ArelExtensions
9
10
  return super(tab)
10
11
  end
11
12
 
12
- def +(other)
13
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
14
- end
15
-
16
13
  end
17
14
  end
18
15
  end
@@ -1,6 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Substring < Function
4
+ @@return_type = :string
4
5
 
5
6
  def initialize expr
6
7
  tab = [convert_to_node(expr[0]), convert_to_node(expr[1])]
@@ -12,9 +13,10 @@ module ArelExtensions
12
13
  return super(tab)
13
14
  end
14
15
 
15
- def +(other)
16
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
17
- end
16
+ # def +(other)
17
+ # puts "[Substring] : #{other.inspect} (#{self.expressions.inspect})"
18
+ # return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
19
+ # end
18
20
 
19
21
  end
20
22
  end
@@ -7,6 +7,7 @@ require 'arel_extensions/nodes/find_in_set'
7
7
  require 'arel_extensions/nodes/replace'
8
8
  require 'arel_extensions/nodes/soundex'
9
9
  require 'arel_extensions/nodes/trim'
10
+ require 'arel_extensions/nodes/change_case'
10
11
  require 'arel_extensions/nodes/blank'
11
12
  require 'arel_extensions/nodes/format'
12
13
 
@@ -94,6 +95,14 @@ module ArelExtensions
94
95
  ArelExtensions::Nodes::Rtrim.new [self, other]
95
96
  end
96
97
 
98
+ def downcase
99
+ ArelExtensions::Nodes::Downcase.new [self]
100
+ end
101
+
102
+ def upcase
103
+ ArelExtensions::Nodes::Upcase.new [self]
104
+ end
105
+
97
106
  def blank
98
107
  ArelExtensions::Nodes::Blank.new [self]
99
108
  end
@@ -1,12 +1,12 @@
1
- namespace :arelextensions do
2
- desc 'Install DB functions'
1
+ namespace :arel_extensions do
2
+ desc 'Install DB functions into current DB'
3
3
  task :install_functions => :environment do
4
- if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
4
+ if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
5
5
  @env_db = (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
6
6
  else
7
- @env_db = ENV['DB']
7
+ @env_db = ENV['DB'] || ActiveRecord::Base.connection.adapter_name
8
8
  end
9
- ActiveRecord::Base.establish_connection(@env_db.try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
9
+ ActiveRecord::Base.establish_connection(Rails.env)
10
10
  @cnx = ActiveRecord::Base.connection
11
11
  if File.exist?("init/#{@env_db}.sql")
12
12
  sql = File.read("init/#{@env_db}.sql")
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module ArelExtensions
3
- VERSION = "0.9.6".freeze
3
+ VERSION = "0.9.7".freeze
4
4
  end
@@ -72,7 +72,7 @@ module ArelExtensions
72
72
  collector << "instr("
73
73
  collector = visit o.expr, collector
74
74
  collector << Arel::Visitors::SQLite::COMMA
75
- collector = visit o.val, collector
75
+ collector = visit o.right, collector
76
76
  collector << ")"
77
77
  collector
78
78
  end
@@ -80,7 +80,7 @@ module ArelExtensions
80
80
  def visit_ArelExtensions_Nodes_Substring o, collector
81
81
  collector << "SUBSTR("
82
82
  o.expressions.each_with_index { |arg, i|
83
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
83
+ collector << Arel::Visitors::SQLite::COMMA unless i == 0
84
84
  collector = visit arg, collector
85
85
  }
86
86
  collector << ")"
@@ -131,6 +131,26 @@ module ArelExtensions
131
131
  collector
132
132
  end
133
133
 
134
+ def visit_ArelExtensions_Nodes_Downcase o, collector
135
+ collector << "LOWER("
136
+ o.expressions.each_with_index { |arg, i|
137
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
138
+ collector = visit arg, collector
139
+ }
140
+ collector << ")"
141
+ collector
142
+ end
143
+
144
+ def visit_ArelExtensions_Nodes_Upcase o, collector
145
+ collector << "UPPER("
146
+ o.expressions.each_with_index { |arg, i|
147
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
148
+ collector = visit arg, collector
149
+ }
150
+ collector << ")"
151
+ collector
152
+ end
153
+
134
154
  def visit_ArelExtensions_Nodes_Trim o, collector
135
155
  collector << "TRIM("
136
156
  o.expressions.each_with_index { |arg, i|
data/test/real_db_test.rb CHANGED
@@ -21,7 +21,7 @@ def setup_db
21
21
  db.enable_load_extension(0)
22
22
  rescue => e
23
23
  $load_extension_disabled = true
24
- puts "can not load extensions #{e.inspect}"
24
+ $stderr << "can not load extensions #{e.inspect}\n"
25
25
  end
26
26
  end
27
27
  #function find_in_set
@@ -241,6 +241,12 @@ module ArelExtensions
241
241
  assert_equal "replace", t(@lucas, @name.replace(@name, "replace"))
242
242
  end
243
243
 
244
+ def test_replace_once
245
+ skip "TODO"
246
+ # skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
247
+ assert_equal "LuCas", t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
248
+ end
249
+
244
250
  def test_soundex
245
251
  skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
246
252
  skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
@@ -248,6 +254,12 @@ module ArelExtensions
248
254
  assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
249
255
  end
250
256
 
257
+ def test_change_case
258
+ assert_equal "myung", t(@myung, @name.downcase)
259
+ assert_equal "MYUNG", t(@myung, @name.upcase)
260
+ assert_equal "myung", t(@myung, @name.upcase.downcase)
261
+ end
262
+
251
263
  def test_trim
252
264
  assert_equal "Myung", t(@myung, @name.trim)
253
265
  assert_equal "Myung", t(@myung, @name.trim.ltrim.rtrim)
@@ -290,7 +302,7 @@ module ArelExtensions
290
302
 
291
303
  assert_equal ' ', t(@myung, @comments.coalesce("Myung").coalesce('ignored'))
292
304
  assert_equal 'Laure', t(@laure, @comments.coalesce("Laure"))
293
- assert_equal '', t(@laure, @comments.coalesce(""))
305
+ assert_equal (@env_db == 'oracle' ? nil : ''), t(@laure, @comments.coalesce(""))
294
306
 
295
307
  if @env_db == 'postgresql'
296
308
  assert_equal 100, t(@test, @age.coalesce(100))
@@ -20,7 +20,7 @@ module ArelExtensions
20
20
  if File.exist?("init/#{@env_db}.sql")
21
21
  sql = File.read("init/#{@env_db}.sql")
22
22
  unless sql.blank?
23
- @cnx.execute(sql) rescue $stderr << "can't create functions"
23
+ @cnx.execute(sql) rescue $stderr << "can't create functions\n"
24
24
  end
25
25
  end
26
26
  @cnx.drop_table(:user_tests) rescue nil
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: 0.9.6
4
+ version: 0.9.7
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: 2017-03-18 00:00:00.000000000 Z
13
+ date: 2017-03-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: arel
@@ -116,6 +116,7 @@ files:
116
116
  - lib/arel_extensions/nodes/abs.rb
117
117
  - lib/arel_extensions/nodes/blank.rb
118
118
  - lib/arel_extensions/nodes/ceil.rb
119
+ - lib/arel_extensions/nodes/change_case.rb
119
120
  - lib/arel_extensions/nodes/coalesce.rb
120
121
  - lib/arel_extensions/nodes/concat.rb
121
122
  - lib/arel_extensions/nodes/date_diff.rb