target_data.cc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*
  2. * Copyright 2018 Google LLC
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "Firestore/core/src/local/target_data.h"
  17. #include <ostream>
  18. #include <sstream>
  19. #include <utility>
  20. namespace firebase {
  21. namespace firestore {
  22. namespace local {
  23. namespace {
  24. using core::Target;
  25. using model::ListenSequenceNumber;
  26. using model::SnapshotVersion;
  27. using model::TargetId;
  28. using nanopb::ByteString;
  29. // MARK: - QueryPurpose
  30. const char* ToString(QueryPurpose purpose) {
  31. switch (purpose) {
  32. case QueryPurpose::Listen:
  33. return "Listen";
  34. case QueryPurpose::ExistenceFilterMismatch:
  35. return "ExistenceFilterMismatch";
  36. case QueryPurpose::ExistenceFilterMismatchBloom:
  37. return "ExistenceFilterMismatchBloom";
  38. case QueryPurpose::LimboResolution:
  39. return "LimboResolution";
  40. }
  41. UNREACHABLE();
  42. }
  43. } // namespace
  44. std::ostream& operator<<(std::ostream& os, QueryPurpose purpose) {
  45. return os << ToString(purpose);
  46. }
  47. // MARK: - TargetData
  48. TargetData::TargetData(Target target,
  49. TargetId target_id,
  50. ListenSequenceNumber sequence_number,
  51. QueryPurpose purpose,
  52. SnapshotVersion snapshot_version,
  53. SnapshotVersion last_limbo_free_snapshot_version,
  54. ByteString resume_token,
  55. absl::optional<int32_t> expected_count)
  56. : target_(std::move(target)),
  57. target_id_(target_id),
  58. sequence_number_(sequence_number),
  59. purpose_(purpose),
  60. snapshot_version_(std::move(snapshot_version)),
  61. last_limbo_free_snapshot_version_(
  62. std::move(last_limbo_free_snapshot_version)),
  63. resume_token_(std::move(resume_token)),
  64. expected_count_(std::move(expected_count)) {
  65. }
  66. TargetData::TargetData(Target target,
  67. int target_id,
  68. ListenSequenceNumber sequence_number,
  69. QueryPurpose purpose)
  70. : TargetData(std::move(target),
  71. target_id,
  72. sequence_number,
  73. purpose,
  74. SnapshotVersion::None(),
  75. SnapshotVersion::None(),
  76. ByteString(),
  77. /*expected_count=*/absl::nullopt) {
  78. }
  79. TargetData TargetData::Invalid() {
  80. return TargetData({}, /*target_id=*/-1, /*sequence_number=*/-1,
  81. QueryPurpose::Listen,
  82. SnapshotVersion(SnapshotVersion::None()),
  83. SnapshotVersion(SnapshotVersion::None()), {},
  84. /*expected_count=*/absl::nullopt);
  85. }
  86. TargetData TargetData::WithSequenceNumber(
  87. ListenSequenceNumber sequence_number) const {
  88. return TargetData(target_, target_id_, sequence_number, purpose_,
  89. snapshot_version_, last_limbo_free_snapshot_version_,
  90. resume_token_, expected_count_);
  91. }
  92. TargetData TargetData::WithResumeToken(ByteString resume_token,
  93. SnapshotVersion snapshot_version) const {
  94. return TargetData(target_, target_id_, sequence_number_, purpose_,
  95. std::move(snapshot_version),
  96. last_limbo_free_snapshot_version_, std::move(resume_token),
  97. /*expected_count=*/absl::nullopt);
  98. }
  99. TargetData TargetData::WithExpectedCount(
  100. absl::optional<int32_t> expected_count) const {
  101. return TargetData(target_, target_id_, sequence_number_, purpose_,
  102. snapshot_version_, last_limbo_free_snapshot_version_,
  103. resume_token_, std::move(expected_count));
  104. }
  105. TargetData TargetData::WithLastLimboFreeSnapshotVersion(
  106. SnapshotVersion last_limbo_free_snapshot_version) const {
  107. return TargetData(target_, target_id_, sequence_number_, purpose_,
  108. snapshot_version_,
  109. std::move(last_limbo_free_snapshot_version), resume_token_,
  110. expected_count_);
  111. }
  112. bool operator==(const TargetData& lhs, const TargetData& rhs) {
  113. return lhs.target() == rhs.target() && lhs.target_id() == rhs.target_id() &&
  114. lhs.sequence_number() == rhs.sequence_number() &&
  115. lhs.purpose() == rhs.purpose() &&
  116. lhs.snapshot_version() == rhs.snapshot_version() &&
  117. lhs.resume_token() == rhs.resume_token() &&
  118. lhs.expected_count() == rhs.expected_count();
  119. }
  120. size_t TargetData::Hash() const {
  121. return util::Hash(target_, target_id_, sequence_number_, purpose_,
  122. snapshot_version_, resume_token_, expected_count_);
  123. }
  124. std::string TargetData::ToString() const {
  125. std::ostringstream ss;
  126. ss << *this;
  127. return ss.str();
  128. }
  129. std::ostream& operator<<(std::ostream& os, const TargetData& value) {
  130. return os << "TargetData(target=" << value.target_
  131. << ", target_id=" << value.target_id_
  132. << ", purpose=" << value.purpose_
  133. << ", version=" << value.snapshot_version_
  134. << ", last_limbo_free_snapshot_version="
  135. << value.last_limbo_free_snapshot_version_
  136. << ", resume_token=" << value.resume_token_ << ", expected_count="
  137. << (value.expected_count_.has_value()
  138. ? std::to_string(value.expected_count_.value())
  139. : "null")
  140. << ")";
  141. }
  142. } // namespace local
  143. } // namespace firestore
  144. } // namespace firebase