active_windows 0.1.5 → 0.1.6
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/lib/active_windows/active_record_extensions.rb +28 -6
- data/lib/active_windows/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b393a3c07582141b6656bbf2f9ffe55193f6fd32c3505af7875a9e6f76fec7d0
|
|
4
|
+
data.tar.gz: 7571dfc93bc77a96e495b2c74799100320e7bf6666809ceb754ec5fc64efffc9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8380c1b66b1a1a3c31f9e9c5a9035c43ff7689e499254b4bd7d9b250fbfaeb36054c8a012e49f4f84756a0a6ab8c42bf3a931bad82fda768b07556f955bdac3a
|
|
7
|
+
data.tar.gz: 92128ba7625b79177654e2f09a76f163d5901ddf2105f84174fe591d81dd020d276fdddb428d76649c0648ac7127f2bfcbee4b539c007221c74be1c6d231ae85
|
|
@@ -72,9 +72,18 @@ module ActiveWindows
|
|
|
72
72
|
raise ArgumentError, "wrong number of arguments (given 0, expected 1+)" if args.empty?
|
|
73
73
|
|
|
74
74
|
processed = process_window_args(args)
|
|
75
|
-
arel_nodes = processed.map { |name, options| build_window_function(name, options || {}) }
|
|
76
75
|
|
|
77
76
|
result = spawn
|
|
77
|
+
|
|
78
|
+
# Auto-join has_one associations referenced in partition/order
|
|
79
|
+
joins_needed = processed.flat_map do |_name, options|
|
|
80
|
+
next [] unless options.is_a?(Hash)
|
|
81
|
+
association_joins_for(options[:partition]) + association_joins_for(options[:order])
|
|
82
|
+
end.uniq
|
|
83
|
+
result = result.joins(*joins_needed) if joins_needed.any?
|
|
84
|
+
|
|
85
|
+
arel_nodes = processed.map { |name, options| build_window_function(name, options || {}) }
|
|
86
|
+
|
|
78
87
|
# Ensure we keep all columns alongside the window function columns
|
|
79
88
|
result = result.select(klass.arel_table[Arel.star]) if result.select_values.empty?
|
|
80
89
|
result.select(*arel_nodes)
|
|
@@ -217,18 +226,31 @@ module ActiveWindows
|
|
|
217
226
|
if name.is_a?(Arel::Nodes::Node) || name.is_a?(Arel::Nodes::SqlLiteral)
|
|
218
227
|
name
|
|
219
228
|
else
|
|
220
|
-
|
|
229
|
+
resolve_column(name)
|
|
221
230
|
end
|
|
222
231
|
end
|
|
223
232
|
|
|
224
|
-
def
|
|
233
|
+
def resolve_column(name)
|
|
225
234
|
name_sym = name.to_sym
|
|
226
|
-
return name_sym if klass.column_names.include?(name.to_s)
|
|
235
|
+
return klass.arel_table[name_sym] if klass.column_names.include?(name.to_s)
|
|
227
236
|
|
|
228
237
|
reflection = klass.reflect_on_association(name_sym)
|
|
229
|
-
|
|
238
|
+
if reflection&.macro == :belongs_to
|
|
239
|
+
klass.arel_table[reflection.foreign_key.to_sym]
|
|
240
|
+
elsif reflection&.macro == :has_one
|
|
241
|
+
reflection.klass.arel_table[reflection.klass.primary_key.to_sym]
|
|
242
|
+
else
|
|
243
|
+
klass.arel_table[name_sym]
|
|
244
|
+
end
|
|
245
|
+
end
|
|
230
246
|
|
|
231
|
-
|
|
247
|
+
def association_joins_for(columns)
|
|
248
|
+
Array(columns).filter_map do |col|
|
|
249
|
+
next unless col.is_a?(Symbol) || col.is_a?(String)
|
|
250
|
+
|
|
251
|
+
reflection = klass.reflect_on_association(col.to_sym)
|
|
252
|
+
col.to_sym if reflection&.macro == :has_one
|
|
253
|
+
end
|
|
232
254
|
end
|
|
233
255
|
|
|
234
256
|
def arel_order(expr)
|