Skip to content

Commit 74a397a

Browse files
authored
Refactor Filters (#1894)
* Rename RelationFilter to FieldFilter * Remove NullFilter and NanFilter (replaced by just using FieldFilter) * Rename RelationOp to Operator * Extract KeyFieldFilter from FieldFilter This makes it possible to validate arguments once rather than per-document. * Extract ArrayContainsFilter from FieldFilter * Extract InFilter from FieldFilter * Extract ArrayContainsAnyFilter from FieldFilter * Factor out ArrayValue.contains
1 parent 3caea2b commit 74a397a

File tree

8 files changed

+249
-267
lines changed

8 files changed

+249
-267
lines changed

packages/firestore/src/api/database.ts

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ import {
3030
import {
3131
Bound,
3232
Direction,
33+
FieldFilter,
3334
Filter,
35+
Operator,
3436
OrderBy,
35-
Query as InternalQuery,
36-
RelationFilter,
37-
RelationOp
37+
Query as InternalQuery
3838
} from '../core/query';
3939
import { Transaction as InternalTransaction } from '../core/transaction';
4040
import { ChangeType, ViewSnapshot } from '../core/view_snapshot';
@@ -1430,16 +1430,16 @@ export class Query implements firestore.Query {
14301430

14311431
let fieldValue;
14321432
const fieldPath = fieldPathFromArgument('Query.where', field);
1433-
const relationOp = RelationOp.fromString(opStr);
1433+
const operator = Operator.fromString(opStr);
14341434
if (fieldPath.isKeyField()) {
14351435
if (
1436-
relationOp === RelationOp.ARRAY_CONTAINS ||
1437-
relationOp === RelationOp.ARRAY_CONTAINS_ANY ||
1438-
relationOp === RelationOp.IN
1436+
operator === Operator.ARRAY_CONTAINS ||
1437+
operator === Operator.ARRAY_CONTAINS_ANY ||
1438+
operator === Operator.IN
14391439
) {
14401440
throw new FirestoreError(
14411441
Code.INVALID_ARGUMENT,
1442-
`Invalid Query. You can't perform '${relationOp.toString()}' ` +
1442+
`Invalid Query. You can't perform '${operator.toString()}' ` +
14431443
'queries on FieldPath.documentId().'
14441444
);
14451445
}
@@ -1492,20 +1492,20 @@ export class Query implements firestore.Query {
14921492
}
14931493
} else {
14941494
if (
1495-
relationOp === RelationOp.IN ||
1496-
relationOp === RelationOp.ARRAY_CONTAINS_ANY
1495+
operator === Operator.IN ||
1496+
operator === Operator.ARRAY_CONTAINS_ANY
14971497
) {
14981498
if (!Array.isArray(value) || value.length === 0) {
14991499
throw new FirestoreError(
15001500
Code.INVALID_ARGUMENT,
15011501
'Invalid Query. A non-empty array is required for ' +
1502-
`'${relationOp.toString()}' filters.`
1502+
`'${operator.toString()}' filters.`
15031503
);
15041504
}
15051505
if (value.length > 10) {
15061506
throw new FirestoreError(
15071507
Code.INVALID_ARGUMENT,
1508-
`Invalid Query. '${relationOp.toString()}' filters support a ` +
1508+
`Invalid Query. '${operator.toString()}' filters support a ` +
15091509
'maximum of 10 elements in the value array.'
15101510
);
15111511
}
@@ -1515,7 +1515,7 @@ export class Query implements firestore.Query {
15151515
value
15161516
);
15171517
}
1518-
const filter = Filter.create(fieldPath, relationOp, fieldValue);
1518+
const filter = Filter.create(fieldPath, operator, fieldValue);
15191519
this.validateNewFilter(filter);
15201520
return new Query(this._query.addFilter(filter), this.firestore);
15211521
}
@@ -1947,12 +1947,9 @@ export class Query implements firestore.Query {
19471947
}
19481948

19491949
private validateNewFilter(filter: Filter): void {
1950-
if (filter instanceof RelationFilter) {
1951-
const arrayOps = [
1952-
RelationOp.ARRAY_CONTAINS,
1953-
RelationOp.ARRAY_CONTAINS_ANY
1954-
];
1955-
const disjunctiveOps = [RelationOp.IN, RelationOp.ARRAY_CONTAINS_ANY];
1950+
if (filter instanceof FieldFilter) {
1951+
const arrayOps = [Operator.ARRAY_CONTAINS, Operator.ARRAY_CONTAINS_ANY];
1952+
const disjunctiveOps = [Operator.IN, Operator.ARRAY_CONTAINS_ANY];
19561953
const isArrayOp = arrayOps.indexOf(filter.op) >= 0;
19571954
const isDisjunctiveOp = disjunctiveOps.indexOf(filter.op) >= 0;
19581955

@@ -1978,12 +1975,12 @@ export class Query implements firestore.Query {
19781975
} else if (isDisjunctiveOp || isArrayOp) {
19791976
// You can have at most 1 disjunctive filter and 1 array filter. Check if
19801977
// the new filter conflicts with an existing one.
1981-
let conflictingOp: RelationOp | null = null;
1978+
let conflictingOp: Operator | null = null;
19821979
if (isDisjunctiveOp) {
1983-
conflictingOp = this._query.findRelationOpFilter(disjunctiveOps);
1980+
conflictingOp = this._query.findFilterOperator(disjunctiveOps);
19841981
}
19851982
if (conflictingOp === null && isArrayOp) {
1986-
conflictingOp = this._query.findRelationOpFilter(arrayOps);
1983+
conflictingOp = this._query.findFilterOperator(arrayOps);
19871984
}
19881985
if (conflictingOp != null) {
19891986
// We special case when it's a duplicate op to give a slightly clearer error message.

0 commit comments

Comments
 (0)