familia 2.0.0.pre21 → 2.0.0.pre22
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 +4 -4
- data/.talismanrc +5 -1
- data/CHANGELOG.rst +43 -0
- data/Gemfile.lock +1 -1
- data/lib/familia/connection/operation_core.rb +1 -2
- data/lib/familia/connection/pipelined_core.rb +1 -3
- data/lib/familia/connection/transaction_core.rb +1 -2
- data/lib/familia/data_type/serialization.rb +76 -51
- data/lib/familia/data_type/types/sorted_set.rb +5 -10
- data/lib/familia/data_type/types/stringkey.rb +22 -0
- data/lib/familia/features/external_identifier.rb +29 -0
- data/lib/familia/features/object_identifier.rb +47 -0
- data/lib/familia/features/relationships/indexing/rebuild_strategies.rb +15 -15
- data/lib/familia/features/relationships/indexing/unique_index_generators.rb +8 -0
- data/lib/familia/horreum/database_commands.rb +6 -1
- data/lib/familia/horreum/management.rb +141 -10
- data/lib/familia/horreum/persistence.rb +3 -0
- data/lib/familia/identifier_extractor.rb +1 -1
- data/lib/familia/version.rb +1 -1
- data/lib/multi_result.rb +59 -31
- data/try/features/count_any_edge_cases_try.rb +486 -0
- data/try/features/count_any_methods_try.rb +197 -0
- data/try/features/external_identifier/external_identifier_try.rb +134 -0
- data/try/features/object_identifier/object_identifier_try.rb +138 -0
- data/try/features/relationships/indexing_rebuild_try.rb +6 -0
- data/try/integration/data_types/datatype_pipelines_try.rb +5 -3
- data/try/integration/data_types/datatype_transactions_try.rb +13 -7
- data/try/integration/models/customer_try.rb +3 -3
- data/try/unit/data_types/boolean_try.rb +35 -22
- data/try/unit/data_types/hash_try.rb +2 -2
- data/try/unit/data_types/serialization_try.rb +386 -0
- data/try/unit/horreum/destroy_related_fields_cleanup_try.rb +2 -1
- metadata +4 -7
- data/changelog.d/20251105_flexible_external_identifier_format.rst +0 -66
- data/changelog.d/20251107_112554_delano_179_participation_asymmetry.rst +0 -44
- data/changelog.d/20251107_213121_delano_fix_thread_safety_races_011CUumCP492Twxm4NLt2FvL.rst +0 -20
- data/changelog.d/20251107_fix_participates_in_symbol_resolution.rst +0 -91
- data/changelog.d/20251107_optimized_redis_exists_checks.rst +0 -94
- data/changelog.d/20251108_frozen_string_literal_pragma.rst +0 -44
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
.. Added
|
|
2
|
-
.. -----
|
|
3
|
-
|
|
4
|
-
- **Pipelined Bulk Loading Methods**: New `load_multi` and `load_multi_by_keys` methods enable efficient bulk object loading using Redis pipelining. These methods reduce network round trips from N×2 commands (EXISTS + HGETALL per object) to a single pipelined batch of HGETALL commands.
|
|
5
|
-
|
|
6
|
-
**Standard loading** (N objects, N×2 commands):
|
|
7
|
-
|
|
8
|
-
.. code-block:: ruby
|
|
9
|
-
|
|
10
|
-
users = ids.map { |id| User.find_by_id(id) }
|
|
11
|
-
# For 14 objects: 28 Redis commands (14 EXISTS + 14 HGETALL)
|
|
12
|
-
|
|
13
|
-
**Pipelined bulk loading** (N objects, 1 round trip):
|
|
14
|
-
|
|
15
|
-
.. code-block:: ruby
|
|
16
|
-
|
|
17
|
-
users = User.load_multi(ids)
|
|
18
|
-
# For 14 objects: 1 pipelined batch with 14 HGETALL commands
|
|
19
|
-
# Up to 2N× performance improvement
|
|
20
|
-
|
|
21
|
-
**Load by identifiers**:
|
|
22
|
-
|
|
23
|
-
.. code-block:: ruby
|
|
24
|
-
|
|
25
|
-
metadata_objects = Metadata.load_multi(['id1', 'id2', 'id3'])
|
|
26
|
-
# Returns array: [obj1, obj2, obj3]
|
|
27
|
-
|
|
28
|
-
# Filter out nils for missing objects
|
|
29
|
-
existing_only = Metadata.load_multi(ids).compact
|
|
30
|
-
|
|
31
|
-
**Load by full dbkeys**:
|
|
32
|
-
|
|
33
|
-
.. code-block:: ruby
|
|
34
|
-
|
|
35
|
-
keys = ['user:123:object', 'user:456:object']
|
|
36
|
-
users = User.load_multi_by_keys(keys)
|
|
37
|
-
|
|
38
|
-
The methods maintain the same nil-return contract as `find_by_id` for non-existent objects, preserve input order, and properly deserialize all Horreum field types. Ideal for loading collections of related objects, processing query results, or any scenario requiring multiple object lookups.
|
|
39
|
-
|
|
40
|
-
.. Changed
|
|
41
|
-
.. -------
|
|
42
|
-
|
|
43
|
-
- **Optional EXISTS Check Optimization**: The `find_by_dbkey` and `find_by_identifier` methods now accept a `check_exists:` parameter (default: `true`) to optionally skip the EXISTS check before HGETALL. This reduces Redis commands from 2 to 1 per object while maintaining backwards compatibility.
|
|
44
|
-
|
|
45
|
-
- **Parameter Consistency in find_by_identifier**: The `suffix` parameter is now a keyword parameter (was optional positional) for consistency with `check_exists`. This follows Ruby conventions that keyword parameters should not follow optional positional parameters. Maintains backwards compatibility since custom suffixes are rarely used.
|
|
46
|
-
|
|
47
|
-
**Safe mode** (default behavior, 2 commands):
|
|
48
|
-
|
|
49
|
-
.. code-block:: ruby
|
|
50
|
-
|
|
51
|
-
user = User.find_by_id(123)
|
|
52
|
-
# Commands: EXISTS user:123:object, then HGETALL user:123:object
|
|
53
|
-
|
|
54
|
-
**Optimized mode** (1 command):
|
|
55
|
-
|
|
56
|
-
.. code-block:: ruby
|
|
57
|
-
|
|
58
|
-
user = User.find_by_id(123, check_exists: false)
|
|
59
|
-
# Command: HGETALL user:123:object only
|
|
60
|
-
# Returns nil if key doesn't exist (empty hash detected)
|
|
61
|
-
|
|
62
|
-
**Use cases for optimized mode**:
|
|
63
|
-
|
|
64
|
-
- Performance-critical paths where 50% reduction matters
|
|
65
|
-
- Bulk operations with known-to-exist keys
|
|
66
|
-
- High-throughput APIs processing collections
|
|
67
|
-
- Loading objects from sorted set members (ZRANGEBYSCORE results)
|
|
68
|
-
|
|
69
|
-
The optimization is backwards compatible (default unchanged) and maintains the same nil-return behavior for non-existent keys by detecting empty hashes returned from HGETALL.
|
|
70
|
-
|
|
71
|
-
.. Deprecated
|
|
72
|
-
.. ----------
|
|
73
|
-
|
|
74
|
-
.. Removed
|
|
75
|
-
.. -------
|
|
76
|
-
|
|
77
|
-
.. Fixed
|
|
78
|
-
.. -----
|
|
79
|
-
|
|
80
|
-
- **Position Alignment in load_multi_by_keys**: Fixed bug where empty or nil keys caused result array misalignment. The method now tracks valid positions (like `load_multi`) to ensure the results array maintains the same positions as the input array, with nils for invalid keys.
|
|
81
|
-
|
|
82
|
-
.. Security
|
|
83
|
-
.. --------
|
|
84
|
-
|
|
85
|
-
.. Documentation
|
|
86
|
-
.. -------------
|
|
87
|
-
|
|
88
|
-
.. AI Assistance
|
|
89
|
-
.. -------------
|
|
90
|
-
|
|
91
|
-
- **Performance Analysis**: Claude Code analyzed the Redis command trace log provided by the user, identifying the EXISTS + HGETALL pattern as the performance bottleneck in bulk object loading scenarios.
|
|
92
|
-
- **Solution Design**: Claude Code designed a multi-faceted optimization approach: (1) optional EXISTS check bypass with backwards compatibility, (2) pipelined bulk loading methods, (3) comprehensive test coverage. The design balanced performance gains with API safety and backwards compatibility.
|
|
93
|
-
- **Implementation**: Claude Code implemented both optimization strategies including parameter additions, new bulk loading methods, comprehensive documentation with performance characteristics, and 28 test cases covering all scenarios including edge cases (nil identifiers, missing objects, order preservation).
|
|
94
|
-
- **Code Review**: Claude Code ensured the implementation follows Familia's existing patterns for field deserialization, maintains nil-return contracts, and properly handles Redis::Future objects in transaction contexts.
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
.. A new scriv changelog fragment.
|
|
2
|
-
..
|
|
3
|
-
.. Uncomment the section that is right (remove the leading dots).
|
|
4
|
-
.. For top level release notes, leave all the headers commented out.
|
|
5
|
-
..
|
|
6
|
-
.. Added
|
|
7
|
-
.. -----
|
|
8
|
-
..
|
|
9
|
-
.. - A bullet item for the Added category.
|
|
10
|
-
..
|
|
11
|
-
Changed
|
|
12
|
-
-------
|
|
13
|
-
|
|
14
|
-
- All Ruby files now include consistent headers with ``frozen_string_literal: true`` pragma for improved performance and memory efficiency. Headers follow the format: filename comment, blank comment line, frozen string literal pragma. Executable scripts properly place shebang first.
|
|
15
|
-
|
|
16
|
-
.. Deprecated
|
|
17
|
-
.. ----------
|
|
18
|
-
..
|
|
19
|
-
.. - A bullet item for the Deprecated category.
|
|
20
|
-
..
|
|
21
|
-
.. Removed
|
|
22
|
-
.. -------
|
|
23
|
-
..
|
|
24
|
-
.. - A bullet item for the Removed category.
|
|
25
|
-
..
|
|
26
|
-
.. Fixed
|
|
27
|
-
.. -----
|
|
28
|
-
..
|
|
29
|
-
.. - A bullet item for the Fixed category.
|
|
30
|
-
..
|
|
31
|
-
.. Security
|
|
32
|
-
.. --------
|
|
33
|
-
..
|
|
34
|
-
.. - A bullet item for the Security category.
|
|
35
|
-
..
|
|
36
|
-
.. Documentation
|
|
37
|
-
.. -------------
|
|
38
|
-
..
|
|
39
|
-
.. - A bullet item for the Documentation category.
|
|
40
|
-
..
|
|
41
|
-
AI Assistance
|
|
42
|
-
-------------
|
|
43
|
-
|
|
44
|
-
- Claude Sonnet 4.5 automated the addition of consistent file headers with frozen_string_literal pragma across 308 Ruby files, then corrected 35 executable scripts to ensure shebangs remain as the first line.
|