private writeIndexValueAux()

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);
    }
  }