arel_extensions 1.2.25 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +153 -72
  3. data/README.md +42 -0
  4. data/arel_extensions.gemspec +1 -1
  5. data/gemfiles/rails5_2.gemfile +6 -5
  6. data/gemfiles/rails6.gemfile +6 -6
  7. data/gemfiles/rails6_1.gemfile +5 -5
  8. data/gemfiles/rails7.gemfile +30 -0
  9. data/gemspecs/arel_extensions-v1.gemspec +1 -1
  10. data/gemspecs/arel_extensions-v2.gemspec +1 -1
  11. data/lib/arel_extensions/aliases.rb +14 -0
  12. data/lib/arel_extensions/attributes.rb +2 -0
  13. data/lib/arel_extensions/insert_manager.rb +19 -17
  14. data/lib/arel_extensions/math.rb +16 -16
  15. data/lib/arel_extensions/nodes/case.rb +2 -1
  16. data/lib/arel_extensions/nodes/cast.rb +1 -1
  17. data/lib/arel_extensions/nodes/function.rb +4 -2
  18. data/lib/arel_extensions/nodes/json.rb +3 -1
  19. data/lib/arel_extensions/nodes/replace.rb +0 -8
  20. data/lib/arel_extensions/nodes/union.rb +1 -1
  21. data/lib/arel_extensions/nodes/union_all.rb +1 -1
  22. data/lib/arel_extensions/version.rb +1 -1
  23. data/lib/arel_extensions/visitors/mysql.rb +9 -2
  24. data/lib/arel_extensions/visitors/postgresql.rb +13 -7
  25. data/lib/arel_extensions/visitors/to_sql.rb +13 -8
  26. data/lib/arel_extensions/visitors.rb +9 -1
  27. data/lib/arel_extensions.rb +46 -14
  28. data/test/real_db_test.rb +5 -1
  29. data/test/visitors/test_to_sql.rb +18 -11
  30. data/test/with_ar/all_agnostic_test.rb +14 -4
  31. data/test/with_ar/insert_agnostic_test.rb +6 -2
  32. data/test/with_ar/test_bulk_sqlite.rb +6 -2
  33. data/test/with_ar/test_math_sqlite.rb +6 -2
  34. data/test/with_ar/test_string_mysql.rb +6 -2
  35. data/test/with_ar/test_string_sqlite.rb +6 -2
  36. data/version_v1.rb +1 -1
  37. data/version_v2.rb +1 -1
  38. metadata +9 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 006465d41dbb691f2048bd0ffc2aaf3d2f1f48f508955f50774ee9c0413ccfa5
4
- data.tar.gz: 47c61ff636e5fd8c4eb0f470facd661406c4bdca590037a1af5ba87e02ca415e
3
+ metadata.gz: 95117294eff3a479d73c986f12c5fda0e0c97c40a90622cdf9918e379bfd62d4
4
+ data.tar.gz: 3b0284695e759e58a9176ae2a594d8ae6f46920d214d4084237d3c84717f58fe
5
5
  SHA512:
6
- metadata.gz: f6fb93194f8d9841380ba59e1fd72e0afa8bc0c84809d44e6af6b1282ce04bf1933900aafa6715cbdbf074cd6ba0585698aadc1678c80c1cbfdacc85a04472c3
7
- data.tar.gz: a4ac1afdba08edb577f182e9e7d7236a5f87ce741ef63979b95c24ac2562fee76576964dc3b58c54a052952046e51c2ae5a9225d2b91c830eecba3c3b372da52
6
+ metadata.gz: '0804118ac474e36d33e55198948e349d5566622399a98fcf8a777ed8b8afd77ac47ddbaea9a22cb25a30703e55044ae5ebad6e4bd9a6f6d9b1a2e433fecb9917'
7
+ data.tar.gz: 570567960b3b32052b5fcd890f3d89404c0ec8c07f8f5a55856f31305ae9e10a22ab6cc0f3648d64227bf210f809bcc5a2864f756ca6b75e684f0ddb31e261e5
@@ -1,23 +1,63 @@
1
- # This workflow uses actions that are not certified by GitHub.
2
- # They are provided by a third-party and are governed by
3
- # separate terms of service, privacy policy, and support
4
- # documentation.
5
- # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
- # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
1
+ name: Build and Test
7
2
 
8
- name: Ruby
3
+ # Ruby + Rails Compatibility Matrix from here:
4
+ # https://www.fastruby.io/blog/ruby/rails/versions/compatibility-table.html
9
5
 
10
- on:
11
- push:
12
- branches: [ master ]
13
- pull_request:
14
- branches: [ master ]
6
+ on: [push, pull_request]
15
7
 
16
8
  jobs:
17
- test:
18
-
9
+ job_build_gem:
10
+ name: build
19
11
  runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby: [3.1, 3.0, 2.7, 2.5]
15
+ rails: [7, 6_1, 6, 5_2]
16
+ exclude: [
17
+ {ruby: 3.1, rails: 6 },
18
+ {ruby: 3.1, rails: 5_2},
19
+ {ruby: 3.0, rails: 6 },
20
+ {ruby: 3.0, rails: 5_2},
21
+ {ruby: 2.7, rails: 5_2},
22
+ {ruby: 2.5, rails: 7 },
23
+ ]
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby }}
30
+ - name: Setup gemspec
31
+ if: ${{ matrix.rails == '6_1' || matrix.rails == '6' }}
32
+ run: |
33
+ cp ./gemspecs/arel_extensions-v2.gemspec ./arel_extensions.gemspec
34
+ cp ./version_v2.rb lib/arel_extensions/version.rb
35
+ cp ./gemfiles/rails${{ matrix.rails }}.gemfile ./Gemfile
36
+ - name: Build source gem
37
+ run: gem build arel_extensions.gemspec
38
+ - name: Upload source gem
39
+ uses: actions/upload-artifact@v2
40
+ with:
41
+ name: ${{ matrix.ruby }}-${{ matrix.rails }}-gem
42
+ path: "*.gem"
20
43
 
44
+ job_test_linux:
45
+ name: test linux
46
+ needs: job_build_gem
47
+ runs-on: ubuntu-latest
48
+ strategy:
49
+ fail-fast: false
50
+ matrix:
51
+ ruby: [3.1, 3.0, 2.7, 2.5]
52
+ rails: [7, 6_1, 6, 5_2]
53
+ exclude: [
54
+ {ruby: 3.1, rails: 6 },
55
+ {ruby: 3.1, rails: 5_2},
56
+ {ruby: 3.0, rails: 6 },
57
+ {ruby: 3.0, rails: 5_2},
58
+ {ruby: 2.7, rails: 5_2},
59
+ {ruby: 2.5, rails: 7 },
60
+ ]
21
61
  services:
22
62
  postgres:
23
63
  image: postgres:11.6-alpine
@@ -28,8 +68,8 @@ jobs:
28
68
  # needed because the postgres container does not provide a healthcheck
29
69
  options: >-
30
70
  --health-cmd "pg_isready -d arext_test -U postgres -p 5432"
31
- --health-interval 10s
32
- --health-timeout 5s
71
+ --health-interval 10s
72
+ --health-timeout 5s
33
73
  --health-retries 5
34
74
  mysql:
35
75
  image: mysql:5.7
@@ -40,63 +80,104 @@ jobs:
40
80
  ports:
41
81
  - 3306:3306
42
82
  options: >-
43
- --health-cmd="mysqladmin ping"
44
- --health-interval=10s
45
- --health-timeout=5s
83
+ --health-cmd="mysqladmin ping"
84
+ --health-interval=10s
85
+ --health-timeout=5s
46
86
  --health-retries=3
47
-
87
+ steps:
88
+ - uses: actions/checkout@v2
89
+ - name: Set up Ruby
90
+ uses: ruby/setup-ruby@v1
91
+ with:
92
+ ruby-version: ${{ matrix.ruby }}
93
+ - name: Install FreeTDS
94
+ run: |
95
+ sudo apt-get update -q
96
+ sudo apt-get install -y freetds-dev
97
+ - name: Install MSSQL 2019
98
+ uses: potatoqualitee/mssqlsuite@v1
99
+ with:
100
+ install: sqlengine, sqlclient, sqlpackage, localdb
101
+ sa-password: Password12!
102
+ - name: Update system-wide gems
103
+ run: gem update --system
104
+ - name: bundle install
105
+ run: |
106
+ bundle config set gemfile ./gemfiles/rails${{ matrix.rails }}.gemfile
107
+ bundle install
108
+ - name: Download gem from build job
109
+ uses: actions/download-artifact@v2
110
+ with:
111
+ name: ${{ matrix.ruby }}-${{ matrix.rails }}-gem
112
+ - name: Install downloaded gem
113
+ run: gem install --local *.gem --verbose
114
+ - name: Run test to_sql
115
+ run: rake test:to_sql
116
+ - name: Run test Postgres
117
+ env:
118
+ PGHOST: localhost
119
+ PGUSER: postgres
120
+ run: rake test:postgresql
121
+ - name: Run test MySql
122
+ env:
123
+ DB_CONNECTION: mysql
124
+ DB_HOST: 127.0.0.1
125
+ DB_PORT: 3306
126
+ DB_DATABASE: arext_test
127
+ DB_USERNAME: travis
128
+ run: |
129
+ mysql --host 127.0.0.1 --port 3306 -uroot -e 'create user travis;'
130
+ mysql --host 127.0.0.1 --port 3306 -uroot -e 'GRANT ALL PRIVILEGES ON arext_test.* TO travis;'
131
+ rake test:mysql
132
+ - name: Run test mssql
133
+ run: rake test:mssql
134
+
135
+
136
+ job_test_windows:
137
+ name: test windows
138
+ needs: job_build_gem
139
+ runs-on: windows-latest
48
140
  strategy:
141
+ fail-fast: false
49
142
  matrix:
50
- ruby-version:
51
- - 3.0.0-preview1
52
- - 2.7
53
- - 2.5
54
- - 2.3
55
- rails-version:
56
- - 6_1
57
- - 6
58
- - 5_2
59
- exclude:
60
- - ruby-version: 2.3
61
- rails-version: 6_1
62
- - ruby-version: 2.3
63
- rails-version: 6
64
- - ruby-version: 3.0.0-preview1
65
- rails-version: 5.2
66
- continue-on-error: ${{ true }}
67
-
143
+ ruby: [3.1, 3.0, 2.7, 2.5]
144
+ rails: [7, 6_1, 6, 5_2]
145
+ exclude: [
146
+ {ruby: 3.1, rails: 6 },
147
+ {ruby: 3.1, rails: 5_2},
148
+ {ruby: 3.0, rails: 6 },
149
+ {ruby: 3.0, rails: 5_2},
150
+ {ruby: 2.7, rails: 5_2},
151
+ {ruby: 2.5, rails: 7 },
152
+ ]
68
153
  steps:
69
- - uses: actions/checkout@v2
70
- - name: Set up Ruby
71
- # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
72
- # change this to (see https://github.com/ruby/setup-ruby#versioning):
73
- # uses: ruby/setup-ruby@v1
74
- uses: ruby/setup-ruby@21351ecc0a7c196081abca5dc55b08f085efe09a
75
- with:
76
- ruby-version: ${{ matrix.ruby-version }}
77
- - name: Setup gemspec
78
- if: ${{ matrix.rails-version == '6_1' || matrix.rails-version == '6' }}
79
- run: cp ./gemspecs/arel_extensions-v2.gemspec ./arel_extensions.gemspec
80
- - name: Install dependencies
81
- run: |
82
- export BUNDLE_GEMFILE=gemfiles/rails${{ matrix.rails-version }}.gemfile
83
- bundle install
84
- - name: Run test to_sql
85
- run: rake test:to_sql
86
- - name: Run test Postgres
87
- env:
88
- PGHOST: localhost
89
- PGUSER: postgres
90
- run: rake test:postgresql
91
- - name: Run test MySql
92
- env:
93
- DB_CONNECTION: mysql
94
- DB_HOST: 127.0.0.1
95
- DB_PORT: 3306
96
- DB_DATABASE: arext_test
97
- DB_USERNAME: travis
98
- run: |
99
- sudo apt-get install -y mysql-client
100
- mysql --host 127.0.0.1 --port 3306 -uroot -e 'create user travis;'
101
- mysql --host 127.0.0.1 --port 3306 -uroot -e 'GRANT ALL PRIVILEGES ON arext_test.* TO travis;'
102
- rake test:mysql
154
+ - uses: actions/checkout@v2
155
+ - name: Install mssql
156
+ uses: potatoqualitee/mssqlsuite@v1
157
+ with:
158
+ install: sqlengine, sqlclient, sqlpackage, localdb
159
+ sa-password: Password12!
160
+ - name: Set up Ruby
161
+ uses: MSP-Greg/ruby-setup-ruby@win-ucrt-1
162
+ with:
163
+ ruby-version: ${{ matrix.ruby }}
164
+ - name: Install required packages on Windows
165
+ shell: cmd
166
+ run: |
167
+ ridk exec sh -c "pacman --sync --needed --noconfirm ${MINGW_PACKAGE_PREFIX}-gcc"
168
+ - name: Update system-wide gems
169
+ run: gem update --system
170
+ - name: bundle install
171
+ run: |
172
+ bundle config set gemfile .\gemfiles\rails${{ matrix.rails }}.gemfile
173
+ bundle install --verbose
174
+ - name: Download gem from build job
175
+ uses: actions/download-artifact@v2
176
+ with:
177
+ name: ${{ matrix.ruby }}-${{ matrix.rails }}-gem
178
+ - name: Install downloaded gem
179
+ run: gem install --local *.gem --verbose
180
+ - name: Run test to_sql
181
+ run: rake test:to_sql
182
+ - name: Run test mssql
183
+ run: rake test:mssql
data/README.md CHANGED
@@ -596,3 +596,45 @@ User.connection.execute(insert_manager.to_sql)
596
596
  </tr>
597
597
  </tbody>
598
598
  </table>
599
+
600
+ ## Version Compatibility
601
+
602
+ <table>
603
+ <tr><th>Ruby</th> <th>Rails</th> <th>Arel Extensions</th></tr>
604
+ <tr><td>3.1</td> <td>6.1</td> <td>2</td></tr>
605
+ <tr><td>3.0</td> <td>6.1</td> <td>2</td></tr>
606
+ <tr><td>2.7</td> <td>6.1, 6.0</td> <td>2</td></tr>
607
+ <tr><td>2.5</td> <td>6.1, 6.0</td> <td>2</td></tr>
608
+ <tr><td>2.5</td> <td>5.2</td> <td>1</td></tr>
609
+ </table>
610
+
611
+ ## Development
612
+
613
+ Let's say you want to develop/test for `ruby 2.7.5` and `rails 5.2`.
614
+
615
+ You will need to fix your ruby version:
616
+
617
+ ```bash
618
+ rbenv install 2.7.5
619
+ rbenv local 2.7.5
620
+ ```
621
+
622
+ Fix your gemfiles:
623
+
624
+ ```bash
625
+ bundle config set --local gemfile ./gemfiles/rails6.gemfile
626
+ ```
627
+
628
+ Install dependencies:
629
+ ```bash
630
+ bundle install
631
+ ```
632
+
633
+ Develop, then test:
634
+
635
+ ```bash
636
+ bundle exec rake test:to_sql
637
+ ```
638
+
639
+ Refer to the [Version Compatibility](#version-compatibility) section to correctly
640
+ set your gemfile.
@@ -23,6 +23,6 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency('arel', '>= 6.0')
24
24
 
25
25
  s.add_development_dependency('minitest', '~> 5.9')
26
- s.add_development_dependency('rdoc', '~> 4.0')
26
+ s.add_development_dependency('rdoc', '>= 6.3.1')
27
27
  s.add_development_dependency('rake', '~> 12.3.3')
28
28
  end
@@ -4,16 +4,17 @@ gem 'rails', '~> 5.2.0'
4
4
  gem 'arel', '~> 9'
5
5
 
6
6
  group :development, :test do
7
+ gem 'bigdecimal', '1.3.5'
7
8
  gem 'activesupport', '~> 5.2.0'
8
9
  gem 'activemodel', '~> 5.2.0'
9
10
  gem 'activerecord', '~> 5.2.0'
10
11
 
11
- gem "sqlite3", '<= 1.3.13', platforms: [:mri, :mswin, :mingw]
12
- gem "mysql2", '0.4.10', platforms: [:mri, :mswin, :mingw]
13
- gem "pg",'< 1.0.0', platforms: [:mri, :mingw]
12
+ gem "sqlite3", '<= 1.3.13', platforms: [:mri]
13
+ gem "mysql2", '0.4.10', platforms: [:mri]
14
+ gem "pg",'< 1.0.0', platforms: [:mri]
14
15
 
15
- gem "tiny_tds", platforms: [:mri, :mingw] if RUBY_PLATFORM =~ /windows/
16
- # gem "activerecord-sqlserver-adapter", :platforms => [:mri, :mingw]
16
+ gem "tiny_tds", platforms: [:mri, :mingw, :x64_mingw, :mswin]
17
+ gem "activerecord-sqlserver-adapter", '~> 5.2', :platforms => [:mri, :mingw, :x64_mingw, :mswin]
17
18
 
18
19
  gem 'ruby-oci8', platforms: [:mri, :mswin, :mingw] if ENV.has_key? 'ORACLE_HOME'
19
20
  gem 'activerecord-oracle_enhanced-adapter', '~> 5.2.0' if ENV.has_key? 'ORACLE_HOME'
@@ -8,12 +8,12 @@ group :development, :test do
8
8
  gem 'activemodel', '~> 6.0.0'
9
9
  gem 'activerecord', '~> 6.0.0'
10
10
 
11
- gem "sqlite3", '~> 1.4', platforms: [:mri, :mswin, :mingw]
12
- gem "mysql2", '0.5.2', platforms: [:mri, :mswin, :mingw]
13
- gem "pg",'< 1.0.0', platforms: [:mri, :mingw]
11
+ gem "sqlite3", '~> 1.4', platforms: [:mri]
12
+ gem "mysql2", '0.5.2', platforms: [:mri]
13
+ gem "pg",'< 1.0.0', platforms: [:mri]
14
14
 
15
- #gem "tiny_tds", platforms: [:mri, :mingw] if RUBY_PLATFORM =~ /windows/
16
- #gem "activerecord-sqlserver-adapter", platforms: [:mri, :mingw]
15
+ gem "tiny_tds", platforms: [:mri, :mingw, :x64_mingw, :mswin]
16
+ gem "activerecord-sqlserver-adapter", '~> 6.0', platforms: [:mri, :mingw, :x64_mingw, :mswin]
17
17
 
18
18
  gem 'ruby-oci8', platforms: [:mri, :mswin, :mingw] if ENV.has_key? 'ORACLE_HOME'
19
19
  gem 'activerecord-oracle_enhanced-adapter', '~> 6.0.0' if ENV.has_key? 'ORACLE_HOME'
@@ -27,4 +27,4 @@ group :development, :test do
27
27
  gem "activerecord-jdbcmssql-adapter", platforms: :jruby
28
28
  end
29
29
 
30
- gemspec path: "../"
30
+ gemspec path: "../"
@@ -8,12 +8,12 @@ group :development, :test do
8
8
  gem 'activemodel', '~> 6.1.0'
9
9
  gem 'activerecord', '~> 6.1.0'
10
10
 
11
- gem "sqlite3", '~> 1.4', platforms: [:mri, :mswin, :mingw]
12
- gem "mysql2", '0.5.2', platforms: [:mri, :mswin, :mingw]
13
- gem "pg",'~> 1.1', platforms: [:mri, :mingw]
11
+ gem "sqlite3", '~> 1.4', platforms: [:mri]
12
+ gem "mysql2", '0.5.2', platforms: [:mri]
13
+ gem "pg",'~> 1.1', platforms: [:mri]
14
14
 
15
- #gem "tiny_tds", platforms: [:mri, :mingw] if RUBY_PLATFORM =~ /windows/
16
- #gem "activerecord-sqlserver-adapter", platforms: [:mri, :mingw]
15
+ gem "tiny_tds", platforms: [:mri, :mingw, :x64_mingw, :mswin]
16
+ gem "activerecord-sqlserver-adapter", '~> 6.1.0', platforms: [:mri, :mingw, :x64_mingw, :mswin]
17
17
 
18
18
  gem 'ruby-oci8', platforms: [:mri, :mswin, :mingw] if ENV.has_key? 'ORACLE_HOME'
19
19
  gem 'activerecord-oracle_enhanced-adapter', '~> 6.0.0' if ENV.has_key? 'ORACLE_HOME'
@@ -0,0 +1,30 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'rails', '~> 7.0.1'
4
+
5
+
6
+ group :development, :test do
7
+ gem 'activesupport', '~> 7.0.1'
8
+ gem 'activemodel', '~> 7.0.1'
9
+ gem 'activerecord', '~> 7.0.1'
10
+
11
+ gem "sqlite3", '~> 1.4', platforms: [:mri, :mswin, :mingw]
12
+ gem "mysql2", '0.5.2', platforms: [:mri, :mswin, :mingw]
13
+ gem "pg",'~> 1.1', platforms: [:mri, :mingw]
14
+
15
+ #gem "tiny_tds", platforms: [:mri, :mingw] if RUBY_PLATFORM =~ /windows/
16
+ #gem "activerecord-sqlserver-adapter", platforms: [:mri, :mingw]
17
+
18
+ gem 'ruby-oci8', platforms: [:mri, :mswin, :mingw] if ENV.has_key? 'ORACLE_HOME'
19
+ gem 'activerecord-oracle_enhanced-adapter', '~> 6.0.0' if ENV.has_key? 'ORACLE_HOME'
20
+
21
+ # for JRuby
22
+ gem 'activerecord-jdbc-adapter', platforms: :jruby
23
+ gem "jdbc-sqlite3", platforms: :jruby
24
+ gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
25
+ gem "activerecord-jdbcmysql-adapter", platforms: :jruby
26
+ gem "activerecord-jdbcpostgresql-adapter", platforms: :jruby
27
+ gem "activerecord-jdbcmssql-adapter", platforms: :jruby
28
+ end
29
+
30
+ gemspec path: "../"
@@ -23,6 +23,6 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency('arel', '>= 6.0')
24
24
 
25
25
  s.add_development_dependency('minitest', '~> 5.9')
26
- s.add_development_dependency('rdoc', '~> 4.0')
26
+ s.add_development_dependency('rdoc', '>= 6.3.1')
27
27
  s.add_development_dependency('rake', '~> 12.3.3')
28
28
  end
@@ -23,6 +23,6 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency('activerecord', '>= 6.0')
24
24
 
25
25
  s.add_development_dependency('minitest', '~> 5.9')
26
- s.add_development_dependency('rdoc', '~> 4.0')
26
+ s.add_development_dependency('rdoc', '>= 6.3.1')
27
27
  s.add_development_dependency('rake', '~> 12.3.3')
28
28
  end
@@ -0,0 +1,14 @@
1
+ module ArelExtensions
2
+ module Aliases
3
+
4
+ # Install an alias, if present.
5
+ def xas other
6
+ if other.present?
7
+ Arel::Nodes::As.new(self, Arel.sql(other))
8
+ else
9
+ self
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -1,3 +1,4 @@
1
+ require 'arel_extensions/aliases'
1
2
  require 'arel_extensions/math'
2
3
  require 'arel_extensions/comparators'
3
4
  require 'arel_extensions/date_duration'
@@ -8,6 +9,7 @@ require 'arel_extensions/predications'
8
9
 
9
10
  module ArelExtensions
10
11
  module Attributes
12
+ include ArelExtensions::Aliases
11
13
  include ArelExtensions::Math
12
14
  include ArelExtensions::Comparators
13
15
  include ArelExtensions::DateDuration
@@ -3,23 +3,25 @@ require 'arel'
3
3
  module ArelExtensions
4
4
  module InsertManager
5
5
  def bulk_insert(cols, data)
6
- res_columns = []
7
- case cols.first
8
- when String, Symbol
9
- cols.each { |c|
10
- res_columns << @ast.relation[c]
11
- }
12
- when Array
13
- if String === cols.first.first
14
- res_columns = cols.map {|c| [@ast.relation[c.first]] }
15
- elsif Arel::Attributes::Attribute == cols.first.first
16
- res_columns = cols
17
- end
18
- when NilClass
19
- res_columns = @ast.relation.columns
20
- end
21
- self.values = BulkValues.new(res_columns, data)
22
- @ast.columns = res_columns
6
+ raise ArgumentError, "cols must be present" if cols.blank?
7
+ columns =
8
+ case cols.first
9
+ when Array
10
+ case cols.first.first
11
+ when Arel::Attributes::Attribute
12
+ cols
13
+ when String, Symbol
14
+ cols.map {|c| [@ast.relation[c.first]] }
15
+ else
16
+ raise ArgumentError, "cols has an invalid type: #{cols.first.first.class}"
17
+ end
18
+ when String, Symbol
19
+ cols.map { |c| @ast.relation[c] }
20
+ else
21
+ raise ArgumentError, "cols has an invalid type: #{cols.first.class}"
22
+ end
23
+ self.values = BulkValues.new(columns, data)
24
+ @ast.columns = columns
23
25
  end
24
26
 
25
27
  class BulkValues < Arel::Nodes::Node
@@ -22,21 +22,21 @@ module ArelExtensions
22
22
  if self.expr.left.is_a?(String) || self.expr.right.is_a?(String)
23
23
  return self.concat(other)
24
24
  else
25
- return Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
25
+ return Arel.grouping(Arel::Nodes::Addition.new self, other)
26
26
  end
27
27
  when ArelExtensions::Nodes::Function,ArelExtensions::Nodes::Case
28
28
  return case self.return_type
29
29
  when :string, :text
30
30
  self.concat(other)
31
31
  when :integer, :decimal, :float, :number, :int
32
- Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
32
+ Arel.grouping(Arel::Nodes::Addition.new self, other)
33
33
  when :date, :datetime
34
34
  ArelExtensions::Nodes::DateAdd.new [self, other]
35
35
  else
36
36
  self.concat(other)
37
37
  end
38
38
  when Arel::Nodes::Function
39
- Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
39
+ Arel.grouping(Arel::Nodes::Addition.new self, other)
40
40
  else
41
41
  begin
42
42
  col = Arel::Table.engine.connection.schema_cache.columns_hash(self.relation.table_name)[self.name.to_s]
@@ -44,15 +44,15 @@ module ArelExtensions
44
44
  col = nil
45
45
  end
46
46
  if (!col) # if the column doesn't exist in the database
47
- Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new(self, other))
47
+ Arel.grouping(Arel::Nodes::Addition.new(self, other))
48
48
  else
49
49
  arg = col.type
50
50
  if arg == :integer || (!arg)
51
51
  other = other.to_i if other.is_a?(String)
52
- Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
52
+ Arel.grouping(Arel::Nodes::Addition.new self, other)
53
53
  elsif arg == :decimal || arg == :float
54
54
  other = Arel.sql(other) if other.is_a?(String) # Arel should accept Float & BigDecimal!
55
- Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
55
+ Arel.grouping(Arel::Nodes::Addition.new self, other)
56
56
  elsif arg == :datetime || arg == :date
57
57
  ArelExtensions::Nodes::DateAdd.new [self, other]
58
58
  elsif arg == :string || arg == :text
@@ -68,23 +68,23 @@ module ArelExtensions
68
68
  case self
69
69
  when Arel::Nodes::Grouping
70
70
  if self.expr.left.is_a?(Date) || self.expr.left.is_a?(DateTime)
71
- Arel::Nodes::Grouping.new(ArelExtensions::Nodes::DateSub.new [self, other])
71
+ Arel.grouping(ArelExtensions::Nodes::DateSub.new [self, other])
72
72
  else
73
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
73
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, other))
74
74
  end
75
75
  when ArelExtensions::Nodes::Function, ArelExtensions::Nodes::Case
76
76
  case self.return_type
77
77
  when :string, :text # ???
78
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other)) # ??
78
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, other)) # ??
79
79
  when :integer, :decimal, :float, :number
80
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
80
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, other))
81
81
  when :date, :datetime
82
82
  ArelExtensions::Nodes::DateSub.new [self, other]
83
83
  else
84
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
84
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, other))
85
85
  end
86
86
  when Arel::Nodes::Function
87
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
87
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, other))
88
88
  else
89
89
  begin
90
90
  col = Arel::Table.engine.connection.schema_cache.columns_hash(self.relation.table_name)[self.name.to_s]
@@ -92,7 +92,7 @@ module ArelExtensions
92
92
  col = nil
93
93
  end
94
94
  if (!col) # if the column doesn't exist in the database
95
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
95
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, other))
96
96
  else
97
97
  arg = col.type
98
98
  if (arg == :date || arg == :datetime)
@@ -123,11 +123,11 @@ module ArelExtensions
123
123
  else
124
124
  case other
125
125
  when Integer, Float, BigDecimal
126
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, Arel.sql(other.to_s)))
126
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, Arel.sql(other.to_s)))
127
127
  when String
128
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, Arel.sql(other)))
128
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, Arel.sql(other)))
129
129
  else
130
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
130
+ Arel.grouping(Arel::Nodes::Subtraction.new(self, other))
131
131
  end
132
132
  end
133
133
  end
@@ -34,6 +34,7 @@ module ArelExtensions
34
34
  include Arel::Math
35
35
  include Arel::Predications
36
36
  include Arel::OrderPredications
37
+ include ArelExtensions::Aliases
37
38
  include ArelExtensions::Math
38
39
  include ArelExtensions::Comparators
39
40
  include ArelExtensions::Predications
@@ -102,7 +103,7 @@ module ArelExtensions
102
103
  alias :== :eql?
103
104
 
104
105
  def as other
105
- Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
106
+ Arel::Nodes::As.new self, Arel.sql(other)
106
107
  end
107
108
  end
108
109
  end
@@ -42,7 +42,7 @@ module ArelExtensions
42
42
  when :ruby_time
43
43
  ArelExtensions::Nodes::DateAdd.new [self, other]
44
44
  else
45
- Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
45
+ Arel.grouping(Arel::Nodes::Addition.new self, other)
46
46
  end
47
47
  end
48
48
 
@@ -52,7 +52,9 @@ module ArelExtensions
52
52
  case att
53
53
  when Arel::Attributes::Attribute
54
54
  begin
55
- Arel::Table.engine.connection.schema_cache.columns_hash(att.relation.table_name)[att.name.to_s].type
55
+ if Arel::Table.engine.connection.tables.include? att.relation.table_name
56
+ Arel::Table.engine.connection.schema_cache.columns_hash(att.relation.table_name)[att.name.to_s].type
57
+ end
56
58
  rescue
57
59
  att
58
60
  end
@@ -80,7 +82,7 @@ module ArelExtensions
80
82
  when ActiveSupport::Duration
81
83
  Arel.sql(object.to_i)
82
84
  when Array
83
- Arel::Nodes::Grouping.new(object.map{|e| convert_to_node(e)})
85
+ Arel.grouping(object.map{|e| convert_to_node(e)})
84
86
  else
85
87
  raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
86
88
  end