arel_extensions 0.8.4 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +15 -4
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/setup_accounts.sh +9 -0
- data/README.md +15 -3
- data/arel_extensions.gemspec +1 -1
- data/gemfiles/rails4.gemfile +1 -2
- data/gemfiles/rails5.gemfile +3 -2
- data/init/postgresql.sql +10 -8
- data/lib/arel_extensions/date_duration.rb +9 -5
- data/lib/arel_extensions/math.rb +1 -1
- data/lib/arel_extensions/nodes.rb +1 -0
- data/lib/arel_extensions/nodes/abs.rb +2 -0
- data/lib/arel_extensions/nodes/date_diff.rb +17 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -9
- data/lib/arel_extensions/nodes/format.rb +12 -0
- data/lib/arel_extensions/nodes/function.rb +33 -2
- data/lib/arel_extensions/nodes/length.rb +2 -0
- data/lib/arel_extensions/nodes/rand.rb +2 -8
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +1 -121
- data/lib/arel_extensions/visitors/mssql.rb +5 -85
- data/lib/arel_extensions/visitors/mysql.rb +9 -25
- data/lib/arel_extensions/visitors/oracle.rb +137 -122
- data/lib/arel_extensions/visitors/postgresql.rb +3 -12
- data/lib/arel_extensions/visitors/sqlite.rb +2 -11
- data/lib/arel_extensions/visitors/to_sql.rb +22 -0
- data/test/database.yml +4 -2
- data/test/support/alter_system_user_password.sql +2 -0
- data/test/support/create_oracle_enhanced_users.sql +29 -0
- data/test/visitors/test_to_sql.rb +2 -2
- data/test/with_ar/all_agnostic_test.rb +76 -63
- data/test/with_ar/insert_agnostic_test.rb +13 -7
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8e5c240fc0fe59c0b14a9709b6c065276475334
|
4
|
+
data.tar.gz: f5caf5d24a636b49f39132e3817ed867dd803374
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c1ffca0a92fb3d704b2f2ed2649cf6a8df2fb90e46602680aa5c894c9ffef0d6af726736da6de97b12d7ce09f88d4d087e4bf0f1e3d64ab4dec89c8a0c03f93
|
7
|
+
data.tar.gz: 617784403ff3999277c8c60430294feaacba648366635d768f14347f2373fab2209c7dd097c72b1bb7ad0a9dcc9e7d9aad1c21976495943a20d317a2cee70467
|
data/.travis.yml
CHANGED
@@ -2,9 +2,15 @@ language: ruby
|
|
2
2
|
sudo: required
|
3
3
|
cache: bundler
|
4
4
|
before_install:
|
5
|
+
- chmod +x .travis/oracle/download.sh
|
6
|
+
- chmod +x .travis/oracle/install.sh
|
7
|
+
- chmod +x .travis/setup_accounts.sh
|
8
|
+
install:
|
9
|
+
- .travis/oracle/download.sh
|
10
|
+
- .travis/oracle/install.sh
|
11
|
+
- .travis/setup_accounts.sh
|
5
12
|
- gem install bundler
|
6
|
-
|
7
|
-
# - ".travis/oracle/install.sh"
|
13
|
+
- bundle install
|
8
14
|
gemfile:
|
9
15
|
- gemfiles/rails4.gemfile
|
10
16
|
- gemfiles/rails5.gemfile
|
@@ -16,19 +22,24 @@ before_script:
|
|
16
22
|
- psql -c 'create database arext_test;' -U postgres
|
17
23
|
# - $ORACLE_HOME/bin/sqlplus CREATE DB
|
18
24
|
script:
|
19
|
-
- bundle exec rake test
|
20
25
|
- gem build arel_extensions.gemspec
|
26
|
+
- bundle exec rake test
|
21
27
|
- bundle exec rake test:sqlite
|
22
28
|
- bundle exec rake test:mysql
|
23
29
|
- bundle exec rake test:postgresql
|
24
|
-
|
30
|
+
- bundle exec rake test:oracle
|
25
31
|
env:
|
26
32
|
global:
|
27
33
|
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
28
34
|
- ORACLE_COOKIE=sqldev
|
29
35
|
- ORACLE_FILE=oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
|
36
|
+
- ORACLE_OJDBC_URL=http://download.oracle.com/otn/utilities_drivers/jdbc/11204/ojdbc6.jar
|
37
|
+
- TNS_ADMIN=$ORACLE_HOME/network/admin
|
38
|
+
- ORACLE_BASE=/u01/app/oracle
|
30
39
|
- ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
|
31
40
|
- ORACLE_SID=XE
|
41
|
+
- DATABASE_NAME=XE
|
42
|
+
- NLS_LANG=AMERICAN_AMERICA.AL32UTF8
|
32
43
|
- secure: 0RUuF4l0e3J8UIIMlgb8x/aYy2pH6Wb+EWylOr2W1EQechivoFw6IEYD1EZWIOZ/uNpkQ2h/urbUqW3/HpKhZn+NYP2sQI41Xyu1TD+6HPWAHpEvLzemhQSJV6eIeLRQoVDLUmqF23nUZDtKQAwOOyJVMeqHMahJi5K7N/cfQmifs2QcBnMxPnANIcrSXxOCBoqCl6BERG9JTeKERG/lWG1I9vRIe9ISNyOPUQVVI6SfTJwhJP5NLkxSJG1q2PLPK7p6zQ684sS4zSnS5oV23yDsQWWIwxk78CVu1jnFBu8Qq3ngWsInlkHrPotjtaxmTxM8JQd4fgE5NMO2Pjnj8w7zg+sbl+3OVtareX+M9+OLdUD5xBQhecPpzflMqib2qZ0fr9tdoT8kAZJTiXtQrptZfaXleZlH74l2dO/PYxkoWMusYQnSbQl0G3AoyYH+l7YpefL4arm0s5IIiOK+ZiCoZ14pl26rYAA1iPUe5AT+hecKi+fwqhyFE7fMX+zC+AvzsQL8jrP0CXL/hmPkoFYxvcDgUoYhvOq+mmQHdOfU7ny4hH5z5d9691qceduHFvF7fNZ4pSofj03eGqfTTk+SDNeZIo6NXNlayayjV2L/DxL6d7vetxkWwipx47PI76gBAqJlxgODJuzoOtyQkPyIVsDlzI1UPoS+UbrU51w=
|
33
44
|
rvm:
|
34
45
|
- 2.0.0
|
@@ -0,0 +1,116 @@
|
|
1
|
+
// vim: set et sw=2 ts=2:
|
2
|
+
"use strict";
|
3
|
+
var env = process.env;
|
4
|
+
var Promise = require('bluebird');
|
5
|
+
var Phantom = Promise.promisifyAll(require('node-phantom-simple'));
|
6
|
+
var PhantomError = require('node-phantom-simple/headless_error');
|
7
|
+
|
8
|
+
var credentials = Object.keys(env)
|
9
|
+
.filter(function (key) { return key.indexOf('ORACLE_LOGIN_') == 0 })
|
10
|
+
.map(function (key) { return [key.substr(13), env[key]] });
|
11
|
+
|
12
|
+
if (credentials.length <= 0) {
|
13
|
+
console.error("Missing ORACLE_LOGIN environment variables!");
|
14
|
+
process.exit(1);
|
15
|
+
}
|
16
|
+
|
17
|
+
Phantom.createAsync({ parameters: { 'ssl-protocol': 'tlsv1' } }).then(function (browser) {
|
18
|
+
browser = Promise.promisifyAll(browser, { suffix: 'Promise' });
|
19
|
+
|
20
|
+
// Configure the browser, open a tab
|
21
|
+
return browser
|
22
|
+
.addCookiePromise({'name': 'oraclelicense', 'value': "accept-" + env['ORACLE_COOKIE'] + "-cookie", 'domain': '.oracle.com' })
|
23
|
+
.then(function () {
|
24
|
+
return browser.createPagePromise();
|
25
|
+
})
|
26
|
+
.then(function (page) {
|
27
|
+
page = Promise.promisifyAll(page, { suffix: 'Promise' });
|
28
|
+
|
29
|
+
// Configure the tab
|
30
|
+
page.onResourceError = console.error.bind(console);
|
31
|
+
return page
|
32
|
+
.setPromise('settings.userAgent', env['USER_AGENT']) // PhantomJS configures the UA per tab
|
33
|
+
|
34
|
+
// Request the file, wait for the login page
|
35
|
+
.then(function () {
|
36
|
+
return page.openPromise("https://edelivery.oracle.com/akam/otn/linux/" + env['ORACLE_FILE']).then(function (status) {
|
37
|
+
if (status != 'success') throw "Unable to connect to oracle.com";
|
38
|
+
return page.waitForSelectorPromise('input[type=password]', 5000);
|
39
|
+
})
|
40
|
+
.catch(PhantomError, function (err) {
|
41
|
+
return page.getPromise('plainText').then(function (text) {
|
42
|
+
console.error("Unable to load login page. Last response was:\n" + text);
|
43
|
+
throw err;
|
44
|
+
});
|
45
|
+
});
|
46
|
+
})
|
47
|
+
|
48
|
+
// Export cookies for cURL
|
49
|
+
.then(function () {
|
50
|
+
return page.getPromise('cookies').then(function (cookies) {
|
51
|
+
var data = "";
|
52
|
+
for (var i = 0; i < cookies.length; ++i) {
|
53
|
+
var cookie = cookies[i];
|
54
|
+
data += cookie.domain + "\tTRUE\t" + cookie.path + "\t"
|
55
|
+
+ (cookie.secure ? "TRUE" : "FALSE") + "\t0\t"
|
56
|
+
+ cookie.name + "\t" + cookie.value + "\n";
|
57
|
+
}
|
58
|
+
return Promise.promisifyAll(require('fs')).writeFileAsync(env['COOKIES'], data);
|
59
|
+
});
|
60
|
+
})
|
61
|
+
|
62
|
+
// Submit the login form using cURL
|
63
|
+
.then(function () {
|
64
|
+
return page.evaluatePromise(function () {
|
65
|
+
var $form = jQuery(document.forms[0]);
|
66
|
+
return {
|
67
|
+
action: $form.prop('action'),
|
68
|
+
data: $form.serialize()
|
69
|
+
};
|
70
|
+
})
|
71
|
+
.then(function (form) {
|
72
|
+
return browser.exitPromise().then(function () {
|
73
|
+
var unapplied = credentials.filter(function (tuple) {
|
74
|
+
var applied = false;
|
75
|
+
form.data = form.data.replace(tuple[0] + '=', function (name) {
|
76
|
+
applied = true;
|
77
|
+
return name + encodeURIComponent(tuple[1]);
|
78
|
+
});
|
79
|
+
return !applied;
|
80
|
+
})
|
81
|
+
.map(function (tuple) { return tuple[0] });
|
82
|
+
|
83
|
+
if (unapplied.length > 0) {
|
84
|
+
console.warn("Unable to use all ORACLE_LOGIN environment variables: %j", unapplied);
|
85
|
+
}
|
86
|
+
|
87
|
+
var cmd = ['curl', [
|
88
|
+
'--cookie', env['COOKIES'],
|
89
|
+
'--cookie-jar', env['COOKIES'],
|
90
|
+
'--data', '@-',
|
91
|
+
'--location',
|
92
|
+
'--output', require('path').basename('ojdbc6.jar'),
|
93
|
+
'--user-agent', env['USER_AGENT'],
|
94
|
+
env['ORACLE_OJDBC_URL']
|
95
|
+
]];
|
96
|
+
|
97
|
+
console.info("Executing %j", cmd);
|
98
|
+
|
99
|
+
var child_process = require('child_process');
|
100
|
+
var child = child_process.spawn.apply(child_process, cmd.concat({ stdio: ['pipe', 1, 2] }));
|
101
|
+
child.on('exit', process.exit);
|
102
|
+
child.stdin.end(form.data);
|
103
|
+
});
|
104
|
+
});
|
105
|
+
})
|
106
|
+
.catch(function (err) {
|
107
|
+
console.error(err);
|
108
|
+
browser.on('exit', function () { process.exit(1); });
|
109
|
+
browser.exit();
|
110
|
+
});
|
111
|
+
});
|
112
|
+
})
|
113
|
+
.catch(function (err) {
|
114
|
+
console.error(err);
|
115
|
+
process.exit(1);
|
116
|
+
});
|
data/README.md
CHANGED
@@ -4,7 +4,14 @@ Arel Extensions adds shortcuts, fixes and new ORM mappings (ruby to SQL) to Arel
|
|
4
4
|
It aims to ensure pure ruby syntax for the biggest number of usual cases.
|
5
5
|
It allows to use more advanced SQL functions for any supported RDBMS.
|
6
6
|
|
7
|
-
|
7
|
+
|
8
|
+
## Requirements
|
9
|
+
|
10
|
+
Arel 6 (Rails 4) or Arel 7+ (Rails 5).
|
11
|
+
|
12
|
+
|
13
|
+
## Examples
|
14
|
+
|
8
15
|
t is an Arel::Table for table my_table
|
9
16
|
|
10
17
|
## Comparators
|
@@ -14,6 +21,11 @@ t is an Arel::Table for table my_table
|
|
14
21
|
# => my_table.nb > 42
|
15
22
|
```
|
16
23
|
|
24
|
+
```ruby
|
25
|
+
(t[:date1] > t[:date2]).to_sql # (same as (t[:date1].gt(t[:date2])).to_sql)
|
26
|
+
# => my_table.date1 > my_table.date2
|
27
|
+
```
|
28
|
+
|
17
29
|
## Maths
|
18
30
|
|
19
31
|
Currently in Arel:
|
@@ -34,7 +46,7 @@ With Arel Extensions:
|
|
34
46
|
# => SUM(my_table.nb) + 42
|
35
47
|
```
|
36
48
|
|
37
|
-
Other functions : ABS, RAND, ROUND, FLOOR, CEIL,
|
49
|
+
Other functions : ABS, RAND, ROUND, FLOOR, CEIL, FORMAT
|
38
50
|
|
39
51
|
## String operations
|
40
52
|
|
@@ -73,7 +85,7 @@ Other functions : SOUNDEX, LENGTH, REPLACE, LOCATE, TRIM
|
|
73
85
|
((t[:birthdate] - Date.today) * -1).to_sql
|
74
86
|
# => DATEDIFF(my_table.birthdate, '2017-01-01') * -1
|
75
87
|
|
76
|
-
|
88
|
+
t[:birthdate].week.to_sql
|
77
89
|
# => WEEK(my_table.birthdate)
|
78
90
|
|
79
91
|
t[:birthdate].month.to_sql
|
data/arel_extensions.gemspec
CHANGED
@@ -4,7 +4,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "arel_extensions"
|
7
|
-
s.version = '0.8.
|
7
|
+
s.version = '0.8.5'
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Yann Azoury", "Mathilde Pechdimaldjian", "Félix Bellanger"]
|
10
10
|
s.email = ["yann.azoury@faveod.com", "mathilde.pechdimaldjian@gmail.com", "felix.bellanger@faveod.com"]
|
data/gemfiles/rails4.gemfile
CHANGED
@@ -3,7 +3,6 @@ source "https://rubygems.org"
|
|
3
3
|
gem 'arel', '~> 6.0'
|
4
4
|
|
5
5
|
group :development, :test do
|
6
|
-
|
7
6
|
gem 'activesupport', '~> 4.0'
|
8
7
|
gem 'activemodel', '~> 4.0'
|
9
8
|
gem 'activerecord', '~> 4.0'
|
@@ -13,7 +12,7 @@ group :development, :test do
|
|
13
12
|
gem "pg", :platform => [:ruby, :mswin, :mingw]
|
14
13
|
|
15
14
|
gem 'ruby-oci8', :platform => [:ruby, :mswin, :mingw] if ENV.has_key? 'ORACLE_HOME'
|
16
|
-
gem 'activerecord-oracle_enhanced-adapter', '~> 1.6.0'
|
15
|
+
gem 'activerecord-oracle_enhanced-adapter', '~> 1.6.0' if ENV.has_key? 'ORACLE_HOME'
|
17
16
|
|
18
17
|
# for JRuby
|
19
18
|
gem 'activerecord-jdbc-adapter', platform: :jruby
|
data/gemfiles/rails5.gemfile
CHANGED
@@ -10,8 +10,9 @@ group :development, :test do
|
|
10
10
|
gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
|
11
11
|
gem "mysql2", :platform => [:ruby, :mswin, :mingw]
|
12
12
|
gem "pg", :platform => [:ruby, :mswin, :mingw]
|
13
|
-
|
14
|
-
gem '
|
13
|
+
|
14
|
+
gem 'ruby-oci8', :platform => [:ruby, :mswin, :mingw] if ENV.has_key? 'ORACLE_HOME'
|
15
|
+
gem 'activerecord-oracle_enhanced-adapter', '~> 1.7.0' if ENV.has_key? 'ORACLE_HOME'
|
15
16
|
|
16
17
|
# for JRuby
|
17
18
|
gem 'activerecord-jdbc-adapter', platform: :jruby
|
data/init/postgresql.sql
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
CREATE OR REPLACE FUNCTION public.find_in_set(n INTEGER, s TEXT)
|
2
|
-
RETURNS
|
2
|
+
RETURNS INT4
|
3
3
|
LANGUAGE sql
|
4
4
|
AS $function$
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
select row_number() over(), y.x
|
5
|
+
SELECT * FROM (
|
6
|
+
select int4(z.row_number) from (
|
7
|
+
select row_number() over(), y.x
|
9
8
|
from (select unnest(('{' || $2 || '}')::int[]) as x) as y
|
10
|
-
|
11
|
-
where z.x = $1
|
12
|
-
|
9
|
+
) as z
|
10
|
+
where z.x = $1
|
11
|
+
UNION ALL
|
12
|
+
SELECT 0) z
|
13
|
+
LIMIT 1
|
14
|
+
$function$
|
@@ -2,26 +2,30 @@ module ArelExtensions
|
|
2
2
|
module DateDuration
|
3
3
|
#function returns the year (as a number) given a date value.
|
4
4
|
def year
|
5
|
-
ArelExtensions::Nodes::Duration.new "y",self
|
5
|
+
ArelExtensions::Nodes::Duration.new "y", self
|
6
6
|
end
|
7
7
|
|
8
8
|
#function returns the month (as a number) given a date value.
|
9
9
|
def month
|
10
|
-
ArelExtensions::Nodes::Duration.new "m",self
|
10
|
+
ArelExtensions::Nodes::Duration.new "m", self
|
11
11
|
end
|
12
12
|
|
13
13
|
#function returns the week (as a number) given a date value.
|
14
14
|
def week
|
15
|
-
ArelExtensions::Nodes::Duration.new "w",self
|
15
|
+
ArelExtensions::Nodes::Duration.new "w", self
|
16
16
|
end
|
17
17
|
|
18
18
|
#function returns the month (as a number) given a date value.
|
19
19
|
def day
|
20
|
-
ArelExtensions::Nodes::Duration.new "d",self
|
20
|
+
ArelExtensions::Nodes::Duration.new "d", self
|
21
21
|
end
|
22
22
|
|
23
23
|
def wday
|
24
|
-
ArelExtensions::Nodes::
|
24
|
+
ArelExtensions::Nodes::Duration.new 'wd', self
|
25
|
+
end
|
26
|
+
|
27
|
+
def format(tpl)
|
28
|
+
ArelExtensions::Nodes::Format.new [self, tpl]
|
25
29
|
end
|
26
30
|
|
27
31
|
end
|
data/lib/arel_extensions/math.rb
CHANGED
@@ -15,7 +15,7 @@ module ArelExtensions
|
|
15
15
|
Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
|
16
16
|
elsif arg == :datetime || arg == :date
|
17
17
|
ArelExtensions::Nodes::DateAdd.new [self, other]
|
18
|
-
elsif arg == :string
|
18
|
+
elsif arg == :string || arg == :text
|
19
19
|
ArelExtensions::Nodes::Concat.new [self, other]
|
20
20
|
end
|
21
21
|
end
|
@@ -18,6 +18,7 @@ require 'arel_extensions/nodes/soundex'
|
|
18
18
|
require 'arel_extensions/nodes/trim'
|
19
19
|
require 'arel_extensions/nodes/ltrim'
|
20
20
|
require 'arel_extensions/nodes/rtrim'
|
21
|
+
require 'arel_extensions/nodes/format'
|
21
22
|
|
22
23
|
# Date functions
|
23
24
|
require 'arel_extensions/nodes/date_diff'
|
@@ -5,6 +5,8 @@ module ArelExtensions
|
|
5
5
|
class DateDiff < Function #difference entre colonne date et date string/date
|
6
6
|
attr_accessor :date_type
|
7
7
|
|
8
|
+
@@return_type = :integer # by default...
|
9
|
+
|
8
10
|
def initialize(expr)
|
9
11
|
col = expr.first
|
10
12
|
case col
|
@@ -70,6 +72,21 @@ module ArelExtensions
|
|
70
72
|
end
|
71
73
|
end
|
72
74
|
|
75
|
+
def oracle_value(v = nil)
|
76
|
+
v ||= self.expressions.last
|
77
|
+
if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v
|
78
|
+
if @date_type == :date
|
79
|
+
Arel.sql("INTERVAL '%s' DAY" % v.inspect.to_i)
|
80
|
+
elsif @date_type == :datetime
|
81
|
+
Arel.sql("INTERVAL '%s' SECOND" % v.to_i)
|
82
|
+
end
|
83
|
+
# elsif Arel::Attributes::Attribute === v
|
84
|
+
# v
|
85
|
+
else
|
86
|
+
v
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
73
90
|
private
|
74
91
|
def convert(object)
|
75
92
|
case object
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Format < Function
|
4
|
+
attr_accessor :col_type
|
5
|
+
def initialize expr
|
6
|
+
col = expr.first
|
7
|
+
@col_type = Arel::Table.engine.connection.schema_cache.columns_hash(col.relation.table_name)[col.name.to_s].type
|
8
|
+
super [expr.first, convert_to_string_node(expr[1])]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -4,6 +4,10 @@ module ArelExtensions
|
|
4
4
|
include Arel::Math
|
5
5
|
include Arel::Expressions
|
6
6
|
|
7
|
+
cattr_accessor :return_type
|
8
|
+
|
9
|
+
@@return_type = :string # by default...
|
10
|
+
|
7
11
|
# overrides as to make new Node like AliasPredication
|
8
12
|
def as other
|
9
13
|
Arel::Nodes::As.new(self, Arel.sql(other))
|
@@ -21,7 +25,6 @@ module ArelExtensions
|
|
21
25
|
@expressions[1]
|
22
26
|
end
|
23
27
|
|
24
|
-
protected
|
25
28
|
def convert_to_node(object)
|
26
29
|
case object
|
27
30
|
when Arel::Attributes::Attribute, Arel::Nodes::Node, Fixnum, Integer
|
@@ -31,7 +34,7 @@ module ArelExtensions
|
|
31
34
|
when String
|
32
35
|
Arel::Nodes.build_quoted(object)
|
33
36
|
when Date
|
34
|
-
Arel::Nodes.build_quoted(object, self)
|
37
|
+
Arel::Nodes.build_quoted(object.to_s, self)
|
35
38
|
when NilClass
|
36
39
|
Arel.sql('NULL')
|
37
40
|
when ActiveSupport::Duration
|
@@ -41,6 +44,34 @@ module ArelExtensions
|
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
47
|
+
def convert_to_string_node(object)
|
48
|
+
case object
|
49
|
+
when Arel::Nodes::Node
|
50
|
+
object
|
51
|
+
when Fixnum, Integer
|
52
|
+
Arel::Nodes.build_quoted(object.to_s)
|
53
|
+
when Arel::Attributes::Attribute
|
54
|
+
case Arel::Table.engine.connection.schema_cache.columns_hash(object.relation.table_name)[object.name.to_s].type
|
55
|
+
when :date
|
56
|
+
ArelExtensions::Nodes::Format.new [object, 'yyyy-mm-dd']
|
57
|
+
else
|
58
|
+
object
|
59
|
+
end
|
60
|
+
when DateTime, Time
|
61
|
+
Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
|
62
|
+
when String
|
63
|
+
Arel::Nodes.build_quoted(object)
|
64
|
+
when Date
|
65
|
+
Arel::Nodes.build_quoted(object, self)
|
66
|
+
when NilClass
|
67
|
+
Arel.sql('NULL')
|
68
|
+
when ActiveSupport::Duration
|
69
|
+
Arel::Nodes.build_quoted(object.to_i.to_s)
|
70
|
+
else
|
71
|
+
raise(ArgumentError, "#{object.class} can not be converted to CONCAT arg")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
44
75
|
def convert_to_date_node(object)
|
45
76
|
case object
|
46
77
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|