@@ -219,7 +219,7 @@ TypeOrder GetTypeOrder(const google_firestore_v1_Value& value) {
219219 case MapType::kBsonTimestamp :
220220 return TypeOrder::kBsonTimestamp ;
221221 case MapType::kBsonBinaryData :
222- return TypeOrder::kBsonBinaryData ;
222+ return TypeOrder::kBlob ;
223223 case MapType::kNormal :
224224 default :
225225 return TypeOrder::kMap ;
@@ -348,21 +348,41 @@ ComparisonResult CompareStrings(const google_firestore_v1_Value& left,
348348 return util::Compare (left_string, right_string);
349349}
350350
351+ int GetBinarySubtype (const google_firestore_v1_Value& value) {
352+ if (value.which_value_type == google_firestore_v1_Value_bytes_value_tag) {
353+ return 0 ;
354+ }
355+ HARD_ASSERT (IsBsonBinaryData (value), " Expected binary value" );
356+ const pb_bytes_array_t * bytes = value.map_value .fields [0 ].value .bytes_value ;
357+ if (!bytes || bytes->size == 0 ) {
358+ return 0 ;
359+ }
360+ return bytes->bytes [0 ];
361+ }
362+
363+ absl::string_view GetBinaryData (const google_firestore_v1_Value& value) {
364+ if (value.which_value_type == google_firestore_v1_Value_bytes_value_tag) {
365+ if (!value.bytes_value ) {
366+ return {};
367+ }
368+ return nanopb::MakeStringView (value.bytes_value );
369+ }
370+ HARD_ASSERT (IsBsonBinaryData (value), " Expected binary value" );
371+ const pb_bytes_array_t * bytes = value.map_value .fields [0 ].value .bytes_value ;
372+ if (!bytes || bytes->size <= 1 ) {
373+ return {};
374+ }
375+ return nanopb::MakeStringView (bytes).substr (1 );
376+ }
377+
351378ComparisonResult CompareBlobs (const google_firestore_v1_Value& left,
352379 const google_firestore_v1_Value& right) {
353- if (left.bytes_value && right.bytes_value ) {
354- size_t size = std::min (left.bytes_value ->size , right.bytes_value ->size );
355- int cmp =
356- std::memcmp (left.bytes_value ->bytes , right.bytes_value ->bytes , size);
357- return cmp != 0
358- ? util::ComparisonResultFromInt (cmp)
359- : util::Compare (left.bytes_value ->size , right.bytes_value ->size );
360- } else {
361- // An empty blob is represented by a nullptr (or an empty byte array)
362- return util::Compare (
363- !(left.bytes_value == nullptr || left.bytes_value ->size == 0 ),
364- !(right.bytes_value == nullptr || right.bytes_value ->size == 0 ));
380+ int left_subtype = GetBinarySubtype (left);
381+ int right_subtype = GetBinarySubtype (right);
382+ if (left_subtype != right_subtype) {
383+ return util::Compare (left_subtype, right_subtype);
365384 }
385+ return util::Compare (GetBinaryData (left), GetBinaryData (right));
366386}
367387
368388ComparisonResult CompareReferences (const google_firestore_v1_Value& left,
@@ -642,9 +662,6 @@ ComparisonResult Compare(const google_firestore_v1_Value& left,
642662 case TypeOrder::kBsonTimestamp :
643663 return CompareBsonTimestamp (left, right);
644664
645- case TypeOrder::kBsonBinaryData :
646- return CompareBsonBinaryData (left, right);
647-
648665 case TypeOrder::kArray :
649666 return CompareArrays (left, right);
650667
@@ -796,9 +813,6 @@ bool Equals(const google_firestore_v1_Value& lhs,
796813 case TypeOrder::kBsonTimestamp :
797814 return CompareBsonTimestamp (lhs, rhs) == ComparisonResult::Same;
798815
799- case TypeOrder::kBsonBinaryData :
800- return CompareBsonBinaryData (lhs, rhs) == ComparisonResult::Same;
801-
802816 case TypeOrder::kVector :
803817 case TypeOrder::kMap :
804818 case TypeOrder::kInternalMaxValue :
@@ -959,7 +973,7 @@ google_firestore_v1_Value GetLowerBound(
959973 } else if (IsBsonTimestamp (value)) {
960974 return MinBsonTimestamp ();
961975 } else if (IsBsonBinaryData (value)) {
962- return MinBsonBinaryData ();
976+ return MinBytes ();
963977 } else if (IsRegexValue (value)) {
964978 return MinRegex ();
965979 } else if (IsInt32Value (value) || IsDecimal128Value (value)) {
@@ -995,7 +1009,7 @@ google_firestore_v1_Value GetUpperBound(
9951009 case google_firestore_v1_Value_string_value_tag:
9961010 return MinBytes ();
9971011 case google_firestore_v1_Value_bytes_value_tag:
998- return MinBsonBinaryData ();
1012+ return MinReference ();
9991013 case google_firestore_v1_Value_reference_value_tag:
10001014 return MinBsonObjectId ();
10011015 case google_firestore_v1_Value_geo_point_value_tag:
0 commit comments