Skip to content

Commit 160217f

Browse files
committed
Remove special handling of null and nan in query to pipeline
1 parent 789eeb9 commit 160217f

File tree

1 file changed

+67
-83
lines changed

1 file changed

+67
-83
lines changed

packages/firestore/src/core/pipeline-util.ts

Lines changed: 67 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@ import {
2424
Ordering,
2525
lessThan,
2626
greaterThan,
27-
field,
28-
constant
27+
field
2928
} from '../lite-api/expressions';
3029
import { Pipeline } from '../lite-api/pipeline';
3130
import { doc } from '../lite-api/reference';
32-
import { isNanValue, isNullValue } from '../model/values';
3331
import { fail } from '../util/assert';
3432

3533
import { Bound } from './bound';
@@ -54,90 +52,76 @@ import {
5452
export function toPipelineBooleanExpr(f: FilterInternal): BooleanExpression {
5553
if (f instanceof FieldFilterInternal) {
5654
const fieldValue = field(f.field.toString());
57-
if (isNanValue(f.value)) {
58-
if (f.op === Operator.EQUAL) {
59-
return and(fieldValue.exists(), fieldValue.equal(constant(NaN)));
60-
} else {
61-
return and(fieldValue.exists(), fieldValue.notEqual(constant(NaN)));
55+
// Comparison filters
56+
const value = f.value;
57+
switch (f.op) {
58+
case Operator.LESS_THAN:
59+
return and(
60+
fieldValue.exists(),
61+
fieldValue.lessThan(Constant._fromProto(value))
62+
);
63+
case Operator.LESS_THAN_OR_EQUAL:
64+
return and(
65+
fieldValue.exists(),
66+
fieldValue.lessThanOrEqual(Constant._fromProto(value))
67+
);
68+
case Operator.GREATER_THAN:
69+
return and(
70+
fieldValue.exists(),
71+
fieldValue.greaterThan(Constant._fromProto(value))
72+
);
73+
case Operator.GREATER_THAN_OR_EQUAL:
74+
return and(
75+
fieldValue.exists(),
76+
fieldValue.greaterThanOrEqual(Constant._fromProto(value))
77+
);
78+
case Operator.EQUAL:
79+
return and(
80+
fieldValue.exists(),
81+
fieldValue.equal(Constant._fromProto(value))
82+
);
83+
case Operator.NOT_EQUAL:
84+
return and(
85+
fieldValue.exists(),
86+
fieldValue.notEqual(Constant._fromProto(value))
87+
);
88+
case Operator.ARRAY_CONTAINS:
89+
return and(
90+
fieldValue.exists(),
91+
fieldValue.arrayContains(Constant._fromProto(value))
92+
);
93+
case Operator.IN: {
94+
const values = value?.arrayValue?.values?.map((val: any) =>
95+
Constant._fromProto(val)
96+
);
97+
if (!values) {
98+
return and(fieldValue.exists(), fieldValue.equalAny([]));
99+
} else if (values.length === 1) {
100+
return and(fieldValue.exists(), fieldValue.equal(values[0]));
101+
} else {
102+
return and(fieldValue.exists(), fieldValue.equalAny(values));
103+
}
62104
}
63-
} else if (isNullValue(f.value)) {
64-
if (f.op === Operator.EQUAL) {
65-
return and(fieldValue.exists(), fieldValue.equal(constant(null)));
66-
} else {
67-
return and(fieldValue.exists(), fieldValue.notEqual(constant(null)));
105+
case Operator.ARRAY_CONTAINS_ANY: {
106+
const values = value?.arrayValue?.values?.map((val: any) =>
107+
Constant._fromProto(val)
108+
);
109+
return and(fieldValue.exists(), fieldValue.arrayContainsAny(values!));
68110
}
69-
} else {
70-
// Comparison filters
71-
const value = f.value;
72-
switch (f.op) {
73-
case Operator.LESS_THAN:
74-
return and(
75-
fieldValue.exists(),
76-
fieldValue.lessThan(Constant._fromProto(value))
77-
);
78-
case Operator.LESS_THAN_OR_EQUAL:
79-
return and(
80-
fieldValue.exists(),
81-
fieldValue.lessThanOrEqual(Constant._fromProto(value))
82-
);
83-
case Operator.GREATER_THAN:
84-
return and(
85-
fieldValue.exists(),
86-
fieldValue.greaterThan(Constant._fromProto(value))
87-
);
88-
case Operator.GREATER_THAN_OR_EQUAL:
89-
return and(
90-
fieldValue.exists(),
91-
fieldValue.greaterThanOrEqual(Constant._fromProto(value))
92-
);
93-
case Operator.EQUAL:
94-
return and(
95-
fieldValue.exists(),
96-
fieldValue.equal(Constant._fromProto(value))
97-
);
98-
case Operator.NOT_EQUAL:
99-
return and(
100-
fieldValue.exists(),
101-
fieldValue.notEqual(Constant._fromProto(value))
102-
);
103-
case Operator.ARRAY_CONTAINS:
104-
return and(
105-
fieldValue.exists(),
106-
fieldValue.arrayContains(Constant._fromProto(value))
107-
);
108-
case Operator.IN: {
109-
const values = value?.arrayValue?.values?.map((val: any) =>
110-
Constant._fromProto(val)
111-
);
112-
if (!values) {
113-
return and(fieldValue.exists(), fieldValue.equalAny([]));
114-
} else if (values.length === 1) {
115-
return and(fieldValue.exists(), fieldValue.equal(values[0]));
116-
} else {
117-
return and(fieldValue.exists(), fieldValue.equalAny(values));
118-
}
119-
}
120-
case Operator.ARRAY_CONTAINS_ANY: {
121-
const values = value?.arrayValue?.values?.map((val: any) =>
122-
Constant._fromProto(val)
123-
);
124-
return and(fieldValue.exists(), fieldValue.arrayContainsAny(values!));
125-
}
126-
case Operator.NOT_IN: {
127-
const values = value?.arrayValue?.values?.map((val: any) =>
128-
Constant._fromProto(val)
129-
);
130-
if (!values) {
131-
return and(fieldValue.exists(), fieldValue.notEqualAny([]));
132-
} else if (values.length === 1) {
133-
return and(fieldValue.exists(), fieldValue.notEqual(values[0]));
134-
} else {
135-
return and(fieldValue.exists(), fieldValue.notEqualAny(values));
136-
}
111+
case Operator.NOT_IN: {
112+
const values = value?.arrayValue?.values?.map((val: any) =>
113+
Constant._fromProto(val)
114+
);
115+
if (!values) {
116+
return and(fieldValue.exists(), fieldValue.notEqualAny([]));
117+
} else if (values.length === 1) {
118+
return and(fieldValue.exists(), fieldValue.notEqual(values[0]));
119+
} else {
120+
return and(fieldValue.exists(), fieldValue.notEqualAny(values));
137121
}
138-
default:
139-
fail(0x9047, 'Unexpected operator');
140122
}
123+
default:
124+
fail(0x9047, 'Unexpected operator');
141125
}
142126
} else if (f instanceof CompositeFilterInternal) {
143127
switch (f.op) {

0 commit comments

Comments
 (0)