arel_extensions 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/init/postgresql.sql +54 -1
- data/lib/arel_extensions/date_duration.rb +12 -0
- data/lib/arel_extensions/nodes/date_diff.rb +7 -4
- data/lib/arel_extensions/nodes/function.rb +15 -0
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +11 -4
- data/lib/arel_extensions/visitors/mysql.rb +8 -4
- data/lib/arel_extensions/visitors/oracle.rb +20 -5
- data/lib/arel_extensions/visitors/postgresql.rb +8 -5
- data/lib/arel_extensions/visitors/sqlite.rb +12 -5
- data/lib/arel_extensions/visitors/to_sql.rb +5 -1
- data/test/visitors/test_oracle.rb +5 -4
- data/test/visitors/test_to_sql.rb +2 -2
- data/test/with_ar/all_agnostic_test.rb +20 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9a9fe5819def3759928d0cea4cdcda31f3a4dbd
|
4
|
+
data.tar.gz: 2f0585e04bbb88128e291061160db906baa15028
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 556c4302bdb962dc5a6aaa1f6cfd625b42ae30c4df3a24c0283dbb62f1f380c0feff557fe941fefe84021f9be4ccb40b92adc1ceac2aaabc0d96a1f9ad472da6
|
7
|
+
data.tar.gz: cf19efa4600c4b88dc061a28cc9c39b25452e159e9d871a896b1d25d0c8c3b8e4d6fa7578f55a44ea496c47b615e4b231dfdc6be9acc5434553c41119a2d6f02
|
data/.travis.yml
CHANGED
data/init/postgresql.sql
CHANGED
@@ -11,4 +11,57 @@ AS $function$
|
|
11
11
|
UNION ALL
|
12
12
|
SELECT 0) z
|
13
13
|
LIMIT 1
|
14
|
-
$function$
|
14
|
+
$function$
|
15
|
+
;
|
16
|
+
|
17
|
+
|
18
|
+
CREATE OR REPLACE FUNCTION public.DateDiff(units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP)
|
19
|
+
RETURNS INT AS $$
|
20
|
+
DECLARE
|
21
|
+
diff_interval INTERVAL;
|
22
|
+
diff INT = 0;
|
23
|
+
years_diff INT = 0;
|
24
|
+
BEGIN
|
25
|
+
IF units IN ('yy', 'yyyy', 'year', 'mm', 'm', 'month') THEN
|
26
|
+
years_diff = DATE_PART('year', end_t) - DATE_PART('year', start_t);
|
27
|
+
|
28
|
+
IF units IN ('yy', 'yyyy', 'year') THEN
|
29
|
+
-- SQL Server does not count full years passed (only difference between year parts)
|
30
|
+
RETURN years_diff;
|
31
|
+
ELSE
|
32
|
+
-- If end month is less than start month it will subtracted
|
33
|
+
RETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t));
|
34
|
+
END IF;
|
35
|
+
END IF;
|
36
|
+
|
37
|
+
-- Minus operator returns interval 'DDD days HH:MI:SS'
|
38
|
+
diff_interval = end_t - start_t;
|
39
|
+
|
40
|
+
diff = diff + DATE_PART('day', diff_interval);
|
41
|
+
|
42
|
+
IF units IN ('wk', 'ww', 'week') THEN
|
43
|
+
diff = diff/7;
|
44
|
+
RETURN diff;
|
45
|
+
END IF;
|
46
|
+
|
47
|
+
IF units IN ('dd', 'd', 'day') THEN
|
48
|
+
RETURN diff;
|
49
|
+
END IF;
|
50
|
+
|
51
|
+
diff = diff * 24 + DATE_PART('hour', diff_interval);
|
52
|
+
|
53
|
+
IF units IN ('hh', 'hour') THEN
|
54
|
+
RETURN diff;
|
55
|
+
END IF;
|
56
|
+
|
57
|
+
diff = diff * 60 + DATE_PART('minute', diff_interval);
|
58
|
+
|
59
|
+
IF units IN ('mi', 'n', 'minute') THEN
|
60
|
+
RETURN diff;
|
61
|
+
END IF;
|
62
|
+
|
63
|
+
diff = diff * 60 + DATE_PART('second', diff_interval);
|
64
|
+
|
65
|
+
RETURN diff;
|
66
|
+
END;
|
67
|
+
$$ LANGUAGE plpgsql;
|
@@ -27,6 +27,18 @@ module ArelExtensions
|
|
27
27
|
ArelExtensions::Nodes::Duration.new 'wd', self
|
28
28
|
end
|
29
29
|
|
30
|
+
def hour
|
31
|
+
ArelExtensions::Nodes::Duration.new "h", self
|
32
|
+
end
|
33
|
+
|
34
|
+
def minute
|
35
|
+
ArelExtensions::Nodes::Duration.new "mn", self
|
36
|
+
end
|
37
|
+
|
38
|
+
def second
|
39
|
+
ArelExtensions::Nodes::Duration.new "s", self
|
40
|
+
end
|
41
|
+
|
30
42
|
def format(tpl)
|
31
43
|
ArelExtensions::Nodes::Format.new [self, tpl]
|
32
44
|
end
|
@@ -9,24 +9,27 @@ module ArelExtensions
|
|
9
9
|
@@return_type = :integer # by default...
|
10
10
|
|
11
11
|
def initialize(expr)
|
12
|
+
res = []
|
12
13
|
col = expr.first
|
13
14
|
case col
|
14
|
-
when Arel::Nodes::Node
|
15
|
+
when Arel::Nodes::Node, Arel::Attributes::Attribute
|
15
16
|
@left_node_type = type_of_attribute(col)
|
16
17
|
when Date
|
17
18
|
@left_node_type = :ruby_date
|
18
19
|
when DateTime, Time
|
19
20
|
@left_node_type = :ruby_time
|
20
21
|
end
|
22
|
+
res << ([:date, :ruby_date].include?(@left_node_type) ? convert_to_date_node(col) : convert_to_datetime_node(col))
|
21
23
|
case expr[1]
|
22
|
-
when Arel::Nodes::Node
|
23
|
-
@right_node_type = type_of_attribute(
|
24
|
+
when Arel::Nodes::Node, Arel::Attributes::Attribute
|
25
|
+
@right_node_type = type_of_attribute(expr[1])
|
24
26
|
when Date
|
25
27
|
@right_node_type = :ruby_date
|
26
28
|
when DateTime, Time
|
27
29
|
@right_node_type = :ruby_time
|
28
30
|
end
|
29
|
-
|
31
|
+
res << ([:date, :ruby_date].include?(@left_node_type) ? convert_to_date_node(expr[1]) : convert_to_datetime_node(expr[1]))
|
32
|
+
super res
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
@@ -91,6 +91,21 @@ module ArelExtensions
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
def convert_to_datetime_node(object)
|
95
|
+
case object
|
96
|
+
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
97
|
+
object
|
98
|
+
when DateTime, Time
|
99
|
+
Arel::Nodes.build_quoted(object, self)
|
100
|
+
when String
|
101
|
+
Arel::Nodes.build_quoted(Time.parse(object), self)
|
102
|
+
when Date
|
103
|
+
Arel::Nodes.build_quoted(Time.utc(object.year, object.month, object.day, 0, 0, 0), self)
|
104
|
+
else
|
105
|
+
raise(ArgumentError, "#{object.class} can not be converted to Datetime")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
94
109
|
def convert_to_number(object)
|
95
110
|
case object
|
96
111
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
3
|
module MSSQL
|
4
|
-
Arel::Visitors::MSSQL::DATE_MAPPING = {'d' => 'day', 'm' => 'month', 'y' => 'year', 'wd' => 'weekday', 'w' => 'week'}
|
4
|
+
Arel::Visitors::MSSQL::DATE_MAPPING = {'d' => 'day', 'm' => 'month', 'y' => 'year', 'wd' => 'weekday', 'w' => 'week', 'h' => 'hour', 'mn' => 'minute', 's' => 'second'}
|
5
5
|
Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES = {
|
6
6
|
'%Y' => 'YYYY', '%C' => '', '%y' => 'YY', '%m' => 'MM', '%B' => '', '%b' => '', '%^b' => '', # year, month
|
7
7
|
'%d' => 'DD', '%e' => '', '%j' => '', '%w' => 'dw', '%A' => '', # day, weekday
|
@@ -71,11 +71,15 @@ module ArelExtensions
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
74
|
-
|
75
|
-
|
76
|
-
|
74
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
75
|
+
collector << "DATEDIFF(second"
|
76
|
+
else
|
77
|
+
collector << "DATEDIFF(day"
|
78
|
+
end
|
77
79
|
collector << Arel::Visitors::MSSQL::COMMA
|
78
80
|
collector = visit o.right, collector
|
81
|
+
collector << Arel::Visitors::MSSQL::COMMA
|
82
|
+
collector = visit o.left, collector
|
79
83
|
collector << ")"
|
80
84
|
collector
|
81
85
|
end
|
@@ -92,10 +96,13 @@ module ArelExtensions
|
|
92
96
|
end
|
93
97
|
|
94
98
|
def visit_ArelExtensions_Nodes_Duration o, collector
|
99
|
+
conv = ['h', 'mn', 's'].include?(o.left)
|
95
100
|
collector << 'DATEPART('
|
96
101
|
collector << Arel::Visitors::MSSQL::DATE_MAPPING[o.left]
|
97
102
|
collector << Arel::Visitors::MSSQL::COMMA
|
103
|
+
collector << 'CONVERT(datetime,' if conv
|
98
104
|
collector = visit o.right, collector
|
105
|
+
collector << ')' if conv
|
99
106
|
collector << ")"
|
100
107
|
collector
|
101
108
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
3
|
Arel::Visitors::MySQL.class_eval do
|
4
|
-
Arel::Visitors::MySQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'WEEKDAY'}
|
4
|
+
Arel::Visitors::MySQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'WEEKDAY', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
|
5
5
|
Arel::Visitors::MySQL::DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
|
6
6
|
'%Y' => '%Y', '%C' => '', '%y' => '%y', '%m' => '%m', '%B' => '%M', '%b' => '%b', '%^b' => '%b', # year, month
|
7
7
|
'%d' => '%d', '%e' => '%e', '%j' => '%j', '%w' => '%w', '%A' => '%W', # day, weekday
|
@@ -105,10 +105,14 @@ module ArelExtensions
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
108
|
-
|
109
|
-
|
110
|
-
|
108
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
109
|
+
collector << 'TIMESTAMPDIFF(SECOND, '
|
110
|
+
else
|
111
|
+
collector << "DATEDIFF("
|
112
|
+
end
|
111
113
|
collector = visit o.right, collector
|
114
|
+
collector << Arel::Visitors::MySQL::COMMA
|
115
|
+
collector = visit o.left, collector
|
112
116
|
collector << ")"
|
113
117
|
collector
|
114
118
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
3
|
Arel::Visitors::Oracle.class_eval do
|
4
|
-
Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D'}
|
4
|
+
Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
|
5
5
|
Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES = {
|
6
6
|
'%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
|
7
7
|
'%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
|
@@ -66,16 +66,31 @@ module ArelExtensions
|
|
66
66
|
collector
|
67
67
|
end
|
68
68
|
|
69
|
+
# :date is not possible in Oracle since this type does not really exist
|
69
70
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
71
|
+
lc = o.left_node_type == :ruby_date || o.left_node_type == :ruby_time
|
72
|
+
rc = o.right_node_type == :ruby_date || o.right_node_type == :ruby_time
|
70
73
|
collector << '('
|
71
|
-
collector << 'TO_DATE('
|
74
|
+
collector << 'TO_DATE(' if lc
|
72
75
|
collector = visit o.left, collector
|
73
|
-
collector << ')'
|
76
|
+
collector << ')' if lc
|
74
77
|
collector << " - "
|
75
|
-
collector << 'TO_DATE('
|
78
|
+
collector << 'TO_DATE(' if rc
|
76
79
|
collector = visit o.right, collector
|
77
|
-
collector << ')'
|
80
|
+
collector << ')' if rc
|
78
81
|
collector << ')'
|
82
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
83
|
+
collector << ' * CASE WHEN (TRUNC('
|
84
|
+
collector << 'TO_DATE(' if lc
|
85
|
+
collector = visit o.left, collector
|
86
|
+
collector << ')' if lc
|
87
|
+
collector << Arel::Visitors::Oracle::COMMA
|
88
|
+
collector << "'DDD') = "
|
89
|
+
collector << 'TO_DATE(' if lc
|
90
|
+
collector = visit o.left, collector
|
91
|
+
collector << ')' if lc
|
92
|
+
collector << ') THEN 1 ELSE 86400 END' # converts to seconds
|
93
|
+
end
|
79
94
|
collector
|
80
95
|
end
|
81
96
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
3
|
Arel::Visitors::PostgreSQL.class_eval do
|
4
|
-
Arel::Visitors::PostgreSQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'DOW'}
|
4
|
+
Arel::Visitors::PostgreSQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'DOW', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
|
5
5
|
Arel::Visitors::PostgreSQL::DATE_FORMAT_DIRECTIVES = {
|
6
6
|
'%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
|
7
7
|
'%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
|
@@ -99,13 +99,16 @@ module ArelExtensions
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
102
|
-
|
102
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
103
|
+
collector << "DATEDIFF('second', "
|
104
|
+
else
|
105
|
+
collector << "DATEDIFF('day', "
|
106
|
+
end
|
107
|
+
collector = visit o.right, collector
|
108
|
+
collector << (o.right_node_type == :date ? '::date' : '::timestamp')
|
103
109
|
collector << Arel::Visitors::PostgreSQL::COMMA
|
104
110
|
collector = visit o.left, collector
|
105
111
|
collector << (o.left_node_type == :date ? '::date' : '::timestamp')
|
106
|
-
collector << " - "
|
107
|
-
collector = visit o.right, collector
|
108
|
-
collector << (o.right_node_type == :date ? '::date' : '::timestamp')
|
109
112
|
collector << ")"
|
110
113
|
collector
|
111
114
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
3
|
Arel::Visitors::SQLite.class_eval do
|
4
|
-
Arel::Visitors::SQLite::DATE_MAPPING = {'d' => '%d', 'm' => '%m', 'w' => '%W', 'y' => '%Y', 'wd' => '%w', 'M' => '%M'}
|
4
|
+
Arel::Visitors::SQLite::DATE_MAPPING = {'d' => '%d', 'm' => '%m', 'w' => '%W', 'y' => '%Y', 'wd' => '%w', 'M' => '%M', 'h' => '%H', 'mn' => '%M', 's' => '%S'}
|
5
5
|
Arel::Visitors::SQLite::DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
|
6
6
|
'%Y' => '%Y', '%C' => '', '%y' => '%y', '%m' => '%m', '%B' => '%M', '%b' => '%b', '%^b' => '%b', # year, month
|
7
7
|
'%d' => '%d', '%e' => '%e', '%j' => '%j', '%w' => '%w', '%A' => '%W', # day, weekday
|
@@ -45,10 +45,17 @@ module ArelExtensions
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
49
|
+
collector << "strftime('%s', "
|
50
|
+
collector = visit o.left, collector
|
51
|
+
collector << ") - strftime('%s', "
|
52
|
+
collector = visit o.right, collector
|
53
|
+
else
|
54
|
+
collector << "julianday("
|
55
|
+
collector = visit o.left, collector
|
56
|
+
collector << ") - julianday("
|
57
|
+
collector = visit o.right, collector
|
58
|
+
end
|
52
59
|
collector << ")"
|
53
60
|
collector
|
54
61
|
end
|
@@ -194,7 +194,11 @@ module ArelExtensions
|
|
194
194
|
end
|
195
195
|
|
196
196
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
197
|
-
|
197
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
198
|
+
collector << 'TIMEDIFF('
|
199
|
+
else
|
200
|
+
collector << "DATEDIFF("
|
201
|
+
end
|
198
202
|
collector = visit o.left, collector
|
199
203
|
collector << Arel::Visitors::ToSql::COMMA
|
200
204
|
collector = visit o.right, collector
|
@@ -60,16 +60,17 @@ module ArelExtensions
|
|
60
60
|
# Maths
|
61
61
|
# DateDiff
|
62
62
|
it "should diff date col and date" do
|
63
|
-
compile(@table[:created_at] - Date.new(2016, 3, 31)).must_match %{
|
63
|
+
compile(@table[:created_at] - Date.new(2016, 3, 31)).must_match %{"users"."created_at" - TO_DATE('2016-03-31')}
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should diff date col and datetime col" do
|
67
|
-
compile(@table[:created_at] - @table[:updated_at]).must_match %{
|
67
|
+
compile(@table[:created_at] - @table[:updated_at]).must_match %{"users"."created_at" - "users"."updated_at"}
|
68
68
|
end
|
69
69
|
|
70
70
|
it "should diff date col and datetime col with AS" do
|
71
71
|
sql = compile((@table[:updated_at] - @table[:created_at]).as('new_name'))
|
72
|
-
sql.must_be_like %{(TO_DATE("users"."updated_at") -
|
72
|
+
# sql.must_be_like %{(TO_DATE("users"."updated_at") - "users"."created_at") * 86400 AS new_name}
|
73
|
+
sql.must_be_like %{("users"."updated_at" - "users"."created_at") * CASE WHEN (TRUNC("users"."updated_at", 'DDD') = "users"."updated_at") THEN 1 ELSE 86400 END AS new_name}
|
73
74
|
end
|
74
75
|
|
75
76
|
it "should diff between time values" do
|
@@ -82,7 +83,7 @@ module ArelExtensions
|
|
82
83
|
it "should diff between time values and time col" do
|
83
84
|
d1 = DateTime.new(2015,6,2)
|
84
85
|
sql = compile(ArelExtensions::Nodes::DateDiff.new([d1, @table[:updated_at]]))
|
85
|
-
sql.must_match %{TO_DATE('2015-06-02') -
|
86
|
+
sql.must_match %{TO_DATE('2015-06-02') - "users"."updated_at"}
|
86
87
|
end
|
87
88
|
|
88
89
|
it "should accept operators on dates with numbers" do
|
@@ -111,7 +111,7 @@ module ArelExtensions
|
|
111
111
|
|
112
112
|
it "should diff date col and datetime col with AS" do
|
113
113
|
sql = compile((@table[:updated_at] - @table[:created_at]).as('new_name'))
|
114
|
-
sql.must_match %{
|
114
|
+
sql.must_match %{TIMEDIFF("users"."updated_at", "users"."created_at") AS new_name}
|
115
115
|
end
|
116
116
|
|
117
117
|
it "should diff between time values" do
|
@@ -150,7 +150,7 @@ module ArelExtensions
|
|
150
150
|
c = @table[:name]
|
151
151
|
compile(
|
152
152
|
(c.length / 42).round(2).floor > (@table[:updated_at] - Date.new(2000, 3, 31)).abs.ceil
|
153
|
-
).must_be_like %{FLOOR(ROUND(LENGTH("users"."name") / 42, 2)) > CEIL(ABS(
|
153
|
+
).must_be_like %{FLOOR(ROUND(LENGTH("users"."name") / 42, 2)) > CEIL(ABS(TIMEDIFF("users"."updated_at", '2000-03-31 00:00:00 UTC')))}
|
154
154
|
end
|
155
155
|
|
156
156
|
end
|
@@ -73,7 +73,7 @@ module ArelExtensions
|
|
73
73
|
def setup
|
74
74
|
d = Date.new(2016, 5, 23)
|
75
75
|
setup_db
|
76
|
-
u = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16, :updated_at => Time.utc(2014, 3, 3, 12, 42)
|
76
|
+
u = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16, :updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
|
77
77
|
@lucas = User.where(:id => u.id)
|
78
78
|
u = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
79
79
|
@sophie = User.where(:id => u.id)
|
@@ -273,8 +273,6 @@ module ArelExtensions
|
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
276
|
-
|
277
|
-
|
278
276
|
# Comparators
|
279
277
|
def test_number_comparator
|
280
278
|
assert_equal 2, User.where(@age < 6).count
|
@@ -298,13 +296,31 @@ module ArelExtensions
|
|
298
296
|
assert_equal 5, t(@camille, @created_at.month).to_i
|
299
297
|
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
300
298
|
#Week
|
301
|
-
assert_equal
|
299
|
+
assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
|
302
300
|
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
303
301
|
#Day
|
304
302
|
assert_equal 23, t(@laure, @created_at.day).to_i
|
305
303
|
assert_equal 0, User.where(@created_at.day.eq("05")).count
|
304
|
+
|
305
|
+
skip "manage DATE" if @env_db == 'oracle'
|
306
|
+
#Hour
|
307
|
+
assert_equal 0, t(@laure, @created_at.hour).to_i
|
308
|
+
assert_equal 12, t(@lucas, @updated_at.hour).to_i
|
309
|
+
#Minute
|
310
|
+
assert_equal 0, t(@laure, @created_at.minute).to_i
|
311
|
+
assert_equal 42, t(@lucas, @updated_at.minute).to_i
|
312
|
+
#Second
|
313
|
+
assert_equal 0, t(@laure, @created_at.second).to_i
|
314
|
+
assert_equal 0, t(@lucas, @updated_at.second).to_i
|
306
315
|
end
|
307
316
|
|
317
|
+
def test_datetime_diff
|
318
|
+
assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
|
319
|
+
assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
320
|
+
assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
321
|
+
end
|
322
|
+
|
323
|
+
|
308
324
|
def test_cast_types
|
309
325
|
skip "not implemented yet"
|
310
326
|
assert_equal true, t(@arthur, @score =~ /22/)
|
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.
|
4
|
+
version: 0.9.2
|
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: 2016-11-
|
13
|
+
date: 2016-11-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: arel
|