@@ -386,6 +386,7 @@ def validate(
386386 * ,
387387 cast : bool = False ,
388388 eager : bool = True ,
389+ skip_member_validation : bool = False ,
389390 ** kwargs : Any ,
390391 ) -> Self :
391392 """Validate that a set of data frames satisfy the collection's invariants.
@@ -406,6 +407,11 @@ def validate(
406407 :meth:`~polars.LazyFrame.collect` on the individual member or
407408 :meth:`collect_all` on the collection. Note that, in the latter case,
408409 information from error messages is limited.
410+ skip_member_validation: Whether to skip validating individual members and only
411+ apply the collection filters. **Use this option with caution** as it
412+ requires the caller to ensure that the individual members have been
413+ validated. This option is particularly useful in performance-critical
414+ scenarios where the members are known to be valid.
409415 kwargs: Keyword arguments passed directly to :meth:`polars.collect_all` and
410416 :meth:`polars.LazyFrame.collect` when `eager=True`.
411417
@@ -429,7 +435,13 @@ def validate(
429435 if eager :
430436 # If we perform the validation eagerly, we call filter and check the failure
431437 # information to properly construct a useful error message.
432- filtered , failures = cls .filter (data , cast = cast , eager = True , ** kwargs )
438+ filtered , failures = cls .filter (
439+ data ,
440+ cast = cast ,
441+ eager = True ,
442+ skip_member_validation = skip_member_validation ,
443+ ** kwargs ,
444+ )
433445 if any (len (failure ) > 0 for failure in failures .values ()):
434446 errors : dict [str , str ] = {}
435447 for member , failure in failures .items ():
@@ -460,7 +472,17 @@ def validate(
460472 # efficiently as we cannot easily propagate error messages from different
461473 # members anyways.
462474 members : dict [str , pl .LazyFrame ] = {
463- name : member .schema .validate (data [name ].lazy (), cast = cast , eager = False )
475+ name : (
476+ (
477+ member .schema .cast (data [name ].lazy ())
478+ if cast
479+ else data [name ].lazy ()
480+ )
481+ if skip_member_validation
482+ else member .schema .validate (
483+ data [name ].lazy (), cast = cast , eager = False
484+ )
485+ )
464486 for name , member in cls .members ().items ()
465487 if name in data
466488 }
@@ -556,6 +578,7 @@ def filter(
556578 * ,
557579 cast : bool = False ,
558580 eager : bool = True ,
581+ skip_member_validation : bool = False ,
559582 ** kwargs : Any ,
560583 ) -> CollectionFilterResult [Self ]:
561584 """Filter the members data frame by their schemas and the collection's filters.
@@ -572,6 +595,11 @@ def filter(
572595 eager: Whether the filter operation should be performed eagerly.
573596 Note that until https://github.com/pola-rs/polars/pull/24129 is
574597 released, eagerly filtering can provide significant speedups.
598+ skip_member_validation: Whether to skip filtering individual members and only
599+ apply the collection filters. **Use this option with caution** as it
600+ requires the caller to ensure that the individual members have been
601+ validated. This option is particularly useful in performance-critical
602+ scenarios where the members are known to already be valid.
575603 kwargs: Keyword arguments passed directly to :meth:`polars.collect_all` and
576604 :meth:`polars.LazyFrame.collect` when `eager=True`.
577605
@@ -615,10 +643,20 @@ class HospitalInvoiceData(dy.Collection):
615643 if member .is_optional and member_name not in data :
616644 continue
617645
618- member_result , failures [member_name ] = member .schema .filter (
619- data [member_name ].lazy (), cast = cast , eager = eager , ** kwargs
620- )
621- results [member_name ] = member_result .lazy ()
646+ if skip_member_validation :
647+ results [member_name ] = (
648+ member .schema .cast (data [member_name ].lazy ())
649+ if cast
650+ else data [member_name ].lazy ()
651+ )
652+ failures [member_name ] = FailureInfo ._create_empty (
653+ member .schema , with_casting_rules = cast
654+ )
655+ else :
656+ member_result , failures [member_name ] = member .schema .filter (
657+ data [member_name ].lazy (), cast = cast , eager = eager , ** kwargs
658+ )
659+ results [member_name ] = member_result .lazy ()
622660
623661 # Once we've done that, we can apply the filters on this collection. To this end,
624662 # we iterate over all filters and store the filter results.
0 commit comments