brick 1.0.133 → 1.0.135

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6804b443d939d24da85968d5b75c4c0603c8880dcc5ab4d07b20be0a52e5a349
4
- data.tar.gz: 17ed154ec5f8ec1f351a83120673e9354f892217da76957fdc49a31e663e9eba
3
+ metadata.gz: 28451931f3f43343f010a14d83dd3ed2d4c2fc80e61234d5a96775dd16ff4f11
4
+ data.tar.gz: aeb7327ab42e4252d60ec92bc25d93c778fe15d83744b830aad7673d833c3e75
5
5
  SHA512:
6
- metadata.gz: 1b4e53fe24d3de942a7388453d6ee732b0263097b08cbed104d7499842ffaa4eb7239b1bdb81b7300d08df9a628b2a99aad74f47de1fd3579b1eefbf0382b18a
7
- data.tar.gz: 3eb38e2a8f1e5c12493ff6e3a524d42157dcae2781d6d39f339d098b04b12d936989f3974977df589419ca04663a4c27f6b7425e09b9695817d9103fb7fd543f
6
+ metadata.gz: bd85040932260d4a6d68eb46a0406cdbce355a3beb793fa8b56fca51228f4227c430b44fdb7852a8280894720220af4e6564775dfd474bbecf722749909779c3
7
+ data.tar.gz: f4f34d81eab0bf2922c888d618dd1e115f605132578627f7a16c39420d78a574bf63b2fd3e4d3a9278ceab52c4abba6bbc16bf1884dfd4183c0473c8943e42ca
@@ -388,18 +388,42 @@ module ActiveRecord
388
388
  order_by_txt&.<<("Arel.sql(#{ord_expr})")
389
389
  s << Arel.sql(ord_expr)
390
390
  else # Expecting only Symbol
391
- if _br_hm_counts.key?(ord_part)
392
- ord_part = "\"b_r_#{ord_part}_ct\""
393
- elsif !_br_bt_descrip.key?(ord_part) && !_br_cust_cols.key?(ord_part) && !column_names.include?(ord_part.to_s)
391
+ ord_part = ord_part.to_s
392
+ if ord_part[0] == '-' # First char '-' means descending order
393
+ ord_part.slice!(0)
394
+ is_desc = true
395
+ end
396
+ if ord_part[0] == '~' # Char '~' means order NULLs as highest values instead of lowest
397
+ ord_part.slice!(0)
398
+ # (Unfortunately SQLServer does not support NULLS FIRST / NULLS LAST, so leave them out.)
399
+ is_nulls_switch = case ActiveRecord::Base.connection.adapter_name
400
+ when 'PostgreSQL', 'OracleEnhanced', 'SQLite'
401
+ :pg
402
+ when 'Mysql2', 'Trilogy'
403
+ :mysql
404
+ end
405
+ end
406
+ if _br_hm_counts.key?(ord_part_sym = ord_part.to_sym)
407
+ ord_part = +"\"b_r_#{ord_part}_ct\""
408
+ elsif _br_bt_descrip.key?(ord_part_sym)
409
+ ord_part = _br_bt_descrip.fetch(ord_part_sym, nil)&.first&.last&.first&.last&.dup
410
+ elsif !_br_cust_cols.key?(ord_part_sym) && !column_names.include?(ord_part)
394
411
  # Disallow ordering by a bogus column
395
412
  # %%% Note this bogus entry so that Javascript can remove any bogus _brick_order
396
413
  # parameter from the querystring, pushing it into the browser history.
397
414
  ord_part = nil
398
415
  end
416
+
399
417
  if ord_part
400
- # Retain any reference to a bt_descrip as being a symbol
401
- # Was: "#{quoted_table_name}.\"#{ord_part}\""
402
- order_by_txt&.<<(_br_bt_descrip.key?(ord_part) ? ord_part : ord_part.inspect)
418
+ ord_part << ' DESC' if is_desc
419
+ ord_part << (is_desc ? ' NULLS LAST' : ' NULLS FIRST') if is_nulls_switch == :pg
420
+ ord_part.insert(0, '-') if is_nulls_switch == :mysql
421
+
422
+ order_by_txt&.<<("Arel.sql(#{ord_part.inspect})")
423
+
424
+ # # Retain any reference to a bt_descrip as being a symbol
425
+ # # Was: "#{quoted_table_name}.\"#{ord_part}\""
426
+ # order_by_txt&.<<(_br_bt_descrip.key?(ord_part) ? ord_part : ord_part.inspect)
403
427
  s << ord_part
404
428
  end
405
429
  end
@@ -670,7 +694,6 @@ module ActiveRecord
670
694
  # Add derived table JOIN for the has_many counts
671
695
  nix = []
672
696
  klass._br_hm_counts.each do |k, hm|
673
- num_bt_things = 0
674
697
  count_column = if hm.options[:through]
675
698
  # Build the chain of JOINs going to the final destination HMT table
676
699
  # (Usually just one JOIN, but could be many.)
@@ -691,7 +714,11 @@ module ActiveRecord
691
714
  # Turn the last member of link_back into a foreign key
692
715
  link_back << hmt_assoc.source_reflection.foreign_key
693
716
  # If it's a HMT based on a HM -> HM, must JOIN the last table into the mix at the end
694
- through_sources.push(hm.source_reflection) unless hm.source_reflection.belongs_to?
717
+ this_hm = hm
718
+ while !(src_ref = this_hm.source_reflection).belongs_to? && (thr = src_ref.options[:through])
719
+ through_sources.push(this_hm = src_ref.active_record.reflect_on_association(thr))
720
+ end
721
+ through_sources.push(src_ref) unless src_ref.belongs_to?
695
722
  from_clause = +"#{through_sources.first.table_name} br_t0"
696
723
  fk_col = through_sources.shift.foreign_key
697
724
 
@@ -700,9 +727,7 @@ module ActiveRecord
700
727
  through_sources.map do |a|
701
728
  from_clause << "\n LEFT OUTER JOIN #{a.table_name} br_t#{idx += 1} "
702
729
  from_clause << if (src_ref = a.source_reflection).macro == :belongs_to
703
- nm = hmt_assoc.source_reflection.inverse_of&.name
704
- link_back << nm
705
- num_bt_things += 1
730
+ link_back << (nm = hmt_assoc.source_reflection.inverse_of&.name)
706
731
  # puts "BT #{a.table_name}"
707
732
  "ON br_t#{idx}.#{a.active_record.primary_key} = br_t#{idx - 1}.#{a.foreign_key}"
708
733
  elsif src_ref.options[:as]
@@ -723,9 +748,8 @@ module ActiveRecord
723
748
  end
724
749
  else # Standard has_many or has_one
725
750
  # puts "HM #{a.table_name}"
726
- # binding.pry unless (
727
751
  nm = hmt_assoc.source_reflection.inverse_of&.name
728
- # )
752
+ # binding.pry unless nm
729
753
  link_back << nm # if nm
730
754
  "ON br_t#{idx}.#{a.foreign_key} = br_t#{idx - 1}.#{a.active_record.primary_key}"
731
755
  end
@@ -742,16 +766,8 @@ module ActiveRecord
742
766
  nix << k
743
767
  next
744
768
  elsif src_ref.macro == :belongs_to # Traditional HMT using an associative table
745
- # binding.pry if link_back.length > 2
746
769
  "br_t#{idx}.#{hm.foreign_key}"
747
770
  else # A HMT that goes HM -> HM, something like Categories -> Products -> LineItems
748
- # %%% Currently flaky, so will revisit this soon, probably while implementing the whole link_back architecture
749
- if num_bt_things > 1
750
- # binding.pry
751
- nix << k
752
- next
753
- end
754
-
755
771
  "br_t#{idx}.#{src_ref.active_record.primary_key}"
756
772
  end
757
773
  else
@@ -845,7 +861,8 @@ JOIN (SELECT #{hm_selects.map { |s| "#{'br_t0.' if from_clause}#{s}" }.join(', '
845
861
  # or custom columns as they must be expanded to find the corresponding b_r_model__column
846
862
  # or br_cc_column naming for each.
847
863
  if order_by.present?
848
- final_order_by = *order_by.each_with_object([]) do |v, s|
864
+ order_by, _ = klass._brick_calculate_ordering(order_by, true) # Don't do the txt part
865
+ final_order_by = order_by.each_with_object([]) do |v, s|
849
866
  if v.is_a?(Symbol)
850
867
  # Add the ordered series of columns derived from the BT based on its DSL
851
868
  if (bt_cols = klass._br_bt_descrip[v])
@@ -1140,7 +1157,7 @@ Module.class_exec do
1140
1157
  base_module.const_set(schema_name.to_sym, (built_module = Module.new))
1141
1158
 
1142
1159
  [built_module, "module #{schema_name}; end\n"]
1143
- # # %%% Perhaps an option to use the first module just as schema, and additional modules as namespace with a table name prefix applied
1160
+ # %%% Perhaps an option to use the first module just as schema, and additional modules as namespace with a table name prefix applied
1144
1161
 
1145
1162
  # AVO Resource
1146
1163
  elsif base_module == Object && Object.const_defined?('Avo') && requested.end_with?('Resource') &&
@@ -1786,8 +1803,7 @@ class Object
1786
1803
 
1787
1804
  # %%% Allow params to define which columns to use for order_by
1788
1805
  # Overriding the default by providing a querystring param?
1789
- ordering = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
1790
- order_by, _ = real_model._brick_calculate_ordering(ordering, true) # Don't do the txt part
1806
+ order_by = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
1791
1807
 
1792
1808
  ar_relation = ActiveRecord.version < Gem::Version.new('4') ? real_model.preload : real_model.all
1793
1809
  params['_brick_is_api'] = true if (is_api = request.format == :js || current_api_root)
@@ -1711,9 +1711,9 @@ end
1711
1711
  <tr><td>(none)</td></tr>
1712
1712
  <% else
1713
1713
  collection2.each do |#{hm_singular_name}| %>
1714
- <tr><td><%= br_descrip ||= #{hm_singular_name}.brick_descrip(
1715
- descrip_cols&.first&.map { |col| #{hm_singular_name}.send(col.last) }
1716
- )
1714
+ <tr><td><%= br_descrip = #{hm_singular_name}.brick_descrip(
1715
+ descrip_cols&.first&.map { |col| #{hm_singular_name}.send(col.last) }
1716
+ )
1717
1717
  link_to(br_descrip, #{hm.first.klass._brick_index(:singular)}_path(slashify(#{obj_pk}))) %></td></tr>
1718
1718
  <% end %>
1719
1719
  <% end %>
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 133
8
+ TINY = 135
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brick
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.133
4
+ version: 1.0.135
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorin Thwaits
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-24 00:00:00.000000000 Z
11
+ date: 2023-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord