@@ -537,9 +537,9 @@ export function targetGetSegmentCount(target: Target): number {
537
537
export abstract class Filter {
538
538
abstract matches ( doc : Document ) : boolean ;
539
539
540
- abstract getFlattenedFilters ( ) : FieldFilter [ ] ;
540
+ abstract getFlattenedFilters ( ) : readonly FieldFilter [ ] ;
541
541
542
- abstract getFilters ( ) : Filter [ ] ;
542
+ abstract getFilters ( ) : readonly Filter [ ] ;
543
543
544
544
abstract getFirstInequalityField ( ) : FieldPath | null ;
545
545
}
@@ -570,11 +570,12 @@ export const enum Direction {
570
570
DESCENDING = 'desc'
571
571
}
572
572
573
+ // TODO(orquery) move Filter classes to a new file, e.g. filter.ts
573
574
export class FieldFilter extends Filter {
574
575
protected constructor (
575
- public field : FieldPath ,
576
- public op : Operator ,
577
- public value : ProtoValue
576
+ public readonly field : FieldPath ,
577
+ public readonly op : Operator ,
578
+ public readonly value : ProtoValue
578
579
) {
579
580
super ( ) ;
580
581
}
@@ -697,11 +698,11 @@ export class FieldFilter extends Filter {
697
698
) ;
698
699
}
699
700
700
- getFlattenedFilters ( ) : FieldFilter [ ] {
701
+ getFlattenedFilters ( ) : readonly FieldFilter [ ] {
701
702
return [ this ] ;
702
703
}
703
704
704
- getFilters ( ) : Filter [ ] {
705
+ getFilters ( ) : readonly Filter [ ] {
705
706
return [ this ] ;
706
707
}
707
708
@@ -714,9 +715,11 @@ export class FieldFilter extends Filter {
714
715
}
715
716
716
717
export class CompositeFilter extends Filter {
718
+ private memoizedFlattenedFilters : FieldFilter [ ] | null = null ;
719
+
717
720
protected constructor (
718
- public filters : Filter [ ] ,
719
- public op : CompositeOperator
721
+ public readonly filters : readonly Filter [ ] ,
722
+ public readonly op : CompositeOperator
720
723
) {
721
724
super ( ) ;
722
725
}
@@ -738,21 +741,20 @@ export class CompositeFilter extends Filter {
738
741
}
739
742
}
740
743
741
- getFlattenedFilters ( ) : FieldFilter [ ] {
742
- // TODO(orquery): memoize this result if this method is used more than once
743
- let result : FieldFilter [ ] = [ ] ;
744
- result = this . filters . reduce ( ( result , subfilter ) => {
744
+ getFlattenedFilters ( ) : readonly FieldFilter [ ] {
745
+ if ( this . memoizedFlattenedFilters !== null ) {
746
+ return this . memoizedFlattenedFilters ;
747
+ }
748
+
749
+ this . memoizedFlattenedFilters = this . filters . reduce ( ( result , subfilter ) => {
745
750
return result . concat ( subfilter . getFlattenedFilters ( ) ) ;
746
- } , result ) ;
747
- return result ;
748
- }
751
+ } , [ ] as FieldFilter [ ] ) ;
749
752
750
- getFilters ( ) : Filter [ ] {
751
- return this . filters ;
753
+ return this . memoizedFlattenedFilters ;
752
754
}
753
755
754
- getOperator ( ) : CompositeOperator {
755
- return this . op ;
756
+ getFilters ( ) : readonly Filter [ ] {
757
+ return this . filters ;
756
758
}
757
759
758
760
getFirstInequalityField ( ) : FieldPath | null {
@@ -770,16 +772,9 @@ export class CompositeFilter extends Filter {
770
772
private findFirstMatchingFilter (
771
773
predicate : ( filter : FieldFilter ) => boolean
772
774
) : FieldFilter | null {
773
- for ( const filter of this . filters ) {
774
- if ( filter instanceof FieldFilter && predicate ( filter ) ) {
775
- return filter as FieldFilter ;
776
- } else if ( filter instanceof CompositeFilter ) {
777
- const found = ( filter as CompositeFilter ) . findFirstMatchingFilter (
778
- predicate
779
- ) ;
780
- if ( found !== null ) {
781
- return found ;
782
- }
775
+ for ( const fieldFilter of this . getFlattenedFilters ( ) ) {
776
+ if ( predicate ( fieldFilter ) ) {
777
+ return fieldFilter ;
783
778
}
784
779
}
785
780
@@ -811,8 +806,7 @@ export function canonifyFilter(filter: Filter): string {
811
806
const canonicalIdsString = filter . filters
812
807
. map ( filter => canonifyFilter ( filter ) )
813
808
. join ( ',' ) ;
814
- const opString = filter . isConjunction ( ) ? 'and' : 'or' ;
815
- return `${ opString } (${ canonicalIdsString } )` ;
809
+ return `${ filter . op } (${ canonicalIdsString } )` ;
816
810
}
817
811
}
818
812
0 commit comments