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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03e84e2dfa5e33f68986b9d63c7875e490ceaaab2f8e1a50a9974c42f883d1b5
4
- data.tar.gz: e2565adc58e0a2ccc236970baa804ede27522ce6d3688131bc5a23554cde71e1
3
+ metadata.gz: b393a3c07582141b6656bbf2f9ffe55193f6fd32c3505af7875a9e6f76fec7d0
4
+ data.tar.gz: 7571dfc93bc77a96e495b2c74799100320e7bf6666809ceb754ec5fc64efffc9
5
5
  SHA512:
6
- metadata.gz: 375915ceb4ff9845df08d952bf6e6e48f9e46e07ae4a7857dbca78ea698b7f5025ee634254fd5d8d03c7a7810df4c5ece16406864b4feba8604d7ce98b336770
7
- data.tar.gz: 0c4df8c117ab1f49b08bb16f3e7573d2600339ff26bc64bea6f2d42aa3ae5e419ebd4c33e8c833f8e057d919f10ebaf6f0f1713e0077603fb40d5e6cb6b5da93
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
- klass.arel_table[resolve_column_name(name)]
229
+ resolve_column(name)
221
230
  end
222
231
  end
223
232
 
224
- def resolve_column_name(name)
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
- return reflection.foreign_key.to_sym if reflection&.macro == :belongs_to
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
- name_sym
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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveWindows
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.6"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_windows
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Andriichuk