2323 Dict ,
2424 Generic ,
2525 List ,
26+ Optional ,
2627 Set ,
2728 SupportsFloat ,
2829 Tuple ,
@@ -861,6 +862,7 @@ class _ColumnNameTranslator(BooleanExpressionVisitor[BooleanExpression]):
861862 Args:
862863 file_schema (Schema): The schema of the file.
863864 case_sensitive (bool): Whether to consider case when binding a reference to a field in a schema, defaults to True.
865+ projected_fields (Dict[str, Any]): Partition field values for missing fields from projection.
864866
865867 Raises:
866868 TypeError: In the case of an UnboundPredicate.
@@ -869,10 +871,12 @@ class _ColumnNameTranslator(BooleanExpressionVisitor[BooleanExpression]):
869871
870872 file_schema : Schema
871873 case_sensitive : bool
874+ projected_fields : Dict [str , Any ]
872875
873- def __init__ (self , file_schema : Schema , case_sensitive : bool ) -> None :
876+ def __init__ (self , file_schema : Schema , case_sensitive : bool , projected_fields : Optional [ Dict [ str , Any ]] = None ) -> None :
874877 self .file_schema = file_schema
875878 self .case_sensitive = case_sensitive
879+ self .projected_fields = projected_fields or {}
876880
877881 def visit_true (self ) -> BooleanExpression :
878882 return AlwaysTrue ()
@@ -912,7 +916,9 @@ def visit_bound_predicate(self, predicate: BoundPredicate[L]) -> BooleanExpressi
912916
913917 return (
914918 AlwaysTrue ()
915- if expression_evaluator (Schema (field ), pred , case_sensitive = self .case_sensitive )(Record (field .initial_default ))
919+ if expression_evaluator (Schema (field ), pred , case_sensitive = self .case_sensitive )(
920+ Record (field .initial_default or self .projected_fields .get (field .name , None ))
921+ )
916922 else AlwaysFalse ()
917923 )
918924
@@ -926,8 +932,10 @@ def visit_bound_predicate(self, predicate: BoundPredicate[L]) -> BooleanExpressi
926932 raise ValueError (f"Unsupported predicate: { predicate } " )
927933
928934
929- def translate_column_names (expr : BooleanExpression , file_schema : Schema , case_sensitive : bool ) -> BooleanExpression :
930- return visit (expr , _ColumnNameTranslator (file_schema , case_sensitive ))
935+ def translate_column_names (
936+ expr : BooleanExpression , file_schema : Schema , case_sensitive : bool , projected_fields : Optional [Dict [str , Any ]] = None
937+ ) -> BooleanExpression :
938+ return visit (expr , _ColumnNameTranslator (file_schema , case_sensitive , projected_fields ))
931939
932940
933941class _ProjectedColumnsEvaluator (BooleanExpressionVisitor [BooleanExpression ]):
0 commit comments