java-topology/defects/rails/patch/rails-0011-time-zone-conversion-skip-list-set.patch
russell@unturf.com 547a9f5738 ORM wave 2: 10 new defects — Active Record +3, Exposed +3, SeaORM +4 (167 sites, 64 ecosystems)
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
2026-03-27 13:49:46 -04:00

32 lines
1.6 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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