brick 1.0.189 → 1.0.190

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: 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