Skip to content

Commit 4967b9e

Browse files
committed
Addressing code review comments.
1 parent eba3b84 commit 4967b9e

File tree

2 files changed

+27
-33
lines changed

2 files changed

+27
-33
lines changed

packages/firestore/src/core/target.ts

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,9 @@ export function targetGetSegmentCount(target: Target): number {
537537
export abstract class Filter {
538538
abstract matches(doc: Document): boolean;
539539

540-
abstract getFlattenedFilters(): FieldFilter[];
540+
abstract getFlattenedFilters(): readonly FieldFilter[];
541541

542-
abstract getFilters(): Filter[];
542+
abstract getFilters(): readonly Filter[];
543543

544544
abstract getFirstInequalityField(): FieldPath | null;
545545
}
@@ -570,11 +570,12 @@ export const enum Direction {
570570
DESCENDING = 'desc'
571571
}
572572

573+
// TODO(orquery) move Filter classes to a new file, e.g. filter.ts
573574
export class FieldFilter extends Filter {
574575
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
578579
) {
579580
super();
580581
}
@@ -697,11 +698,11 @@ export class FieldFilter extends Filter {
697698
);
698699
}
699700

700-
getFlattenedFilters(): FieldFilter[] {
701+
getFlattenedFilters(): readonly FieldFilter[] {
701702
return [this];
702703
}
703704

704-
getFilters(): Filter[] {
705+
getFilters(): readonly Filter[] {
705706
return [this];
706707
}
707708

@@ -714,9 +715,11 @@ export class FieldFilter extends Filter {
714715
}
715716

716717
export class CompositeFilter extends Filter {
718+
private memoizedFlattenedFilters: FieldFilter[] | null = null;
719+
717720
protected constructor(
718-
public filters: Filter[],
719-
public op: CompositeOperator
721+
public readonly filters: readonly Filter[],
722+
public readonly op: CompositeOperator
720723
) {
721724
super();
722725
}
@@ -738,21 +741,20 @@ export class CompositeFilter extends Filter {
738741
}
739742
}
740743

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) => {
745750
return result.concat(subfilter.getFlattenedFilters());
746-
}, result);
747-
return result;
748-
}
751+
}, [] as FieldFilter[]);
749752

750-
getFilters(): Filter[] {
751-
return this.filters;
753+
return this.memoizedFlattenedFilters;
752754
}
753755

754-
getOperator(): CompositeOperator {
755-
return this.op;
756+
getFilters(): readonly Filter[] {
757+
return this.filters;
756758
}
757759

758760
getFirstInequalityField(): FieldPath | null {
@@ -770,16 +772,9 @@ export class CompositeFilter extends Filter {
770772
private findFirstMatchingFilter(
771773
predicate: (filter: FieldFilter) => boolean
772774
): 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;
783778
}
784779
}
785780

@@ -811,8 +806,7 @@ export function canonifyFilter(filter: Filter): string {
811806
const canonicalIdsString = filter.filters
812807
.map(filter => canonifyFilter(filter))
813808
.join(',');
814-
const opString = filter.isConjunction() ? 'and' : 'or';
815-
return `${opString}(${canonicalIdsString})`;
809+
return `${filter.op}(${canonicalIdsString})`;
816810
}
817811
}
818812

packages/firestore/src/lite-api/query.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ export function or(...queryConstraints: QueryConstraint[]): QueryConstraint {
278278
export function and(...queryConstraints: QueryConstraint[]): QueryConstraint {
279279
// Only support QueryFilterConstraints
280280
queryConstraints.forEach(queryConstraint =>
281-
validateQueryFilterConstraint('andQuery', queryConstraint)
281+
validateQueryFilterConstraint('and', queryConstraint)
282282
);
283283

284284
return new QueryCompositeFilterConstraint(

0 commit comments

Comments
 (0)