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.
@@ -1,6 +1,8 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Length < Function
4
+ @@return_type = :integer
5
+
4
6
  end
5
7
  end
6
8
  end
@@ -2,6 +2,8 @@ module ArelExtensions
2
2
  module Nodes
3
3
  class Rand < Function
4
4
 
5
+ @@return_type = :number
6
+
5
7
  def initialize(seed = nil)
6
8
  if seed && seed.length == 1
7
9
  super seed
@@ -10,14 +12,6 @@ module ArelExtensions
10
12
  end
11
13
  end
12
14
 
13
- def left
14
- @expressions.first
15
- end
16
-
17
- def right
18
- @expressions[1]
19
- end
20
-
21
15
  end
22
16
  end
23
17
  end
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module ArelExtensions
3
- VERSION = "0.8.4".freeze
3
+ VERSION = "0.8.5".freeze
4
4
  end
@@ -4,11 +4,7 @@ module ArelExtensions
4
4
 
5
5
  def visit_ArelExtensions_Nodes_Ceil o, collector
6
6
  collector << "CEILING("
7
- if((o.expr).is_a?(Arel::Attributes::Attribute))
8
7
  collector = visit o.expr, collector
9
- else
10
- collector <<"#{o.expr}"
11
- end
12
8
  collector << ")"
13
9
  collector
14
10
  end
@@ -35,28 +31,7 @@ module ArelExtensions
35
31
  end
36
32
 
37
33
 
38
- def visit_ArelExtensions_Nodes_Coalesce o, collector
39
- collector << "COALESCE("
40
- if(o.left.is_a?(Arel::Attributes::Attribute))
41
- collector = visit o.left, collector
42
- else
43
- collector << "#{o.left}"
44
- end
45
- o.other.each { |a|
46
- collector << ","
47
- if(a.is_a?(Arel::Attributes::Attribute))
48
- collector = visit a, collector
49
- else
50
- collector << "#{a}"
51
- end
52
- }
53
- collector << ")"
54
- collector
55
- end
56
-
57
-
58
34
  def visit_ArelExtensions_Nodes_DateDiff o, collector
59
-
60
35
  collector << "DAY("
61
36
  collector = visit o.left, collector
62
37
  collector<< ","
@@ -92,11 +67,8 @@ module ArelExtensions
92
67
  end
93
68
 
94
69
 
95
- def visit_ArelExtensions_Nodes_Findis o, collector
96
70
 
97
- end
98
-
99
- def visit_ArelExtensions_Nodes_Isnull o, collector
71
+ def visit_ArelExtensions_Nodes_IsNull o, collector
100
72
  collector << "COALESCE("
101
73
  collector = visit o.left, collector
102
74
  collector << ","
@@ -109,98 +81,6 @@ module ArelExtensions
109
81
  collector
110
82
  end
111
83
 
112
-
113
- def visit_ArelExtensions_Nodes_Replace o, collector
114
- collector << "REPLACE("
115
- collector = visit o.expr,collector
116
- collector << ","
117
- if(o.left.is_a?(Arel::Attributes::Attribute))
118
- collector = visit o.left, collector
119
- else
120
- collector << "'#{o.left}'"
121
- end
122
- collector << ","
123
- if(o.right.is_a?(Arel::Attributes::Attribute))
124
- collector = visit o.right, collector
125
- else
126
- collector << "'#{o.right}'"
127
- end
128
- collector <<")"
129
- collector
130
- end
131
-
132
-
133
-
134
- def visit_ArelExtensions_Nodes_Soundex o, collector
135
- collector << "SOUNDEX("
136
- if((o.expr).is_a?(Arel::Attributes::Attribute))
137
- collector = visit o.expr, collector
138
- else
139
- collector <<"'#{o.expr}'"
140
- end
141
- collector << ")"
142
- collector
143
- end
144
-
145
-
146
- def visit_Arel_Nodes_Regexp o , collector
147
- collector = visit o.left, collector
148
- collector << " REGEXP "
149
- collector << "'#{o.right}'"
150
- collector
151
- end
152
-
153
-
154
-
155
- def visit_Arel_Nodes_NotRegexp o , collector
156
- collector = visit o.left, collector
157
- collector << " NOT REGEXP "
158
- collector << "'#{o.right}'"
159
- collector
160
- end
161
-
162
-
163
- def visit_ArelExtensions_Nodes_Trim o , collector
164
- collector << "TRIM("
165
- collector = visit o.left, collector
166
- collector << ","
167
- if(o.right.is_a?(Arel::Attributes::Attribute))
168
- collector = visit o.right, collector
169
- else
170
- collector << "'#{o.right}'"
171
- end
172
- collector << ")"
173
- collector
174
- end
175
-
176
- def visit_ArelExtensions_Nodes_Ltrim o , collector
177
- collector << "LTRIM("
178
- collector = visit o.left, collector
179
- collector << ","
180
- if(o.right.is_a?(Arel::Attributes::Attribute))
181
- collector = visit o.right, collector
182
- else
183
- collector << "'#{o.right}'"
184
- end
185
- collector << ")"
186
- collector
187
- end
188
-
189
-
190
- def visit_ArelExtensions_Nodes_Rtrim o , collector
191
- collector << "RTRIM("
192
- collector = visit o.left, collector
193
- collector << ","
194
- if(o.right.is_a?(Arel::Attributes::Attribute))
195
- collector = visit o.right, collector
196
- else
197
- collector << "'#{o.right}'"
198
- end
199
- collector << ")"
200
- collector
201
- end
202
-
203
-
204
84
  end
205
85
  end
206
86
  end
@@ -29,30 +29,10 @@ module ArelExtensions
29
29
  end
30
30
  end
31
31
 
32
- def visit_ArelExtensions_Nodes_Coalesce o, collector
33
- collector << "COALESCE("
34
- if(o.left.is_a?(Arel::Attributes::Attribute))
35
- collector = visit o.left, collector
36
- else
37
- collector << "#{o.left}"
38
- end
39
- o.other.each { |a|
40
- collector << ","
41
- if(a.is_a?(Arel::Attributes::Attribute))
42
- collector = visit a, collector
43
- else
44
- collector << "#{a}"
45
- end
46
- }
47
- collector << ")"
48
- collector
49
- end
50
-
51
32
  def visit_ArelExtensions_Nodes_DateDiff o, collector
52
-
53
- collector << "DATEDIFF(day,"
54
- collector = visit o.left, collector
55
- collector<< ","
33
+ collector << "DATEDIFF(day,"
34
+ collector = visit o.left, collector
35
+ collector<< ","
56
36
  if(o.right.is_a?(Arel::Attributes::Attribute))
57
37
  collector = visit o.right, collector
58
38
  else
@@ -85,11 +65,6 @@ module ArelExtensions
85
65
  collector
86
66
  end
87
67
 
88
-
89
- def visit_ArelExtensions_Nodes_Findis o,collector
90
- end
91
-
92
-
93
68
  def visit_ArelExtensions_Nodes_Length o, collector
94
69
  collector << "LEN("
95
70
  collector = visit o.expr, collector
@@ -100,18 +75,14 @@ module ArelExtensions
100
75
 
101
76
  def visit_ArelExtensions_Nodes_Locate o, collector
102
77
  collector << "CHARINDEX("
103
- if(o.val.is_a?(Arel::Attributes::Attribute))
104
- collector = visit o.val, collector
105
- else
106
- collector << "'#{o.val}'"
107
- end
78
+ collector = visit o.val, collector
108
79
  collector << ","
109
80
  collector = visit o.expr, collector
110
81
  collector << ")"
111
82
  collector
112
83
  end
113
84
 
114
- def visit_ArelExtensions_Nodes_Isnull o, collector
85
+ def visit_ArelExtensions_Nodes_IsNull o, collector
115
86
  collector << "ISNULL("
116
87
  collector = visit o.left, collector
117
88
  collector << ","
@@ -157,57 +128,6 @@ module ArelExtensions
157
128
  collector
158
129
  end
159
130
 
160
- def visit_ArelExtensions_Nodes_Soundex o, collector
161
- collector << "SOUNDEX("
162
- if((o.expr).is_a?(Arel::Attributes::Attribute))
163
- collector = visit o.expr, collector
164
- else
165
- collector << "'#{o.expr}'"
166
- end
167
- collector << ")"
168
- collector
169
- end
170
-
171
- def visit_ArelExtensions_Nodes_Trim o , collector
172
- collector << "TRIM("
173
- collector = visit o.left, collector
174
- collector << ","
175
- if(o.right.is_a?(Arel::Attributes::Attribute))
176
- collector = visit o.right, collector
177
- else
178
- collector << "'#{o.right}'"
179
- end
180
- collector << ")"
181
- collector
182
- end
183
-
184
- def visit_ArelExtensions_Nodes_Ltrim o , collector
185
- collector << "LTRIM("
186
- collector = visit o.left, collector
187
- collector << ","
188
- if(o.right.is_a?(Arel::Attributes::Attribute))
189
- collector = visit o.right, collector
190
- else
191
- collector << "'#{o.right}'"
192
- end
193
- collector << ")"
194
- collector
195
- end
196
-
197
-
198
- def visit_ArelExtensions_Nodes_Rtrim o , collector
199
- collector << "RTRIM("
200
- collector = visit o.left, collector
201
- collector << ","
202
- if(o.right.is_a?(Arel::Attributes::Attribute))
203
- collector = visit o.right, collector
204
- else
205
- collector << "'#{o.right}'"
206
- end
207
- collector << ")"
208
- collector
209
- end
210
-
211
131
  end
212
132
  end
213
133
  end
@@ -1,6 +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
5
 
5
6
  #String functions
6
7
  def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
@@ -94,23 +95,18 @@ module ArelExtensions
94
95
 
95
96
 
96
97
  def visit_ArelExtensions_Nodes_Duration o, collector
97
- #visit left for period
98
- if o.left == "d"
99
- collector << "DAY("
100
- elsif(o.left == "m")
101
- collector << "MONTH("
102
- elsif (o.left == "w")
103
- collector << "WEEK("
104
- elsif (o.left == "y")
105
- collector << "YEAR("
98
+ if o.left == 'wd'
99
+ collector << "(WEEKDAY("
100
+ collector = visit o.right, collector
101
+ collector << ") + 1) % 7"
102
+ else
103
+ collector << "#{Arel::Visitors::MySQL::DATE_MAPPING[o.left]}("
104
+ collector = visit o.right, collector
105
+ collector << ")"
106
106
  end
107
- #visit right
108
- collector = visit o.right, collector
109
- collector << ")"
110
107
  collector
111
108
  end
112
109
 
113
- #****************************************************************#
114
110
 
115
111
  def visit_ArelExtensions_Nodes_IsNull o, collector
116
112
  collector << "ISNULL("
@@ -123,18 +119,6 @@ module ArelExtensions
123
119
  collector
124
120
  end
125
121
 
126
-
127
- def visit_ArelExtensions_Nodes_Replace o, collector
128
- collector << "REPLACE("
129
- o.expressions.each_with_index { |arg, i|
130
- collector << Arel::Visitors::MySQL::COMMA unless i == 0
131
- collector = visit arg, collector
132
- }
133
- collector << ")"
134
- collector
135
- end
136
-
137
-
138
122
  def visit_ArelExtensions_Nodes_Wday o, collector
139
123
  collector << "(WEEKDAY("
140
124
  collector = visit o.date, collector
@@ -1,6 +1,17 @@
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'}
5
+
6
+ def visit_ArelExtensions_Nodes_Concat o, collector
7
+ collector << '('
8
+ o.expressions.each_with_index { |arg, i|
9
+ collector = visit o.convert_to_string_node(arg), collector
10
+ collector << ' || ' unless i == o.expressions.length - 1
11
+ }
12
+ collector << ')'
13
+ collector
14
+ end
4
15
 
5
16
  def visit_ArelExtensions_Nodes_IMatches o, collector
6
17
  collector = visit o.left.lower, collector
@@ -27,170 +38,174 @@ module ArelExtensions
27
38
  end
28
39
 
29
40
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
30
- collector << "LISTAGG("
41
+ collector << "(LISTAGG("
31
42
  collector = visit o.left, collector
32
43
  if o.right
33
44
  collector << Arel::Visitors::Oracle::COMMA
34
45
  collector = visit o.right, collector
35
46
  end
36
- collector << ")"
47
+ collector << ") WITHIN GROUP (ORDER BY "
48
+ collector = visit o.left, collector
49
+ collector << "))"
37
50
  collector
38
51
  end
39
52
 
40
53
  def visit_ArelExtensions_Nodes_Coalesce o, collector
41
54
  collector << "COALESCE("
42
- collector = visit o.left, collector
43
- o.other.each { |a|
44
- collector << Arel::Visitors::Oracle::COMMA
45
- collector = visit a, collector
55
+ o.expressions.each_with_index { |arg, i|
56
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
57
+ collector = visit arg, collector
46
58
  }
47
59
  collector << ")"
48
60
  collector
49
61
  end
50
62
 
51
- def visit_ArelExtensions_Nodes_DateDiff o, collector
52
- collector << '('
53
- collector = visit o.left, collector
54
- collector << " - "
55
- collector = visit o.right, collector
56
- collector << ')'
57
- collector
58
- end
59
-
63
+ def visit_ArelExtensions_Nodes_DateDiff o, collector
64
+ collector << '('
65
+ collector = visit o.left, collector
66
+ collector << " - "
67
+ collector = visit o.right, collector
68
+ collector << ')'
69
+ collector
70
+ end
60
71
 
61
- def visit_ArelExtensions_Nodes_Duration o, collector
62
- #visit left for period
63
- if(o.left == "d")
64
- collector << "DAY("
65
- elsif(o.left == "m")
66
- collector << "MONTH("
67
- elsif (o.left == "w")
68
- collector << "WEEK"
69
- elsif (o.left == "y")
70
- collector << "YEAR("
71
- end
72
- #visit right
73
- collector = visit o.right, collector
74
- collector << ")"
75
- collector
76
- end
72
+ def visit_ArelExtensions_Nodes_Duration o, collector
73
+ case o.left
74
+ when 'wd', 'w'
75
+ collector << "TO_CHAR("
76
+ collector = visit o.right, collector
77
+ collector << Arel::Visitors::Oracle::COMMA
78
+ collector = visit Arel::Nodes.build_quoted(Arel::Visitors::Oracle::DATE_MAPPING[o.left]), collector
79
+ else
80
+ collector << "EXTRACT(#{Arel::Visitors::Oracle::DATE_MAPPING[o.left]} FROM "
81
+ collector = visit o.right, collector
82
+ end
83
+ collector << ")"
84
+ collector
85
+ end
77
86
 
78
87
 
79
- def visit_ArelExtensions_Nodes_Length o, collector
80
- collector << "LENGTH("
81
- collector = visit o.expr, collector
82
- collector << ")"
83
- collector
84
- end
88
+ def visit_ArelExtensions_Nodes_Length o, collector
89
+ collector << "LENGTH("
90
+ collector = visit o.expr, collector
91
+ collector << ")"
92
+ collector
93
+ end
85
94
 
86
95
 
87
- def visit_ArelExtensions_Nodes_IsNull o, collector
88
- collector << "NVL("
89
- collector = visit o.left, collector
90
- collector << Arel::Visitors::Oracle::COMMA
91
- collector = visit Arel::Nodes.build_quoted(true), collector
92
- collector << ")"
93
- collector
94
- end
96
+ def visit_ArelExtensions_Nodes_IsNull o, collector
97
+ collector = visit o.left, collector
98
+ collector << ' IS NULL'
99
+ collector
100
+ end
95
101
 
96
- def visit_ArelExtensions_Nodes_Rand o, collector
97
- collector << "dbms_random.value("
98
- if(o.left != nil && o.right != nil)
99
- collector << "'#{o.left}'"
100
- collector << Arel::Visitors::Oracle::COMMA
101
- collector << "'#{o.right}'"
102
- end
103
- collector << ")"
104
- collector
105
- end
102
+ def visit_ArelExtensions_Nodes_Rand o, collector
103
+ collector << "DBMS_RANDOM.VALUE("
104
+ if(o.left != nil && o.right != nil)
105
+ collector = visit o.left, collector
106
+ collector << Arel::Visitors::Oracle::COMMA
107
+ collector = visit o.right, collector
108
+ end
109
+ collector << ")"
110
+ collector
111
+ end
106
112
 
107
- def visit_ArelExtensions_Nodes_Replace o, collector
108
- collector << "REPLACE("
109
- collector = visit o.expr,collector
110
- collector << Arel::Visitors::Oracle::COMMA
111
- collector = visit o.left, collector
112
- collector << Arel::Visitors::Oracle::COMMA
113
- collector = visit o.right, collector
114
- collector << ")"
115
- collector
116
- end
113
+ def visit_Arel_Nodes_Regexp o, collector
114
+ collector << " REGEXP_LIKE("
115
+ collector = visit o.left, collector
116
+ collector << Arel::Visitors::Oracle::COMMA
117
+ collector = visit o.right, collector
118
+ collector << ')'
119
+ collector
120
+ end
117
121
 
118
- def visit_Arel_Nodes_Regexp o, collector
119
- collector << " REGEXP_LIKE("
120
- collector = visit o.left, collector
121
- collector << Arel::Visitors::Oracle::COMMA
122
- collector = visit o.right, collector
123
- collector << ')'
124
- collector
125
- end
122
+ def visit_Arel_Nodes_NotRegexp o, collector
123
+ collector << " NOT REGEXP_LIKE("
124
+ collector = visit o.left, collector
125
+ collector << Arel::Visitors::Oracle::COMMA
126
+ collector = visit o.right, collector
127
+ collector << ')'
128
+ collector
129
+ end
126
130
 
131
+ def visit_ArelExtensions_Nodes_Soundex o, collector
132
+ collector << "SOUNDEX("
133
+ collector = visit o.expr, collector
134
+ collector << ")"
135
+ collector
136
+ end
127
137
 
128
- def visit_Arel_Nodes_NotRegexp o, collector
129
- collector << " NOT REGEXP_LIKE("
130
- collector = visit o.left, collector
131
- collector << Arel::Visitors::Oracle::COMMA
132
- collector = visit o.right, collector
133
- collector << ')'
134
- collector
135
- end
138
+ def visit_ArelExtensions_Nodes_Locate o, collector
139
+ collector << "INSTR("
140
+ o.expressions.each_with_index { |arg, i|
141
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
142
+ collector = visit arg, collector
143
+ }
144
+ collector << ")"
145
+ collector
146
+ end
136
147
 
137
- def visit_ArelExtensions_Nodes_Soundex o, collector
138
- collector << "SOUNDEX("
139
- if((o.expr).is_a?(Arel::Attributes::Attribute))
140
- collector = visit o.expr, collector
141
- else
142
- collector << "'#{o.expr}'"
148
+ def visit_ArelExtensions_Nodes_Trim o , collector
149
+ collector << 'TRIM(' # BOTH
150
+ collector = visit o.right, collector
151
+ collector << ' FROM '
152
+ collector = visit o.left, collector
153
+ collector << ")"
154
+ collector
143
155
  end
144
- collector << ")"
145
- collector
146
- end
147
156
 
148
- def visit_ArelExtensions_Nodes_Trim o , collector
149
- collector << 'TRIM("BOTH"'
150
- collector = visit o.left, collector
151
- collector << ","
152
- if(o.right.is_a?(Arel::Attributes::Attribute))
157
+ def visit_ArelExtensions_Nodes_Ltrim o, collector
158
+ collector << 'TRIM(LEADING '
153
159
  collector = visit o.right, collector
154
- else
155
- collector << "'#{o.right}'"
160
+ collector << ' FROM '
161
+ collector = visit o.left, collector
162
+ collector << ")"
163
+ collector
156
164
  end
157
- collector << ")"
158
- collector
159
- end
160
165
 
161
- def visit_ArelExtensions_Nodes_Ltrim o , collector
162
- collector << 'TRIM("LEADING",'
163
- collector = visit o.left, collector
164
- collector << ","
165
- if(o.right.is_a?(Arel::Attributes::Attribute))
166
+ def visit_ArelExtensions_Nodes_Rtrim o, collector
167
+ collector << 'TRIM(TRAILING '
166
168
  collector = visit o.right, collector
167
- else
168
- collector << "'#{o.right}'"
169
+ collector << ' FROM '
170
+ collector = visit o.left, collector
171
+ collector << ")"
172
+ collector
169
173
  end
170
- collector << ")"
171
- collector
172
- end
173
174
 
175
+ def visit_ArelExtensions_Nodes_DateAdd o, collector
176
+ collector << '('
177
+ collector = visit o.left, collector
178
+ collector << (o.right.value >= 0 ? ' + ' : ' - ')
179
+ collector = visit o.oracle_value(o.right), collector
180
+ collector << ')'
181
+ collector
182
+ end
174
183
 
175
- def visit_ArelExtensions_Nodes_Rtrim o , collector
176
- collector << 'TRIM("TRAILING",'
177
- collector = visit o.left, collector
178
- collector << ","
179
- if(o.right.is_a?(Arel::Attributes::Attribute))
180
- collector = visit o.right, collector
181
- else
182
- collector << "'#{o.right}'"
184
+ def visit_ArelExtensions_Nodes_Format o, collector
185
+ case o.col_type
186
+ when :date, :datetime
187
+ collector << "TO_CHAR("
188
+ collector = visit o.left, collector
189
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
190
+ collector = visit o.right, collector
191
+ collector << ")"
192
+ when :integer, :float, :decimal
193
+ collector << "FORMAT("
194
+ collector = visit o.left, collector
195
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
196
+ collector = visit o.right, collector
197
+ collector << ")"
198
+ else
199
+ collector = visit o.left, collector
200
+ end
201
+ collector
183
202
  end
184
- collector << ")"
185
- collector
186
- end
187
203
 
188
204
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
189
205
  table = collector.value.sub(/\AINSERT INTO/, '')
190
206
  into = " INTO#{table}"
191
207
  collector = Arel::Collectors::SQLString.new
192
208
  collector << "INSERT ALL\n"
193
- # row_nb = o.left.length
194
209
  o.left.each_with_index do |row, idx|
195
210
  collector << "#{into} VALUES ("
196
211
  v = Arel::Nodes::Values.new(row, o.cols)