From 2e9b035bb1800280a54f7fbd5355d797e448396c Mon Sep 17 00:00:00 2001 From: zxu123 Date: Mon, 29 Jan 2018 13:49:56 -0500 Subject: [PATCH 1/5] Implement DataBaseId in C++ --- .../firebase/firestore/model/CMakeLists.txt | 4 + .../firebase/firestore/model/database_id.cc | 42 +++++++++ .../firebase/firestore/model/database_id.h | 90 +++++++++++++++++++ .../firebase/firestore/model/CMakeLists.txt | 1 + .../firestore/model/database_id_test.cc | 49 ++++++++++ 5 files changed, 186 insertions(+) create mode 100644 Firestore/core/src/firebase/firestore/model/database_id.cc create mode 100644 Firestore/core/src/firebase/firestore/model/database_id.h create mode 100644 Firestore/core/test/firebase/firestore/model/database_id_test.cc diff --git a/Firestore/core/src/firebase/firestore/model/CMakeLists.txt b/Firestore/core/src/firebase/firestore/model/CMakeLists.txt index 3af56ec0ac8..62193d52353 100644 --- a/Firestore/core/src/firebase/firestore/model/CMakeLists.txt +++ b/Firestore/core/src/firebase/firestore/model/CMakeLists.txt @@ -15,8 +15,12 @@ cc_library( firebase_firestore_model SOURCES + database_id.cc + database_id.h field_value.cc + field_value.h timestamp.cc + timestamp.h DEPENDS firebase_firestore_util firebase_firestore_types diff --git a/Firestore/core/src/firebase/firestore/model/database_id.cc b/Firestore/core/src/firebase/firestore/model/database_id.cc new file mode 100644 index 00000000000..909e2e92b52 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/model/database_id.cc @@ -0,0 +1,42 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + +#include + +#include "Firestore/core/src/firebase/firestore/util/firebase_assert.h" + +namespace firebase { +namespace firestore { +namespace model { + +const char* DatabaseId::kDefaultDatabaseId = "(default)"; + +DatabaseId::DatabaseId(const std::string& project_id, + const std::string& database_id) + : project_id_(project_id), database_id_(database_id) { + FIREBASE_ASSERT(!project_id.empty()); + FIREBASE_ASSERT(!database_id.empty()); +} + +bool DatabaseId::IsDefaultDatabase() { + return database_id_ == kDefaultDatabaseId; +} + +} // namespace model +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/model/database_id.h b/Firestore/core/src/firebase/firestore/model/database_id.h new file mode 100644 index 00000000000..a04f3814c36 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/model/database_id.h @@ -0,0 +1,90 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_DATABASE_ID_H_ +#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_DATABASE_ID_H_ + +#include + +namespace firebase { +namespace firestore { +namespace model { + +/** A DatabaseId represents a particular database in the Firestore. */ +class DatabaseId { + public: + /** The default name for "unset" database ID in resource names. */ + static const char* kDefaultDatabaseId; + + /** + * Creates and returns a new DatabaseId. + * + * @param project_id The project for the database. + * @param database_id The database in the project to use. + * @return A new instance of DatabaseId. + */ + DatabaseId(const std::string& project_id, const std::string& database_id); + + std::string project_id() const { + return project_id_; + } + + std::string database_id() const { + return database_id_; + } + + /** Whether this is the default database of the project. */ + bool IsDefaultDatabase(); + + friend bool operator<(const DatabaseId& lhs, const DatabaseId& rhs); + + private: + const std::string project_id_; + const std::string database_id_; +}; + +/** Compares against another DatabaseId. */ +inline bool operator<(const DatabaseId& lhs, const DatabaseId& rhs) { + return lhs.project_id_ < rhs.project_id_ || + (lhs.project_id_ == rhs.project_id_ && + lhs.database_id_ < rhs.database_id_); +} + +inline bool operator>(const DatabaseId& lhs, const DatabaseId& rhs) { + return rhs < lhs; +} + +inline bool operator>=(const DatabaseId& lhs, const DatabaseId& rhs) { + return !(lhs < rhs); +} + +inline bool operator<=(const DatabaseId& lhs, const DatabaseId& rhs) { + return !(lhs > rhs); +} + +inline bool operator!=(const DatabaseId& lhs, const DatabaseId& rhs) { + return lhs < rhs || lhs > rhs; +} + +inline bool operator==(const DatabaseId& lhs, const DatabaseId& rhs) { + return !(lhs != rhs); +} + +} // namespace model +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_DATABASE_ID_H_ diff --git a/Firestore/core/test/firebase/firestore/model/CMakeLists.txt b/Firestore/core/test/firebase/firestore/model/CMakeLists.txt index 9153a573ff4..0f83bf2e1e2 100644 --- a/Firestore/core/test/firebase/firestore/model/CMakeLists.txt +++ b/Firestore/core/test/firebase/firestore/model/CMakeLists.txt @@ -15,6 +15,7 @@ cc_test( firebase_firestore_model_test SOURCES + database_id_test.cc field_value_test.cc timestamp_test.cc DEPENDS diff --git a/Firestore/core/test/firebase/firestore/model/database_id_test.cc b/Firestore/core/test/firebase/firestore/model/database_id_test.cc new file mode 100644 index 00000000000..074cdc59004 --- /dev/null +++ b/Firestore/core/test/firebase/firestore/model/database_id_test.cc @@ -0,0 +1,49 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + +#include + +#include "gtest/gtest.h" + +namespace firebase { +namespace firestore { +namespace model { + +TEST(DatabaseId, Constructor) { + DatabaseId id("p", "d"); + EXPECT_EQ("p", id.project_id()); + EXPECT_EQ("d", id.database_id()); + EXPECT_FALSE(id.IsDefaultDatabase()); +} + +TEST(DatabaseId, DefaultDb) { + DatabaseId id("p", DatabaseId::kDefaultDatabaseId); + EXPECT_EQ("p", id.project_id()); + EXPECT_EQ(DatabaseId::kDefaultDatabaseId, id.database_id()); + EXPECT_TRUE(id.IsDefaultDatabase()); +} + +TEST(DatabaseId, Comparison) { + EXPECT_LT(DatabaseId("a", "b"), DatabaseId("b", "a")); + EXPECT_LT(DatabaseId("a", "b"), DatabaseId("a", "c")); + EXPECT_EQ(DatabaseId("a", "b"), DatabaseId("a", "b")); +} + +} // namespace model +} // namespace firestore +} // namespace firebase From 2185a318c785b16ea5b17f3d3a4f783f5b616808 Mon Sep 17 00:00:00 2001 From: zxu123 Date: Mon, 29 Jan 2018 14:03:45 -0500 Subject: [PATCH 2/5] add database_id_test to project --- Firestore/Example/Firestore.xcodeproj/project.pbxproj | 4 ++++ Firestore/core/src/firebase/firestore/model/database_id.h | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Firestore/Example/Firestore.xcodeproj/project.pbxproj b/Firestore/Example/Firestore.xcodeproj/project.pbxproj index 6a5b7957207..66518f49076 100644 --- a/Firestore/Example/Firestore.xcodeproj/project.pbxproj +++ b/Firestore/Example/Firestore.xcodeproj/project.pbxproj @@ -71,6 +71,7 @@ AB380D04201BC6E400D97691 /* ordered_code_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB380D03201BC6E400D97691 /* ordered_code_test.cc */; }; AB382F7C1FE02A1F007CA955 /* FIRDocumentReferenceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB382F7B1FE02A1F007CA955 /* FIRDocumentReferenceTests.m */; }; AB382F7E1FE03059007CA955 /* FIRFieldPathTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB382F7D1FE03059007CA955 /* FIRFieldPathTests.m */; }; + AB71064C201FA60300344F18 /* database_id_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB71064B201FA60300344F18 /* database_id_test.cc */; }; AB7BAB342012B519001E0872 /* geo_point_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB7BAB332012B519001E0872 /* geo_point_test.cc */; }; AB9945261FE2D71100DFC1E6 /* FIRCollectionReferenceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9945251FE2D71100DFC1E6 /* FIRCollectionReferenceTests.m */; }; AB9945281FE2DE0C00DFC1E6 /* FIRSnapshotMetadataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9945271FE2DE0C00DFC1E6 /* FIRSnapshotMetadataTests.m */; }; @@ -257,6 +258,7 @@ AB380D03201BC6E400D97691 /* ordered_code_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ordered_code_test.cc; path = ../../core/test/firebase/firestore/util/ordered_code_test.cc; sourceTree = ""; }; AB382F7B1FE02A1F007CA955 /* FIRDocumentReferenceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRDocumentReferenceTests.m; sourceTree = ""; }; AB382F7D1FE03059007CA955 /* FIRFieldPathTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRFieldPathTests.m; sourceTree = ""; }; + AB71064B201FA60300344F18 /* database_id_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = database_id_test.cc; sourceTree = ""; }; AB7BAB332012B519001E0872 /* geo_point_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = geo_point_test.cc; path = ../../core/test/firebase/firestore/geo_point_test.cc; sourceTree = ""; }; AB9945251FE2D71100DFC1E6 /* FIRCollectionReferenceTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FIRCollectionReferenceTests.m; sourceTree = ""; }; AB9945271FE2DE0C00DFC1E6 /* FIRSnapshotMetadataTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FIRSnapshotMetadataTests.m; sourceTree = ""; }; @@ -553,6 +555,7 @@ children = ( AB356EF6200EA5EB0089B766 /* field_value_test.cc */, ABF6506B201131F8005F2C74 /* timestamp_test.cc */, + AB71064B201FA60300344F18 /* database_id_test.cc */, ); name = model; path = ../../core/test/firebase/firestore/model; @@ -1211,6 +1214,7 @@ buildActionMask = 2147483647; files = ( 6003F59E195388D20070C39A /* FIRAppDelegate.m in Sources */, + AB71064C201FA60300344F18 /* database_id_test.cc in Sources */, 6003F5A7195388D20070C39A /* FIRViewController.m in Sources */, 6003F59A195388D20070C39A /* main.m in Sources */, ); diff --git a/Firestore/core/src/firebase/firestore/model/database_id.h b/Firestore/core/src/firebase/firestore/model/database_id.h index a04f3814c36..0d95bf054b9 100644 --- a/Firestore/core/src/firebase/firestore/model/database_id.h +++ b/Firestore/core/src/firebase/firestore/model/database_id.h @@ -34,7 +34,6 @@ class DatabaseId { * * @param project_id The project for the database. * @param database_id The database in the project to use. - * @return A new instance of DatabaseId. */ DatabaseId(const std::string& project_id, const std::string& database_id); From cbc91970f974ae977ae55aebeda6d13dd167b8ea Mon Sep 17 00:00:00 2001 From: zxu123 Date: Mon, 29 Jan 2018 14:06:34 -0500 Subject: [PATCH 3/5] fix project --- Firestore/Example/Firestore.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firestore/Example/Firestore.xcodeproj/project.pbxproj b/Firestore/Example/Firestore.xcodeproj/project.pbxproj index 66518f49076..1d397035404 100644 --- a/Firestore/Example/Firestore.xcodeproj/project.pbxproj +++ b/Firestore/Example/Firestore.xcodeproj/project.pbxproj @@ -71,7 +71,6 @@ AB380D04201BC6E400D97691 /* ordered_code_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB380D03201BC6E400D97691 /* ordered_code_test.cc */; }; AB382F7C1FE02A1F007CA955 /* FIRDocumentReferenceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB382F7B1FE02A1F007CA955 /* FIRDocumentReferenceTests.m */; }; AB382F7E1FE03059007CA955 /* FIRFieldPathTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB382F7D1FE03059007CA955 /* FIRFieldPathTests.m */; }; - AB71064C201FA60300344F18 /* database_id_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB71064B201FA60300344F18 /* database_id_test.cc */; }; AB7BAB342012B519001E0872 /* geo_point_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB7BAB332012B519001E0872 /* geo_point_test.cc */; }; AB9945261FE2D71100DFC1E6 /* FIRCollectionReferenceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9945251FE2D71100DFC1E6 /* FIRCollectionReferenceTests.m */; }; AB9945281FE2DE0C00DFC1E6 /* FIRSnapshotMetadataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9945271FE2DE0C00DFC1E6 /* FIRSnapshotMetadataTests.m */; }; @@ -79,6 +78,7 @@ AB99452C1FE3018D00DFC1E6 /* FIRQuerySnapshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB99452B1FE3018D00DFC1E6 /* FIRQuerySnapshotTests.m */; }; AB99452E1FE30AC800DFC1E6 /* FIRFieldValueTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AB99452D1FE30AC800DFC1E6 /* FIRFieldValueTests.m */; }; ABAEEF4F1FD5F8B100C966CB /* FIRQueryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAEEF4E1FD5F8B100C966CB /* FIRQueryTests.m */; }; + ABE6637A201FA81900ED349A /* database_id_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB71064B201FA60300344F18 /* database_id_test.cc */; }; ABF341051FE860CA00C48322 /* FSTAPIHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF341021FE8593500C48322 /* FSTAPIHelpers.m */; }; ABF6506C201131F8005F2C74 /* timestamp_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ABF6506B201131F8005F2C74 /* timestamp_test.cc */; }; AFE6114F0D4DAECBA7B7C089 /* Pods_Firestore_IntegrationTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2FA635DF5D116A67A7441CD /* Pods_Firestore_IntegrationTests.framework */; }; @@ -1214,7 +1214,6 @@ buildActionMask = 2147483647; files = ( 6003F59E195388D20070C39A /* FIRAppDelegate.m in Sources */, - AB71064C201FA60300344F18 /* database_id_test.cc in Sources */, 6003F5A7195388D20070C39A /* FIRViewController.m in Sources */, 6003F59A195388D20070C39A /* main.m in Sources */, ); @@ -1226,6 +1225,7 @@ files = ( DE2EF0881F3D0B6E003D0CDC /* FSTTreeSortedDictionaryTests.m in Sources */, DE51B1FD1F0D492C0013853F /* FSTSpecTests.m in Sources */, + ABE6637A201FA81900ED349A /* database_id_test.cc in Sources */, ABAEEF4F1FD5F8B100C966CB /* FIRQueryTests.m in Sources */, ABF341051FE860CA00C48322 /* FSTAPIHelpers.m in Sources */, DE51B1CC1F0D48C00013853F /* FIRGeoPointTests.m in Sources */, From 043534b8a398c9dd902ccd276c3657c98b236cc0 Mon Sep 17 00:00:00 2001 From: zxu123 Date: Mon, 29 Jan 2018 15:10:41 -0500 Subject: [PATCH 4/5] address changes --- .../core/src/firebase/firestore/model/CMakeLists.txt | 1 + .../core/src/firebase/firestore/model/database_id.cc | 8 +++----- .../core/src/firebase/firestore/model/database_id.h | 10 ++++++---- .../test/firebase/firestore/model/database_id_test.cc | 2 -- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Firestore/core/src/firebase/firestore/model/CMakeLists.txt b/Firestore/core/src/firebase/firestore/model/CMakeLists.txt index 62193d52353..aee0d86a3cd 100644 --- a/Firestore/core/src/firebase/firestore/model/CMakeLists.txt +++ b/Firestore/core/src/firebase/firestore/model/CMakeLists.txt @@ -22,6 +22,7 @@ cc_library( timestamp.cc timestamp.h DEPENDS + absl_strings firebase_firestore_util firebase_firestore_types ) diff --git a/Firestore/core/src/firebase/firestore/model/database_id.cc b/Firestore/core/src/firebase/firestore/model/database_id.cc index 909e2e92b52..af12d305db9 100644 --- a/Firestore/core/src/firebase/firestore/model/database_id.cc +++ b/Firestore/core/src/firebase/firestore/model/database_id.cc @@ -16,18 +16,16 @@ #include "Firestore/core/src/firebase/firestore/model/database_id.h" -#include - #include "Firestore/core/src/firebase/firestore/util/firebase_assert.h" namespace firebase { namespace firestore { namespace model { -const char* DatabaseId::kDefaultDatabaseId = "(default)"; +constexpr const char* DatabaseId::kDefaultDatabaseId; -DatabaseId::DatabaseId(const std::string& project_id, - const std::string& database_id) +DatabaseId::DatabaseId(const absl::string_view project_id, + const absl::string_view database_id) : project_id_(project_id), database_id_(database_id) { FIREBASE_ASSERT(!project_id.empty()); FIREBASE_ASSERT(!database_id.empty()); diff --git a/Firestore/core/src/firebase/firestore/model/database_id.h b/Firestore/core/src/firebase/firestore/model/database_id.h index 0d95bf054b9..f6701cecf32 100644 --- a/Firestore/core/src/firebase/firestore/model/database_id.h +++ b/Firestore/core/src/firebase/firestore/model/database_id.h @@ -19,6 +19,8 @@ #include +#include "absl/strings/string_view.h" + namespace firebase { namespace firestore { namespace model { @@ -27,7 +29,7 @@ namespace model { class DatabaseId { public: /** The default name for "unset" database ID in resource names. */ - static const char* kDefaultDatabaseId; + static constexpr const char* kDefaultDatabaseId = "(default)"; /** * Creates and returns a new DatabaseId. @@ -35,13 +37,13 @@ class DatabaseId { * @param project_id The project for the database. * @param database_id The database in the project to use. */ - DatabaseId(const std::string& project_id, const std::string& database_id); + DatabaseId(const absl::string_view project_id, const absl::string_view database_id); - std::string project_id() const { + const std::string& project_id() const { return project_id_; } - std::string database_id() const { + const std::string& database_id() const { return database_id_; } diff --git a/Firestore/core/test/firebase/firestore/model/database_id_test.cc b/Firestore/core/test/firebase/firestore/model/database_id_test.cc index 074cdc59004..e9c94394824 100644 --- a/Firestore/core/test/firebase/firestore/model/database_id_test.cc +++ b/Firestore/core/test/firebase/firestore/model/database_id_test.cc @@ -16,8 +16,6 @@ #include "Firestore/core/src/firebase/firestore/model/database_id.h" -#include - #include "gtest/gtest.h" namespace firebase { From 635433a87c23929fb8bf2f0990d9d2a7775f29b7 Mon Sep 17 00:00:00 2001 From: zxu123 Date: Mon, 29 Jan 2018 15:13:35 -0500 Subject: [PATCH 5/5] fix style --- Firestore/core/src/firebase/firestore/model/database_id.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Firestore/core/src/firebase/firestore/model/database_id.h b/Firestore/core/src/firebase/firestore/model/database_id.h index f6701cecf32..48c547c334c 100644 --- a/Firestore/core/src/firebase/firestore/model/database_id.h +++ b/Firestore/core/src/firebase/firestore/model/database_id.h @@ -37,7 +37,8 @@ class DatabaseId { * @param project_id The project for the database. * @param database_id The database in the project to use. */ - DatabaseId(const absl::string_view project_id, const absl::string_view database_id); + DatabaseId(const absl::string_view project_id, + const absl::string_view database_id); const std::string& project_id() const { return project_id_;