in packages/firestore/src/index/firestore_index_value_writer.ts [70:131]
private writeIndexValueAux(
indexValue: Value,
encoder: DirectionalIndexByteEncoder
): void {
if ('nullValue' in indexValue) {
this.writeValueTypeLabel(encoder, INDEX_TYPE_NULL);
} else if ('booleanValue' in indexValue) {
this.writeValueTypeLabel(encoder, INDEX_TYPE_BOOLEAN);
encoder.writeNumber(indexValue.booleanValue ? 1 : 0);
} else if ('integerValue' in indexValue) {
this.writeValueTypeLabel(encoder, INDEX_TYPE_NUMBER);
encoder.writeNumber(normalizeNumber(indexValue.integerValue));
} else if ('doubleValue' in indexValue) {
const n = normalizeNumber(indexValue.doubleValue);
if (isNaN(n)) {
this.writeValueTypeLabel(encoder, INDEX_TYPE_NAN);
} else {
this.writeValueTypeLabel(encoder, INDEX_TYPE_NUMBER);
if (isNegativeZero(n)) {
// -0.0, 0 and 0.0 are all considered the same
encoder.writeNumber(0.0);
} else {
encoder.writeNumber(n);
}
}
} else if ('timestampValue' in indexValue) {
const timestamp = indexValue.timestampValue!;
this.writeValueTypeLabel(encoder, INDEX_TYPE_TIMESTAMP);
if (typeof timestamp === 'string') {
encoder.writeString(timestamp);
} else {
encoder.writeString(`${timestamp.seconds || ''}`);
encoder.writeNumber(timestamp.nanos || 0);
}
} else if ('stringValue' in indexValue) {
this.writeIndexString(indexValue.stringValue!, encoder);
this.writeTruncationMarker(encoder);
} else if ('bytesValue' in indexValue) {
this.writeValueTypeLabel(encoder, INDEX_TYPE_BLOB);
encoder.writeBytes(normalizeByteString(indexValue.bytesValue!));
this.writeTruncationMarker(encoder);
} else if ('referenceValue' in indexValue) {
this.writeIndexEntityRef(indexValue.referenceValue!, encoder);
} else if ('geoPointValue' in indexValue) {
const geoPoint = indexValue.geoPointValue!;
this.writeValueTypeLabel(encoder, INDEX_TYPE_GEOPOINT);
encoder.writeNumber(geoPoint.latitude || 0);
encoder.writeNumber(geoPoint.longitude || 0);
} else if ('mapValue' in indexValue) {
if (isMaxValue(indexValue)) {
this.writeValueTypeLabel(encoder, Number.MAX_SAFE_INTEGER);
} else {
this.writeIndexMap(indexValue.mapValue!, encoder);
this.writeTruncationMarker(encoder);
}
} else if ('arrayValue' in indexValue) {
this.writeIndexArray(indexValue.arrayValue!, encoder);
this.writeTruncationMarker(encoder);
} else {
fail('unknown index value type ' + indexValue);
}
}