rails-0009: FilterAttributeHandler filter_parameters Array O(A×F) → Set (450×) rails-0010: Encryption::AutoFilteredParameters two Array scans → Set (250×) rails-0011: TimeZoneConversion skip_list Array O(M×C×S) → Set (20×) exposed-0001: SchemaUtilityApi mapMissingColumnStatements O(N×M) → map (118×) exposed-0002: IdentifierManagerApi isAKeyword O(K) linear → HashSet (144×) exposed-0003: Table.clone consParams.map fresh List → hoisted HashSet (6×) seaorm-0001: active_model establish_links leftover.any O(N²) → HashSet (501×) seaorm-0002: rbac engine group_permissions .values().find() → HashMap by ID (502×) seaorm-0003: schema builder sorted_tables Vec::contains → HashSet (500×) seaorm-0004: TopologicalSort from_iter seen Vec O(N²) → BTreeSet (28×) Unit tests: RailsTest 11/11, ExposedTest 3/3, SeaORMTest 4/4 PASS Whitepaper: 157→167 sites, 62→64 ecosystems; §13.12 ORM Wave 2 added
32 lines
1.6 KiB
Diff
32 lines
1.6 KiB
Diff
Fixes rails-0011: TimeZoneConversion — skip_time_zone_conversion_for_attributes Array#include? O(M×C×S) during schema load.
|
||
|
||
--- a/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb
|
||
+++ b/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb
|
||
|
||
@@ DEFECT rails-0011: lines 83-88
|
||
|
||
def create_time_zone_conversion_attribute?(name, cast_type)
|
||
- enabled_for_column = time_zone_aware_attributes &&
|
||
- !skip_time_zone_conversion_for_attributes.include?(name.to_sym) # O(S) per column
|
||
-
|
||
- enabled_for_column && time_zone_aware_types.include?(cast_type.type) # O(T) per column
|
||
+ @skip_tz_set ||= skip_time_zone_conversion_for_attributes.to_set # FIX: O(1) include?
|
||
+ @tz_types_set ||= time_zone_aware_types.to_set # FIX: O(1) include?
|
||
+ enabled_for_column = time_zone_aware_attributes &&
|
||
+ !@skip_tz_set.include?(name.to_sym)
|
||
+
|
||
+ enabled_for_column && @tz_types_set.include?(cast_type.type)
|
||
end
|
||
|
||
# NOTE: @skip_tz_set and @tz_types_set must be invalidated when the class_attributes are reassigned.
|
||
# Add a custom setter or hook into class_attribute to reset the cache:
|
||
#
|
||
# def skip_time_zone_conversion_for_attributes=(value)
|
||
# @skip_tz_set = nil
|
||
# super
|
||
# end
|
||
|
||
# BEFORE: skip_time_zone_conversion_for_attributes.include? is Array#include? O(S) per column
|
||
# Called C times per model class, M model classes: O(M×C×S) total at boot
|
||
# AFTER: @skip_tz_set is a memoized Set per class: O(1) per column → O(M×C) total
|
||
# Speedup: ~S× at M=100 models, C=50 columns, S=20 skip-list entries
|