brick 1.0.189 → 1.0.190

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: 382e04c6f26509410cbd0660360620ad0ada6f40492babff8c65af9e53e41b02
4
- data.tar.gz: 4a6cb0143dce1953a601cf26e7217d3723fc36c8ab2ba45750ce21761d931e14
3
+ metadata.gz: 3e7a12940f4ac57eea3c53bb3b437472f90bbaa857bd6611d3e871463add46f2
4
+ data.tar.gz: 8afb6e47cebd99a9b4172aa82d9447b71dd66e6df750249063b66b9b9ba939a9
5
5
  SHA512:
6
- metadata.gz: 45cb41aa504aa8171387e3de188437d6a210b7c8769770c161e58cb566c850e2a557fc7a102538df42bfefb4a35c8f6d5d43e5b65b16920a1adcd2cf5b18068c
7
- data.tar.gz: e67fcd671d56691628e2164d266c16d014aa78882d43a2e555b65816b347df8dc61c92df1986e716cd613b25dae7a35160b7e3995dd9a842a41e73a75d75540d
6
+ metadata.gz: d5379ddb6c61675b5606730a771a3f95638829b8359b42fd78c0509836635a93d36b787b09f21a0b9321623c917a149508b643a68ff4474baf7b40739ad5eeed
7
+ data.tar.gz: 40b6c6dc4fd31b10632fafb572608ec1c6473b6efa1dab346f1c82fc4f9daa1faba6d3675b336a780291595e25ace20358a95205a9284e7c42ddf450efe1d0a4
@@ -98,6 +98,7 @@ module ActiveRecord
98
98
  end
99
99
 
100
100
  def _br_quoted_name(name)
101
+ name = name.join('.') if name.is_a?(Array)
101
102
  if name == '*'
102
103
  name
103
104
  elsif is_mysql
@@ -2895,24 +2896,32 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
2895
2896
  # end
2896
2897
  # end
2897
2898
  # schema = ::Brick.default_schema # Reset back for this next round of fun
2899
+ kcus = nil
2898
2900
  case ActiveRecord::Base.connection.adapter_name
2899
2901
  when 'PostgreSQL', 'Mysql2', 'Trilogy', 'SQLServer'
2900
- sql = "SELECT kcu1.CONSTRAINT_SCHEMA, kcu1.TABLE_NAME, kcu1.COLUMN_NAME,
2901
- kcu2.CONSTRAINT_SCHEMA AS primary_schema, kcu2.TABLE_NAME AS primary_table, kcu1.CONSTRAINT_NAME AS CONSTRAINT_SCHEMA_FK
2902
+ # All KCUs -- use this to virtually JOIN against fk_references in Ruby code
2903
+ sql = "SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, ORDINAL_POSITION,
2904
+ TABLE_NAME, COLUMN_NAME
2905
+ FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE#{"
2906
+ WHERE CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }"
2907
+ kcus = ActiveRecord::Base.execute_sql(sql).each_with_object({}) do |v, s|
2908
+ key = "#{v['constraint_name']}.#{v['constraint_schema']}.#{v['constraint_catalog']}.#{v['ordinal_position']}"
2909
+ key << ".#{v['table_name']}.#{v['column_name']}" unless is_postgres || is_mssql
2910
+ s[key] = [v['constraint_schema'], v['table_name']]
2911
+ end
2912
+
2913
+ sql = "SELECT kcu.CONSTRAINT_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME,
2914
+ #{# These will get filled in with real values (effectively doing the JOIN in Ruby)
2915
+ is_postgres || is_mssql ? 'NULL as primary_schema, NULL as primary_table' :
2916
+ 'kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME'},
2917
+ kcu.CONSTRAINT_NAME AS CONSTRAINT_SCHEMA_FK,
2918
+ rc.UNIQUE_CONSTRAINT_NAME, rc.UNIQUE_CONSTRAINT_SCHEMA, rc.UNIQUE_CONSTRAINT_CATALOG, kcu.ORDINAL_POSITION
2902
2919
  FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc
2903
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu1
2904
- ON kcu1.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG
2905
- AND kcu1.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
2906
- AND kcu1.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
2907
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu2
2908
- ON kcu2.CONSTRAINT_CATALOG = rc.UNIQUE_CONSTRAINT_CATALOG
2909
- AND kcu2.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA
2910
- AND kcu2.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME#{"
2911
- AND kcu2.TABLE_NAME = kcu1.REFERENCED_TABLE_NAME
2912
- AND kcu2.COLUMN_NAME = kcu1.REFERENCED_COLUMN_NAME" unless is_postgres || is_mssql }
2913
- AND kcu2.ORDINAL_POSITION = kcu1.ORDINAL_POSITION#{"
2914
- WHERE kcu1.CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }"
2915
- # AND kcu2.TABLE_NAME = ?;", Apartment::Tenant.current, table_name
2920
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu
2921
+ ON kcu.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG
2922
+ AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
2923
+ AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME#{"
2924
+ WHERE kcu.CONSTRAINT_SCHEMA = COALESCE(current_setting('SEARCH_PATH'), 'public')" if is_postgres && schema }"
2916
2925
  fk_references = ActiveRecord::Base.execute_sql(sql)
2917
2926
  when 'SQLite'
2918
2927
  sql = "SELECT NULL AS constraint_schema, m.name, fkl.\"from\", NULL AS primary_schema, fkl.\"table\", m.name || '_' || fkl.\"from\" AS constraint_name
@@ -2943,6 +2952,11 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
2943
2952
  ::Brick.default_schema ||= 'public' if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
2944
2953
  fk_references&.each do |fk|
2945
2954
  fk = fk.values unless fk.is_a?(Array)
2955
+ # Virtually JOIN against fk_references in order to change out the primary schema and primary table
2956
+ if (kcu = kcus&.fetch("#{fk[6]}.#{fk[7]}.#{fk[8]}.#{fk[9]}", nil))
2957
+ fk[3] = kcu[0]
2958
+ fk[4] = kcu[1]
2959
+ end
2946
2960
  # Multitenancy makes things a little more general overall, except for non-tenanted tables
2947
2961
  if ::Brick.is_apartment_excluded_table(::Brick.namify(fk[1]))
2948
2962
  fk[0] = ::Brick.apartment_default_tenant
@@ -2967,6 +2981,7 @@ ORDER BY 1, 2, c.internal_column_id, acc.position"
2967
2981
  end
2968
2982
  ::Brick._add_bt_and_hm(fk, relations)
2969
2983
  end
2984
+ kcus = nil # Allow this large item to be garbage collected
2970
2985
  end
2971
2986
 
2972
2987
  table_name_lookup = (::Brick.table_name_lookup ||= {})
@@ -738,8 +738,11 @@ window.addEventListener(\"popstate\", linkSchemas);
738
738
  hms_columns << hm_entry
739
739
  end
740
740
  when 'show', 'new', 'update'
741
+ predicates = nil
741
742
  hm_stuff << if hm_fk_name
742
- if hm_assoc.klass.column_names.include?(hm_fk_name.to_s) ||
743
+ if (hm_fk_name.is_a?(Array) && # Composite key?
744
+ hm_fk_name.all? { |hm_fk_part| hm_assoc.klass.column_names.include?(hm_fk_part) }) ||
745
+ hm_assoc.klass.column_names.include?(hm_fk_name.to_s) ||
743
746
  (hm_fk_name.is_a?(String) && hm_fk_name.include?('.')) # HMT? (Could do a better check for this)
744
747
  predicates = path_keys(hm_assoc, hm_fk_name, pk).map do |k, v|
745
748
  if v == '[sti_type]'
@@ -1638,7 +1641,7 @@ end
1638
1641
  end
1639
1642
  s << "<table id=\"#{hm_name}\" class=\"shadow\">
1640
1643
  <tr><th>#{hm[1]}#{' poly' if hm[0].options[:as]} #{hm[3]}
1641
- <% if respond_to?(:new_#{partial_new_path_name = hm.first.klass._brick_index(:singular)}_path) %>
1644
+ <% if predicates && respond_to?(:new_#{partial_new_path_name = hm.first.klass._brick_index(:singular)}_path) %>
1642
1645
  <span class = \"add-hm-related\"><%=
1643
1646
  pk_val = (obj_pk = model.primary_key).is_a?(String) ? obj.send(obj_pk) : obj_pk.map { |pk_part| obj.send(pk_part) }
1644
1647
  pk_val_arr = [pk_val] unless pk_val.is_a?(Array)
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 189
8
+ TINY = 190
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.189
4
+ version: 1.0.190
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-11-17 00:00:00.000000000 Z
11
+ date: 2023-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord