arel_extensions 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|