Explore alternative approach to multi-state boolean use in Push Rule models
Overview
In our Push Rule models (PushRule
, GroupPushRule
, and OrganizationPushRule
), we currently implement a three-state setting system using nullable boolean columns:
true: explicitly enabled
false: explicitly disabled
NULL: inherit from global settings
This approach allows settings to cascade from global to group to project level using custom getters and setters in the model.
Current challenges
While this implementation works functionally, it presents several challenges:
- Database semantics: Using
NULL
to represent "inherit" overloads the typical meaning ofNULL
in databases - Schema clarity: The database schema alone doesn't communicate the special meaning of these nullable columns
- Query limitations: Writing SQL queries against these columns requires special
NULL
handling
Questions to consider
- What is the most clear and maintainable approach to replace the current multi-state boolean?
- What would be the migration path from the current implementation?
- Are there performance implications to consider?
- How would each approach affect query complexity?
Scope
This pattern appears in several settings fields across Push Rule models, including: reject_unsigned_commits
, commit_committer_check
, reject_non_dco_commits
and deny_delete_tag
Note
This was identified during the implementation of GroupPushRule
and OrganizationPushRule
. We decided to maintain the existing pattern for those models to ensure a safe migration path, with the intention to revisit this design holistically in the future.