@@ -938,82 +938,6 @@ def translate_column_names(
938938 return visit (expr , _ColumnNameTranslator (file_schema , case_sensitive , projected_fields ))
939939
940940
941- class _ProjectedColumnsEvaluator (BooleanExpressionVisitor [BooleanExpression ]):
942- """Evaluated predicates which involve projected columns missing from the file.
943-
944- Args:
945- file_schema (Schema): The schema of the file.
946- projected_schema (Schema): The schema to project onto the data files.
947- case_sensitive (bool): Whether to consider case when binding a reference to a field in a schema, defaults to True.
948- projected_missing_fields(dict[str, Any]): Map of fields missing in file_schema, but present as partition values.
949-
950- Raises:
951- TypeError: In the case of an UnboundPredicate.
952- """
953-
954- file_schema : Schema
955- case_sensitive : bool
956-
957- def __init__ (
958- self , file_schema : Schema , projected_schema : Schema , case_sensitive : bool , projected_missing_fields : dict [str , Any ]
959- ) -> None :
960- self .file_schema = file_schema
961- self .projected_schema = projected_schema
962- self .case_sensitive = case_sensitive
963- self .projected_missing_fields = projected_missing_fields
964-
965- def visit_true (self ) -> BooleanExpression :
966- return AlwaysTrue ()
967-
968- def visit_false (self ) -> BooleanExpression :
969- return AlwaysFalse ()
970-
971- def visit_not (self , child_result : BooleanExpression ) -> BooleanExpression :
972- return Not (child = child_result )
973-
974- def visit_and (self , left_result : BooleanExpression , right_result : BooleanExpression ) -> BooleanExpression :
975- return And (left = left_result , right = right_result )
976-
977- def visit_or (self , left_result : BooleanExpression , right_result : BooleanExpression ) -> BooleanExpression :
978- return Or (left = left_result , right = right_result )
979-
980- def visit_unbound_predicate (self , predicate : UnboundPredicate [L ]) -> BooleanExpression :
981- raise TypeError (f"Expected Bound Predicate, got: { predicate .term } " )
982-
983- def visit_bound_predicate (self , predicate : BoundPredicate [L ]) -> BooleanExpression :
984- file_column_name = self .file_schema .find_column_name (predicate .term .ref ().field .field_id )
985-
986- if file_column_name is None and (field_name := predicate .term .ref ().field .name ) in self .projected_missing_fields :
987- unbound_predicate : BooleanExpression
988- if isinstance (predicate , BoundUnaryPredicate ):
989- unbound_predicate = predicate .as_unbound (field_name )
990- elif isinstance (predicate , BoundLiteralPredicate ):
991- unbound_predicate = predicate .as_unbound (field_name , predicate .literal )
992- elif isinstance (predicate , BoundSetPredicate ):
993- unbound_predicate = predicate .as_unbound (field_name , predicate .literals )
994- else :
995- raise ValueError (f"Unsupported predicate: { predicate } " )
996- field = self .projected_schema .find_field (field_name )
997- schema = Schema (field )
998- evaluator = expression_evaluator (schema , unbound_predicate , self .case_sensitive )
999- if evaluator (Record (self .projected_missing_fields [field_name ])):
1000- return AlwaysTrue ()
1001- else :
1002- return AlwaysFalse ()
1003-
1004- return predicate
1005-
1006-
1007- def evaluate_projected_columns (
1008- expr : BooleanExpression ,
1009- file_schema : Schema ,
1010- projected_schema : Schema ,
1011- case_sensitive : bool ,
1012- projected_missing_fields : dict [str , Any ],
1013- ) -> BooleanExpression :
1014- return visit (expr , _ProjectedColumnsEvaluator (file_schema , projected_schema , case_sensitive , projected_missing_fields ))
1015-
1016-
1017941class _ExpressionFieldIDs (BooleanExpressionVisitor [Set [int ]]):
1018942 """Extracts the field IDs used in the BooleanExpression."""
1019943
0 commit comments