@@ -4545,6 +4545,9 @@ def _arch_consumer_fact_constraint(
45454545 variable = str (constraint ["variable" ])
45464546 if variable in ARCH_IGNORED_FACT_CONSTRAINT_VARIABLES :
45474547 return None
4548+ value = _json_scalar_text (constraint .get ("value" ))
4549+ if variable == "sex" :
4550+ return _arch_sex_constraint (str (constraint ["operator" ]), value )
45484551 try :
45494552 mapped_variable = ARCH_FACT_CONSTRAINT_VARIABLE_ALIASES [variable ]
45504553 except KeyError as exc :
@@ -4554,7 +4557,7 @@ def _arch_consumer_fact_constraint(
45544557 return (
45554558 mapped_variable ,
45564559 str (constraint ["operator" ]),
4557- _json_scalar_text ( constraint . get ( " value" )) ,
4560+ value ,
45584561 )
45594562
45604563
@@ -4689,6 +4692,13 @@ def _arch_fact_constraint(row: sqlite3.Row) -> tuple[str, str, str] | None:
46894692 variable = str (row ["constraint_variable" ])
46904693 if variable in ARCH_IGNORED_FACT_CONSTRAINT_VARIABLES :
46914694 return None
4695+ value = _sqlite_json_scalar_text (
4696+ row ["constraint_value_text" ],
4697+ row ["constraint_value_numeric" ],
4698+ row ["constraint_value_json" ],
4699+ )
4700+ if variable == "sex" :
4701+ return _arch_sex_constraint (str (row ["constraint_operator" ]), value )
46924702 try :
46934703 mapped_variable = ARCH_FACT_CONSTRAINT_VARIABLE_ALIASES [variable ]
46944704 except KeyError as exc :
@@ -4698,11 +4708,25 @@ def _arch_fact_constraint(row: sqlite3.Row) -> tuple[str, str, str] | None:
46984708 return (
46994709 mapped_variable ,
47004710 str (row ["constraint_operator" ]),
4701- _sqlite_json_scalar_text (
4702- row ["constraint_value_text" ],
4703- row ["constraint_value_numeric" ],
4704- row ["constraint_value_json" ],
4705- ),
4711+ value ,
4712+ )
4713+
4714+
4715+ def _arch_sex_constraint (operator : str , value : str ) -> tuple [str , str , str ]:
4716+ canonical_operator = _canonical_arch_constraint_operator (operator )
4717+ value_text = str (value ).strip ().lower ()
4718+ if value_text in {"female" , "f" , "2" , "2.0" }:
4719+ is_female_value = "1"
4720+ elif value_text in {"male" , "m" , "1" , "1.0" }:
4721+ is_female_value = "0"
4722+ else :
4723+ raise ValueError (f"No Microplex Arch sex constraint mapping for value { value !r} " )
4724+ if canonical_operator == "==" :
4725+ return ("is_female" , "==" , is_female_value )
4726+ if canonical_operator == "!=" :
4727+ return ("is_female" , "==" , "0" if is_female_value == "1" else "1" )
4728+ raise ValueError (
4729+ f"No Microplex Arch sex constraint mapping for operator { operator !r} "
47064730 )
47074731
47084732
0 commit comments