* Manual Xcode project fixups
* Remove `firebase/firestore` from paths in Firestore/core
This renames all Firestore files under `Firestore/core` to remove the
interior `firebase/firestore` directory structure. This is motivated by
build failures under Windows where the filenames of intermediates were
too long.
Concretely:
* `Firebase/core/src/firebase/firestore` becomes `Firebase/core/src`
* `Firebase/core/test/firebase/firestore` becomes
`Firebase/core/test/unit`
Moving the tests into a `unit` subdirectory aligns Firestore with the
directory structure in
[AddNewPod](https://github.com/firebase/firebase-ios-sdk/blob/master/AddNewPod.md),
modified for C++ (see discussion in #3224).
* Shorten firebase_firestore_example_app
... and:
* Migrate to firebase_ios_add_executable
* Use globs for specifying sources
* Migrate Example/Tests/API to new CMake primitives
* Migrate Example/Tests/Integration to new CMake primitives
* Migrate Example/Tests/SpecTests to new CMake primitives
* Migrate Example/Tests/Util to new CMake primitives
Rename firebase_firestore_objc_test_util to firestore_objc_testing.
* Migrate fuzzing to new CMake primitives
Rewrite firebase_ios_cc_fuzz_test to match the other primitives.
* Add firebase_ios_add_objc_test
* Migrate Example/Benchmarks to new CMake primitives
* Add new, simpler CMake helper functions
... making them more like built-in functions. This makes it possible to
combine other CMake functions in ways that weren't possible with the
original all-in-one approach.
This includes:
* firebase_ios_add_executable
* firebase_ios_add_test
* firebase_ios_add_library
All of which can be combined with target_link_libraries, etc.
* Shorten CMake test targets, e.g. firebase_firestore_util_test => firestore_util_test
* Remove CMake file inclusion check
Now that we're committed to using globs for finding sources, this check
is incompatible and no longer useful.
* Fix previously unknown warnings
These become visible once flags are handled uniformly across all
Firestore targets in an upcoming build change.
* Stop using built-in CMake Framework support
CMake has built-in support for building Framework bundles (briefly:
bundles of libraries, associated headers, and resources) but this
doesn't work well for our needs.
1. In CMake 3.5.1 (our earliest supported CMake version) it doesn't copy
headers properly at build time.
2. Even up to CMake 3.15.5, CMake doesn't handle link-line multiplicity
correctly. CMake passes the static library location within the framework
and this seems to cause the linker to mishandle Objective-C metaclass
information resulting in duplicate symbols. Building with `-framework`
flags works correctly.
Previously we partially worked around the latter problem by building
some frameworks as shared instead of static frameworks, but this is
problematic because this mode of operation isn't actually intended and
is unsupported as far as the rest of Firebase is concerned. This turned
out to be fragile though and while refactoring libraries this workaround
broke.
Rather than piling on additional workarounds, this change converts the
frameworks to simple library targets and emulates framework imports
through include paths.
Additionally, this starts refactoring our cmake helper functions to make
them more like built-in functions. This makes it possible to freely use
different CMake features that were made difficult by trying to wrap
everything up in a single CMake command.
* style.sh generated changes
* Review feedback
* More review feedback
* Use early exit in objc_framework CMakeLists.txt
* Clean up objc_framework CMakeLists.txt
* Use `version` consistently
* Use `firebase_ios_version` for the repo-level version
* Remove INCLUDE directories that are no longer needed
* Sort dependencies
* Simplify Example/App/CMakeLists.txt
* Add `OBJC_FLAGS` directly, avoiding a separate `sources` variable.
* Add resources directly
* Rename test host app to firebase_firestore_example_app
* Add a firebase_ios prefix to functions and variables
This reduces the chance of collision with other projects.
* Simplify compiler_setup
Now that compiler_setup.cmake no longer has side-effects, fold
compiler_id.cmake and archive_options.cmake into it and move
the include of compiler_setup up to the top of the main build.
* Add support for building for iOS
* Make building benchmarks optional
* Disable protoc-based source generators when cross-compiling
* Make downloading googletest optional
* Add DISABLE_STRICT_WARNINGS mode to cc_rules
This makes it possible to build non-Firestore components in the CMake
build to a lower standard than that to which we hold ourselves without
sacrificing the utility of the various build rules that we have.
* Use early exit in objc_framework CMakeLists.txt
* Clean up objc_framework CMakeLists.txt
* Use `version` consistently
* Use `firebase_ios_version` for the repo-level version
* Remove INCLUDE directories that are no longer needed
* Sort dependencies
* Simplify Example/App/CMakeLists.txt
* Add `OBJC_FLAGS` directly, avoiding a separate `sources` variable.
* Add resources directly
* Rename test host app to firebase_firestore_example_app
* Add a firebase_ios prefix to functions and variables
This reduces the chance of collision with other projects.
* Simplify compiler_setup
Now that compiler_setup.cmake no longer has side-effects, fold
compiler_id.cmake and archive_options.cmake into it and move
the include of compiler_setup up to the top of the main build.
* Add Index-free benchmarks
* Add BackgroundQueue
Port of firebase/firebase-android-sdk#559
* Decode documents in background threads to improve performance
Run on (12 X 2900 MHz CPU s)
CPU Caches:
L1 Data 32K (x6)
L1 Instruction 32K (x6)
L2 Unified 262K (x6)
L3 Unified 12582K (x1)
Load Average: 2.24, 2.18, 1.96
----------------------------------------------------------------------------------
Benchmark Time CPU Iterations Improvement
----------------------------------------------------------------------------------
BM_QueryMatching/0/1 132 us 12.7 us 53524 21.4%
BM_QueryMatching/1/1 150 us 18.1 us 37305 16.2%
BM_QueryMatching/1/10 371 us 27.6 us 10000 48.5%
BM_QueryMatching/10/10 429 us 64.3 us 11349 41.0%
BM_QueryMatching/1/100 2573 us 29.0 us 1000 51.7% (max)
BM_QueryMatching/100/100 3123 us 416 us 1000 45.5%
BM_QueryMatching/1/1000 26785 us 33.5 us 100 50.5%
BM_QueryMatching/10/1000 28389 us 74.5 us 100 48.0%
BM_QueryMatching/100/1000 27883 us 470 us 100 49.4%
BM_QueryMatching/1000/1000 32189 us 34.3 us 100 44.8%
BM_QueryAll/1 151 us 15.2 us 45385 -49.5% (min)
BM_QueryAll/10 444 us 60.7 us 12829 32.5%
BM_QueryAll/100 3175 us 414 us 1000 45.1%
BM_QueryAll/1000 30222 us 18.8 us 100 49.7%
Mean 35.3%
* Insert into a vector to reduce contention
Run on (12 X 2900 MHz CPU s)
CPU Caches:
L1 Data 32K (x6)
L1 Instruction 32K (x6)
L2 Unified 262K (x6)
L3 Unified 12582K (x1)
Load Average: 1.43, 2.10, 1.98
----------------------------------------------------------------------------------
Benchmark Time CPU Iterations Improvement
----------------------------------------------------------------------------------
BM_QueryMatching/0/1 127 us 12.2 us 56131 3.8%
BM_QueryMatching/1/1 142 us 16.6 us 39200 5.3%
BM_QueryMatching/1/10 369 us 26.6 us 10000 0.5%
BM_QueryMatching/10/10 425 us 59.2 us 12724 0.9%
BM_QueryMatching/1/100 2194 us 28.9 us 10000 14.7%
BM_QueryMatching/100/100 2765 us 405 us 1000 11.5%
BM_QueryMatching/1/1000 21095 us 32.8 us 1000 21.2%
BM_QueryMatching/10/1000 20797 us 66.4 us 1000 26.7% (max)
BM_QueryMatching/100/1000 21915 us 408 us 1000 21.4%
BM_QueryMatching/1000/1000 23700 us 30.9 us 1000 26.4%
BM_QueryAll/1 136 us 14.3 us 44799 9.9%
BM_QueryAll/10 443 us 57.3 us 10000 0.2% (min)
BM_QueryAll/100 2607 us 389 us 1000 17.9%
BM_QueryAll/1000 23512 us 19.4 us 1000 22.2%
Mean 13.1%
After this PR is merged, the Objective-C serializers can be completely removed from the project. Also, this PR changes the `Message` class quite a bit; it's probably in its final form now.
I did some performance testing locally and came to the conclusion that replacing Objective-C serializers with their C++ versions brings no performance downgrade; actually, there seems to be a very slight improvement. I tested writing large batches and reading large collections:
* both are network-dominated; wall time is about twice longer than CPU time;
* serialization represents a pretty small percentage of the total CPU time;
* for writing, C++ serialization is a little more efficient, taking ~6% of total CPU time, compared to ~8% in the Objective-C version. I've seen similar results for reading.
All integration tests pass, under Address Sanitizer as well.
* Port FSTMemoryPersistence to C++ (#3754)
* Add local::Persistence
* Add MemoryPersistence
* Add MemoryEagerReferenceDelegate
* Make LruDelegate extend ReferenceDelegate
This enables downcasting to LruDelegate in tests that need to do so.
* Add MemoryLruReferenceDelegate
* Don't double-count document key size.
* Port FSTLevelDB to C++ (#3755)
* Add LevelDbPersistence
Note that Apple-specific initialization has been partitioned off in
anticipation of being able to run this code on non-Apple platforms.
* Add LevelDbLruReferenceDelegate
* Migrate to C++ Persistence (1/2) (#3756)
* Use C++ Persistence classes in FSTLocalStore
* Remove ReferenceDelegateBridge
* Cut src over to C++ persistence types
* Remove Objective-C requirement from some classes
... that no longer require it.
* Migrate to C++ Persistence (2/2) (#3757)
* Remove LruDelegateBridge
* Update test initialization of persistence components
In particular, ensure that there's always an owner for the Persistence
instance, which wasn't always handled explicitly in the Objective-C
version of the tests.
* Largely mechanical changes to tests
* Remove Objective-C persistence classes
* Forward declare util::Status when possible (#3761)
* Add a header dedicated to forward declarations for util::Status
* Use status_fwd.h wherever possible
* Fix leveldb benchmarks
... which apparently haven't been built in a while
* Manage configuration for Benchmarks and FuzzTests
* Suppress warnings in LibFuzzer
* Add a Firestore_Benchmarks_iOS scheme
* xcodeproj: Remove manual configuration for Fuzzer and Benchmarks
* Update LibFuzzer build for recent clangs
Builds are currently failing with this on standard out:
-fsanitize-coverage=trace-pc-guard is no longer supported by
libFuzzer. Please either migrate to a compiler that supports
-fsanitize=fuzzer or use an older version of libFuzzer
* Rewrite lint.sh as check_lint.py
This makes several beneficial changes:
* Runs in parallel: lint all now takes 5.5 seconds, down from 25.
* Supports linting specific files, passed on the command-line.
* Defaults to linting files changed since master, pass --all to lint
everything.
* Infers header language based on related files.
* Lays the groundwork for linting more than just C++.
* Adds support for linting python.
* Fix lint errors
* Use check_lint.py in check.sh
* Remove lint.sh
* Python lint configuration
* Enable python linting in travis
* Remove stale references to DatabaseId
* Have Firestore take the DatabaseId directly
* Allow tests to default the database implicitly
* Have FSTSerializerBeta take DatabaseId by value
* Have FSTUserDataConverter take DatabaseId by value
* Make FIRFirestore.databaseID a const reference
* Make FSTFirestoreClient.databaseID a const reference
* Have FSTReferenceValue take DatabaseId by value
* Have DatabaseInfo take DatabaseId by value
* Have Serializer take DatabaseId by value
* Fix C++ ReferenceValue
* Take DatabaseId by value
* Reverse order to match Android
* Rename `reference` to `key`
* Fix endianness detection in OrderedCode
(and prevent further regression.)
* Use static_assert for constant checks
* Add a benchmark for SkipToNextSpecialByte
* Move string_apple_benchmark next to string_apple_test
* Accept non-const references in benchmark functions
This is a port of cl/132348268.
* Adjust Xcode project
* Add GoogleBenchmark as a dependency
Also eliminate most usages of `FSTDocumentKey`, remove most methods from the Objective-C class and make it just a wrapper over `DocumentKey`. The only usage that cannot be directly replaced by C++ `DocumentKey` is in `FSTFieldValue`.
* Add a MakeStringView benchmark
Turns out this is worse than just creating a std::string:
BM_MakeString 29 ns 29 ns 189065849
BM_MakeStringView 59 ns 59 ns 93013367
* Convert database_id to take std::string
* Convert DatabaseInfo to take std::string
* Convert User to take std::string
* Convert Token to take std::string
* Convert MakeStringView([NSString stringWithFormat:]) to StringFormat
* Migrate to LevelDbVersionKey
* Migrate to LevelDbMutationKey
* Migrate to LevelDbDocumentMutationKey
* Migrate to LevelDbMutationQueueKey
* Migrate to LevelDbTargetGlobalKey
* Migrate to LevelDbTargetKey
* Migrate to LevelDbQueryTargetKey
* Migrate to LevelDbTargetDocumentKey
* Migrate to LevelDbDocumentTargetKey
* Migrate to LevelDbRemoteDocumentKey
Also:
- Remove FSTLevelDBKey and tests
- Remove StringView and tests
* Step one of benchmarking
* Benchmark writing to leveldb
* Comment out and style
* More comments
* Fix warnings
* Someday I will lint as good as computer
* Some light commenting and static-ing
* It seems to be working?
* Remove unused test file
* Drop commented-out deps
* Revert string quoting in pbxproj file
* Drop reference to deleted file
* Move podspec, fix import
* Lots of C++ style changes
* Style
* Drop whitespace