diff --git a/.github/workflows/firestore-nightly.yml b/.github/workflows/firestore-nightly.yml index 36beeadb4ac..cd2afee4f43 100644 --- a/.github/workflows/firestore-nightly.yml +++ b/.github/workflows/firestore-nightly.yml @@ -15,6 +15,8 @@ name: firestore_nightly on: + pull_request: + branches: [ "cheryllin/pplapi", "cheryllin/ppl" ] workflow_dispatch: concurrency: @@ -49,6 +51,7 @@ jobs: plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }} MINT_PATH: ${{ github.workspace }}/mint TARGET_DATABASE_ID: ${{ matrix.databaseId }} + USE_LATEST_CMAKE: false runs-on: ${{ matrix.os }} steps: @@ -77,6 +80,11 @@ jobs: run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/firestore-nightly.plist.gpg \ Firestore/Example/App/GoogleService-Info.plist "$plist_secret" + - name: Setup cmake + uses: jwlawson/actions-setup-cmake@v2 + with: + cmake-version: '3.31.1' + # Skipping terraform index creation because we are not allowed to download SA key json. - name: Setup build diff --git a/.gitignore b/.gitignore index dc909fe4338..74607c5993b 100644 --- a/.gitignore +++ b/.gitignore @@ -155,6 +155,7 @@ FirebaseAppCheck/Apps/AppCheckCustomProvideApp/AppCheckCustomProvideApp/GoogleSe /Example/FirestoreSample/ui-debug.log /Example/FirestoreSample/firestore-debug.log /Example/FirestoreSample/firebase-debug.log +Firestore/Example/GoogleService-Info.plist # generated Terraform docs .terraform/* diff --git a/Firestore/CHANGELOG.md b/Firestore/CHANGELOG.md index bcb63c64c11..be06d99f4ab 100644 --- a/Firestore/CHANGELOG.md +++ b/Firestore/CHANGELOG.md @@ -1,3 +1,6 @@ +# Unreleased +- [feature] Add `Pipeline` support. + # 11.12.0 - [fixed] Fixed the `null` value handling in `isNotEqualTo` and `notIn` filters. diff --git a/Firestore/Example/Firestore.xcodeproj/project.pbxproj b/Firestore/Example/Firestore.xcodeproj/project.pbxproj index caed5e945ef..b312da6945c 100644 --- a/Firestore/Example/Firestore.xcodeproj/project.pbxproj +++ b/Firestore/Example/Firestore.xcodeproj/project.pbxproj @@ -322,9 +322,11 @@ 2EC1C4D202A01A632339A161 /* field_transform_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7515B47C92ABEEC66864B55C /* field_transform_test.cc */; }; 2F3740131CC8F8230351B91D /* byte_stream_cpp_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 01D10113ECC5B446DB35E96D /* byte_stream_cpp_test.cc */; }; 2F69187F601E00054469F4A5 /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3355BE9391CC4857AF0BDAE3 /* DatabaseTests.swift */; }; + 2F72DBE2EC6E24A81C69DEF0 /* explain_stats.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */; }; 2F8FDF35BBB549A6F4D2118E /* FSTMemorySpecTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E02F20213FFC00B64F25 /* FSTMemorySpecTests.mm */; }; 2FA0BAE32D587DF2EA5EEB97 /* async_queue_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B6FB467B208E9A8200554BA2 /* async_queue_test.cc */; }; 2FAE0BCBE559ED7214AEFEB7 /* Validation_BloomFilterTest_MD5_1_01_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 0D964D4936953635AC7E0834 /* Validation_BloomFilterTest_MD5_1_01_bloom_filter_proto.json */; }; + 2FC2B732841BF2C425EB35DF /* field_behavior.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */; }; 3040FD156E1B7C92B0F2A70C /* ordered_code_benchmark.cc in Sources */ = {isa = PBXBuildFile; fileRef = 0473AFFF5567E667A125347B /* ordered_code_benchmark.cc */; }; 3056418E81BC7584FBE8AD6C /* user_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = CCC9BD953F121B9E29F9AA42 /* user_test.cc */; }; 306E762DC6B829CED4FD995D /* target_id_generator_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB380CF82019382300D97691 /* target_id_generator_test.cc */; }; @@ -381,6 +383,7 @@ 39790AC7E71BC06D48144BED /* memory_globals_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 5C6DEA63FBDE19D841291723 /* memory_globals_cache_test.cc */; }; 3987A3E8534BAA496D966735 /* memory_index_manager_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = DB5A1E760451189DA36028B3 /* memory_index_manager_test.cc */; }; 39CDC9EC5FD2E891D6D49151 /* secure_random_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 54740A531FC913E500713A1A /* secure_random_test.cc */; }; + 3A110ECBF96B6E44BA77011A /* field_behavior.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */; }; 3A307F319553A977258BB3D6 /* view_snapshot_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = CC572A9168BBEF7B83E4BBC5 /* view_snapshot_test.cc */; }; 3A7CB01751697ED599F2D9A1 /* executor_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B6FB4688208F9B9100554BA2 /* executor_test.cc */; }; 3A93D8FB318C6491A6B654F5 /* Validation_BloomFilterTest_MD5_50000_01_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 7B44DD11682C4803B73DCC34 /* Validation_BloomFilterTest_MD5_50000_01_bloom_filter_proto.json */; }; @@ -401,6 +404,7 @@ 3CCABD7BB5ED39DF1140B5F0 /* leveldb_globals_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = FC44D934D4A52C790659C8D6 /* leveldb_globals_cache_test.cc */; }; 3CFFA6F016231446367E3A69 /* listen_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 54DA12A01F315EE100DD57A1 /* listen_spec_test.json */; }; 3D22F56C0DE7C7256C75DC06 /* tree_sorted_map_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 549CCA4D20A36DBB00BCEB75 /* tree_sorted_map_test.cc */; }; + 3D5F7AA7BB68529F47BE4B12 /* PipelineApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59BF06E5A4988F9F949DD871 /* PipelineApiTests.swift */; }; 3D6AC48D6197E6539BBBD28F /* thread_safe_memoizer_testing.cc in Sources */ = {isa = PBXBuildFile; fileRef = 6E42FA109D363EA7F3387AAE /* thread_safe_memoizer_testing.cc */; }; 3D9619906F09108E34FF0C95 /* FSTSmokeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */; }; 3DBB48F077C97200F32B51A0 /* value_util_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 40F9D09063A07F710811A84F /* value_util_test.cc */; }; @@ -684,6 +688,7 @@ 5BE49546D57C43DDFCDB6FBD /* to_string_apple_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = B68B1E002213A764008977EF /* to_string_apple_test.mm */; }; 5C9B5696644675636A052018 /* token_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = A082AFDD981B07B5AD78FDE8 /* token_test.cc */; }; 5CADE71A1CA6358E1599F0F9 /* hashing_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 54511E8D209805F8005BD28F /* hashing_test.cc */; }; + 5CDD24225992674A4D3E3D4E /* pipeline.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */; }; 5CEB0E83DA68652927D2CF07 /* memory_document_overlay_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 29D9C76922DAC6F710BC1EF4 /* memory_document_overlay_cache_test.cc */; }; 5D405BE298CE4692CB00790A /* Pods_Firestore_Tests_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B50B3A0DF77100EEE887891 /* Pods_Firestore_Tests_iOS.framework */; }; 5D45CC300ED037358EF33A8F /* snapshot_version_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ABA495B9202B7E79008A7851 /* snapshot_version_test.cc */; }; @@ -732,6 +737,7 @@ 604B75044D6BEC2B7515EA1B /* index_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 8C7278B604B8799F074F4E8C /* index_spec_test.json */; }; 60985657831B8DDE2C65AC8B /* FIRFieldsTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E06A202154D500B64F25 /* FIRFieldsTests.mm */; }; 60C72F86D2231B1B6592A5E6 /* filesystem_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F51859B394D01C0C507282F1 /* filesystem_test.cc */; }; + 60DA778E447F9ACD402FDA2F /* pipeline.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */; }; 6105A1365831B79A7DEEA4F3 /* path_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 403DBF6EFB541DFD01582AA3 /* path_test.cc */; }; 6141D3FDF5728FCE9CC1DBFA /* bundle_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 79EAA9F7B1B9592B5F053923 /* bundle_spec_test.json */; }; 6156C6A837D78D49ED8B8812 /* index_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 8C7278B604B8799F074F4E8C /* index_spec_test.json */; }; @@ -769,6 +775,7 @@ 64D8241E9F56973DAD3077BC /* Validation_BloomFilterTest_MD5_1_01_membership_test_result.json in Resources */ = {isa = PBXBuildFile; fileRef = 5C68EE4CB94C0DD6E333F546 /* Validation_BloomFilterTest_MD5_1_01_membership_test_result.json */; }; 650B31A5EC6F8D2AEA79C350 /* index_manager_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AE4A9E38D65688EE000EE2A1 /* index_manager_test.cc */; }; 65537B22A73E3909666FB5BC /* remote_document_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7EB299CF85034F09CFD6F3FD /* remote_document_cache_test.cc */; }; + 655F8647F57E5F2155DFF7B5 /* PipelineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861684E49DAC993D153E60D0 /* PipelineTests.swift */; }; 658CBF4A717EA160E27C973E /* Validation_BloomFilterTest_MD5_50000_0001_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = A5D9044B72061CAF284BC9E4 /* Validation_BloomFilterTest_MD5_50000_0001_bloom_filter_proto.json */; }; 659FFE071CD0F60DAEADD50B /* bloom_filter.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1E0C7C0DCD2790019E66D8CC /* bloom_filter.pb.cc */; }; 65D54B964A2021E5A36AB21F /* bundle_loader_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = A853C81A6A5A51C9D0389EDA /* bundle_loader_test.cc */; }; @@ -897,6 +904,7 @@ 7AD020FC27493FF8E659436C /* existence_filter_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 54DA129D1F315EE100DD57A1 /* existence_filter_spec_test.json */; }; 7B0EA399F899537ACCC84E53 /* string_format_apple_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9CFD366B783AE27B9E79EE7A /* string_format_apple_test.mm */; }; 7B0F073BDB6D0D6E542E23D4 /* query.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 544129D621C2DDC800EFB9CC /* query.pb.cc */; }; + 7B58861D0978827BC4CB1DFA /* field_behavior.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */; }; 7B74447D211586D9D1CC82BB /* datastore_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3167BD972EFF8EC636530E59 /* datastore_test.cc */; }; 7B8320F12E8092BC86FFCC2C /* fields_array_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = BA4CBA48204C9E25B56993BC /* fields_array_test.cc */; }; 7B86B1B21FD0EF2A67547F66 /* byte_string_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 5342CDDB137B4E93E2E85CCA /* byte_string_test.cc */; }; @@ -907,6 +915,7 @@ 7C1DC1B44729381126D083AE /* leveldb_snappy_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D9D94300B9C02F7069523C00 /* leveldb_snappy_test.cc */; }; 7C5E017689012489AAB7718D /* CodableGeoPointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5495EB022040E90200EBA509 /* CodableGeoPointTests.swift */; }; 7C7BA1DB0B66EB899A928283 /* hashing_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 54511E8D209805F8005BD28F /* hashing_test.cc */; }; + 7CAF0E8C47FB2DD486240D47 /* explain_stats.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */; }; 7D25D41B013BB70ADE526055 /* target_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 526D755F65AC676234F57125 /* target_test.cc */; }; 7D320113FD076A1EF9A8B612 /* filter_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F02F734F272C3C70D1307076 /* filter_test.cc */; }; 7D3207DEE229EFCF16E52693 /* Validation_BloomFilterTest_MD5_500_01_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 4BD051DBE754950FEAC7A446 /* Validation_BloomFilterTest_MD5_500_01_bloom_filter_proto.json */; }; @@ -953,6 +962,7 @@ 8405FF2BFBB233031A887398 /* event_manager_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 6F57521E161450FAF89075ED /* event_manager_test.cc */; }; 8413BD9958F6DD52C466D70F /* sorted_set_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 549CCA4C20A36DBB00BCEB75 /* sorted_set_test.cc */; }; 84285C3F63D916A4786724A8 /* field_index_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = BF76A8DA34B5B67B4DD74666 /* field_index_test.cc */; }; + 8429E18EFBAF473209731E01 /* pipeline.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */; }; 843EE932AA9A8F43721F189E /* leveldb_local_store_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 5FF903AEFA7A3284660FA4C5 /* leveldb_local_store_test.cc */; }; 8460C97C9209D7DAF07090BD /* FIRFieldsTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E06A202154D500B64F25 /* FIRFieldsTests.mm */; }; 84E75527F3739131C09BEAA5 /* target_index_matcher_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 63136A2371C0C013EC7A540C /* target_index_matcher_test.cc */; }; @@ -1098,6 +1108,7 @@ A25FF76DEF542E01A2DF3B0E /* time_testing.cc in Sources */ = {isa = PBXBuildFile; fileRef = 5497CB76229DECDE000FB92F /* time_testing.cc */; }; A27096F764227BC73526FED3 /* leveldb_remote_document_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 0840319686A223CC4AD3FAB1 /* leveldb_remote_document_cache_test.cc */; }; A27908A198E1D2230C1801AC /* bundle_serializer_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B5C2A94EE24E60543F62CC35 /* bundle_serializer_test.cc */; }; + A296B0110550890E1D8D59A3 /* explain_stats.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */; }; A2E9978E02F7BCB016555F09 /* Validation_BloomFilterTest_MD5_1_1_membership_test_result.json in Resources */ = {isa = PBXBuildFile; fileRef = 3369AC938F82A70685C5ED58 /* Validation_BloomFilterTest_MD5_1_1_membership_test_result.json */; }; A3262936317851958C8EABAF /* byte_stream_cpp_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 01D10113ECC5B446DB35E96D /* byte_stream_cpp_test.cc */; }; A4757C171D2407F61332EA38 /* byte_stream_cpp_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 01D10113ECC5B446DB35E96D /* byte_stream_cpp_test.cc */; }; @@ -1122,6 +1133,7 @@ A7309DAD4A3B5334536ECA46 /* remote_event_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 584AE2C37A55B408541A6FF3 /* remote_event_test.cc */; }; A7399FB3BEC50BBFF08EC9BA /* mutation_queue_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3068AA9DFBBA86C1FE2A946E /* mutation_queue_test.cc */; }; A7669E72BCED7FBADA4B1314 /* thread_safe_memoizer_testing_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = EA10515F99A42D71DA2D2841 /* thread_safe_memoizer_testing_test.cc */; }; + A78366DBE0BFDE42474A728A /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E73D03B9C02CAC7BEBAFA86 /* TestHelper.swift */; }; A80D38096052F928B17E1504 /* user_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = CCC9BD953F121B9E29F9AA42 /* user_test.cc */; }; A833A216988ADFD4876763CD /* Validation_BloomFilterTest_MD5_50000_01_membership_test_result.json in Resources */ = {isa = PBXBuildFile; fileRef = C8FB22BCB9F454DA44BA80C8 /* Validation_BloomFilterTest_MD5_50000_01_membership_test_result.json */; }; A841EEB5A94A271523EAE459 /* Validation_BloomFilterTest_MD5_50000_0001_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = A5D9044B72061CAF284BC9E4 /* Validation_BloomFilterTest_MD5_50000_0001_bloom_filter_proto.json */; }; @@ -1149,6 +1161,7 @@ AB8209455BAA17850D5E196D /* http.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 618BBE9720B89AAC00B5BCE7 /* http.pb.cc */; }; AB9FF792C60FC581909EF381 /* recovery_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 9C1AFCC9E616EC33D6E169CF /* recovery_spec_test.json */; }; ABA495BB202B7E80008A7851 /* snapshot_version_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ABA495B9202B7E79008A7851 /* snapshot_version_test.cc */; }; + ABE599C3BF9FB6AFF18AA901 /* explain_stats.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */; }; ABE6637A201FA81900ED349A /* database_id_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB71064B201FA60300344F18 /* database_id_test.cc */; }; ABF6506C201131F8005F2C74 /* timestamp_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ABF6506B201131F8005F2C74 /* timestamp_test.cc */; }; ABFD599019CF312CFF96B3EC /* perf_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = D5B2593BCB52957D62F1C9D3 /* perf_spec_test.json */; }; @@ -1160,6 +1173,7 @@ ACC9369843F5ED3BD2284078 /* timestamp_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ABF6506B201131F8005F2C74 /* timestamp_test.cc */; }; AD00D000A63837FB47291BFE /* Validation_BloomFilterTest_MD5_1_0001_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 4B59C0A7B2A4548496ED4E7D /* Validation_BloomFilterTest_MD5_1_0001_bloom_filter_proto.json */; }; AD12205540893CEB48647937 /* filesystem_testing.cc in Sources */ = {isa = PBXBuildFile; fileRef = BA02DA2FCD0001CFC6EB08DA /* filesystem_testing.cc */; }; + AD34726BFD3461FF64BBD56D /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E73D03B9C02CAC7BEBAFA86 /* TestHelper.swift */; }; AD35AA07F973934BA30C9000 /* remote_event_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 584AE2C37A55B408541A6FF3 /* remote_event_test.cc */; }; AD3C26630E33BE59C49BEB0D /* grpc_unary_call_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B6D964942163E63900EB9CFB /* grpc_unary_call_test.cc */; }; AD74843082C6465A676F16A7 /* async_queue_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B6FB467B208E9A8200554BA2 /* async_queue_test.cc */; }; @@ -1274,11 +1288,13 @@ BC549E3F3F119D80741D8612 /* leveldb_util_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 332485C4DCC6BA0DBB5E31B7 /* leveldb_util_test.cc */; }; BC5AC8890974E0821431267E /* limit_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 54DA129F1F315EE100DD57A1 /* limit_spec_test.json */; }; BC8DFBCB023DBD914E27AA7D /* query_listener_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7C3F995E040E9E9C5E8514BB /* query_listener_test.cc */; }; + BC9966788F245D79A63C2E47 /* pipeline.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */; }; BCA720A0F54D23654F806323 /* ConditionalConformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3228F51DCDC2E90D5C58F97 /* ConditionalConformanceTests.swift */; }; BCAC9F7A865BD2320A4D8752 /* bloom_filter_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = A2E6F09AD1EE0A6A452E9A08 /* bloom_filter_test.cc */; }; BD0882A40BD8AE042629C179 /* thread_safe_memoizer_testing_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = EA10515F99A42D71DA2D2841 /* thread_safe_memoizer_testing_test.cc */; }; BD3A421C9E40C57D25697E75 /* Validation_BloomFilterTest_MD5_500_01_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 4BD051DBE754950FEAC7A446 /* Validation_BloomFilterTest_MD5_500_01_bloom_filter_proto.json */; }; BD6CC8614970A3D7D2CF0D49 /* exponential_backoff_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B6D1B68420E2AB1A00B35856 /* exponential_backoff_test.cc */; }; + BD74B0E1FC752236A7376BC3 /* PipelineApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59BF06E5A4988F9F949DD871 /* PipelineApiTests.swift */; }; BDD2D1812BAD962E3C81A53F /* hashing_test_apple.mm in Sources */ = {isa = PBXBuildFile; fileRef = B69CF3F02227386500B281C8 /* hashing_test_apple.mm */; }; BDDAE67000DBF10E9EA7FED0 /* nanopb_util_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 6F5B6C1399F92FD60F2C582B /* nanopb_util_test.cc */; }; BDF3A6C121F2773BB3A347A7 /* counting_query_engine.cc in Sources */ = {isa = PBXBuildFile; fileRef = 99434327614FEFF7F7DC88EC /* counting_query_engine.cc */; }; @@ -1338,9 +1354,11 @@ C840AD39F7EC5524F1C0F5AE /* filter_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F02F734F272C3C70D1307076 /* filter_test.cc */; }; C86E85101352B5CDBF5909F9 /* md5_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3D050936A2D52257FD17FB6E /* md5_test.cc */; }; C8722550B56CEB96F84DCE94 /* target_index_matcher_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 63136A2371C0C013EC7A540C /* target_index_matcher_test.cc */; }; + C8889F3C37F1CC3E64558287 /* pipeline.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */; }; C8A573895D819A92BF16B5E5 /* mutation_queue_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3068AA9DFBBA86C1FE2A946E /* mutation_queue_test.cc */; }; C8BA36C8B5E26C173F91E677 /* aggregation_result.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D872D754B8AD88E28AF28B28 /* aggregation_result.pb.cc */; }; C8BC50508337800E8B098F57 /* bundle_loader_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = A853C81A6A5A51C9D0389EDA /* bundle_loader_test.cc */; }; + C8C2B945D84DD98391145F3F /* PipelineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861684E49DAC993D153E60D0 /* PipelineTests.swift */; }; C8C4CB7B6E23FC340BEC6D7F /* load_bundle_task_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8F1A7B4158D9DD76EE4836BF /* load_bundle_task_test.cc */; }; C8D3CE2343E53223E6487F2C /* Pods_Firestore_Example_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5918805E993304321A05E82B /* Pods_Firestore_Example_iOS.framework */; }; C901A1BFD553B6DD70BB7CC7 /* bundle_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F7FC06E0A47D393DE1759AE1 /* bundle_cache_test.cc */; }; @@ -1407,6 +1425,7 @@ D5B25CBF07F65E885C9D68AB /* perf_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = D5B2593BCB52957D62F1C9D3 /* perf_spec_test.json */; }; D5E9954FC1C5ABBC7A180B33 /* FSTSpecTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E03020213FFC00B64F25 /* FSTSpecTests.mm */; }; D5F6AAA1A1B9AE84205ECE27 /* Validation_BloomFilterTest_MD5_50000_1_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 4B3E4A77493524333133C5DC /* Validation_BloomFilterTest_MD5_50000_1_bloom_filter_proto.json */; }; + D64792BBFA130E26CB3D1028 /* pipeline.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */; }; D6486C7FFA8BE6F9C7D2F4C4 /* filesystem_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F51859B394D01C0C507282F1 /* filesystem_test.cc */; }; D658E6DA5A218E08810E1688 /* byte_string_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 5342CDDB137B4E93E2E85CCA /* byte_string_test.cc */; }; D6962E598CEDABA312D87760 /* bundle_reader_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 6ECAF7DE28A19C69DF386D88 /* bundle_reader_test.cc */; }; @@ -1454,6 +1473,7 @@ DD6C480629B3F87933FAF440 /* filesystem_testing.cc in Sources */ = {isa = PBXBuildFile; fileRef = BA02DA2FCD0001CFC6EB08DA /* filesystem_testing.cc */; }; DD935E243A64A4EB688E4C1C /* credentials_provider_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 2F4FA4576525144C5069A7A5 /* credentials_provider_test.cc */; }; DD941BF189E38312E7A2CB21 /* Validation_BloomFilterTest_MD5_500_1_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = D8E530B27D5641B9C26A452C /* Validation_BloomFilterTest_MD5_500_1_bloom_filter_proto.json */; }; + DDC782CBA37AA9B0EA373B7A /* explain_stats.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */; }; DDD219222EEE13E3F9F2C703 /* leveldb_transaction_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 88CF09277CFA45EE1273E3BA /* leveldb_transaction_test.cc */; }; DDDE74C752E65DE7D39A7166 /* view_testing.cc in Sources */ = {isa = PBXBuildFile; fileRef = A5466E7809AD2871FFDE6C76 /* view_testing.cc */; }; DE03B2D41F2149D600A30B9C /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; @@ -1466,11 +1486,13 @@ DEC033E4FB3E09A3C7CE6016 /* aggregate_query_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AF924C79F49F793992A84879 /* aggregate_query_test.cc */; }; DEF4BF5FAA83C37100408F89 /* bundle_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 79EAA9F7B1B9592B5F053923 /* bundle_spec_test.json */; }; DF4B3835C5AA4835C01CD255 /* local_store_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 307FF03D0297024D59348EBD /* local_store_test.cc */; }; + DF6FBE5BBD578B0DD34CEFA1 /* PipelineApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59BF06E5A4988F9F949DD871 /* PipelineApiTests.swift */; }; DF7ABEB48A650117CBEBCD26 /* object_value_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 214877F52A705012D6720CA0 /* object_value_test.cc */; }; DF96816EC67F9B8DF19B0CFD /* document_overlay_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = FFCA39825D9678A03D1845D0 /* document_overlay_cache_test.cc */; }; DF983A9C1FBF758AF3AF110D /* aggregation_result.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = D872D754B8AD88E28AF28B28 /* aggregation_result.pb.cc */; }; E042112665DD2504E3F495D5 /* Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 4375BDCDBCA9938C7F086730 /* Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json */; }; E04607A1E2964684184E8AEA /* index_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 8C7278B604B8799F074F4E8C /* index_spec_test.json */; }; + E04CB0D580980748D5DC453F /* PipelineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861684E49DAC993D153E60D0 /* PipelineTests.swift */; }; E08297B35E12106105F448EB /* ordered_code_benchmark.cc in Sources */ = {isa = PBXBuildFile; fileRef = 0473AFFF5567E667A125347B /* ordered_code_benchmark.cc */; }; E084921EFB7CF8CB1E950D6C /* iterator_adaptors_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 54A0353420A3D8CB003E0143 /* iterator_adaptors_test.cc */; }; E0E640226A1439C59BBBA9C1 /* hard_assert_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 444B7AB3F5A2929070CB1363 /* hard_assert_test.cc */; }; @@ -1522,8 +1544,10 @@ E884336B43BBD1194C17E3C4 /* status_testing.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3CAA33F964042646FDDAF9F9 /* status_testing.cc */; }; E8AB8024B70F6C960D8C7530 /* document_overlay_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = FFCA39825D9678A03D1845D0 /* document_overlay_cache_test.cc */; }; E8BA7055EDB8B03CC99A528F /* recovery_spec_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 9C1AFCC9E616EC33D6E169CF /* recovery_spec_test.json */; }; + E9071BE412DC42300B936BAF /* explain_stats.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */; }; E962CA641FB1312638593131 /* leveldb_document_overlay_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AE89CFF09C6804573841397F /* leveldb_document_overlay_cache_test.cc */; }; E99D5467483B746D4AA44F74 /* fields_array_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = BA4CBA48204C9E25B56993BC /* fields_array_test.cc */; }; + E9BC6A5BC2B209B1BA2F8BD6 /* field_behavior.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */; }; EA38690795FBAA182A9AA63E /* FIRDatabaseTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E06C202154D500B64F25 /* FIRDatabaseTests.mm */; }; EA46611779C3EEF12822508C /* annotations.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 618BBE9520B89AAC00B5BCE7 /* annotations.pb.cc */; }; EAA1962BFBA0EBFBA53B343F /* bundle_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4F5B96F3ABCD2CA901DB1CD4 /* bundle_builder.cc */; }; @@ -1550,6 +1574,7 @@ ED9DF1EB20025227B38736EC /* message_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE37875365497FFA8687B745 /* message_test.cc */; }; EDF35B147B116F659D0D2CA8 /* Validation_BloomFilterTest_MD5_1_0001_membership_test_result.json in Resources */ = {isa = PBXBuildFile; fileRef = C939D1789E38C09F9A0C1157 /* Validation_BloomFilterTest_MD5_1_0001_membership_test_result.json */; }; EE470CC3C8FBCDA5F70A8466 /* local_store_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 307FF03D0297024D59348EBD /* local_store_test.cc */; }; + EE4C4BE7F93366AE6368EE02 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E73D03B9C02CAC7BEBAFA86 /* TestHelper.swift */; }; EE6DBFB0874A50578CE97A7F /* leveldb_remote_document_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 0840319686A223CC4AD3FAB1 /* leveldb_remote_document_cache_test.cc */; }; EECC1EC64CA963A8376FA55C /* persistence_testing.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9113B6F513D0473AEABBAF1F /* persistence_testing.cc */; }; EF3518F84255BAF3EBD317F6 /* exponential_backoff_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B6D1B68420E2AB1A00B35856 /* exponential_backoff_test.cc */; }; @@ -1585,6 +1610,7 @@ F19B749671F2552E964422F7 /* FIRListenerRegistrationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E06B202154D500B64F25 /* FIRListenerRegistrationTests.mm */; }; F1EAEE9DF819C017A9506AEB /* FIRIndexingTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 795AA8FC31D2AF6864B07D39 /* FIRIndexingTests.mm */; }; F1F8FB9254E9A5107161A7B2 /* Validation_BloomFilterTest_MD5_500_01_membership_test_result.json in Resources */ = {isa = PBXBuildFile; fileRef = DD990FD89C165F4064B4F608 /* Validation_BloomFilterTest_MD5_500_01_membership_test_result.json */; }; + F21A3E06BBEC807FADB43AAF /* field_behavior.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */; }; F272A8C41D2353700A11D1FB /* field_mask_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 549CCA5320A36E1F00BCEB75 /* field_mask_test.cc */; }; F27347560A963E8162C56FF3 /* target_index_matcher_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 63136A2371C0C013EC7A540C /* target_index_matcher_test.cc */; }; F2876F16CF689FD7FFBA9DFA /* Validation_BloomFilterTest_MD5_1_01_bloom_filter_proto.json in Resources */ = {isa = PBXBuildFile; fileRef = 0D964D4936953635AC7E0834 /* Validation_BloomFilterTest_MD5_1_01_bloom_filter_proto.json */; }; @@ -1631,6 +1657,7 @@ FB2111D9205822CC8E7368C2 /* FIRDocumentReferenceTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E049202154AA00B64F25 /* FIRDocumentReferenceTests.mm */; }; FB2D5208A6B5816A7244D77A /* query_engine_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8A853940305237AFDA8050B /* query_engine_test.cc */; }; FB3D9E01547436163C456A3C /* message_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE37875365497FFA8687B745 /* message_test.cc */; }; + FB462B2C6D3C167DF32BA0E1 /* field_behavior.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */; }; FBBB13329D3B5827C21AE7AB /* reference_set_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 132E32997D781B896672D30A /* reference_set_test.cc */; }; FC1D22B6EC4E5F089AE39B8C /* memory_target_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 2286F308EFB0534B1BDE05B9 /* memory_target_cache_test.cc */; }; FC6C9D1A8B24A5C9507272F7 /* globals_cache_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4564AD9C55EC39C080EB9476 /* globals_cache_test.cc */; }; @@ -1715,6 +1742,7 @@ 062072B62773A055001655D7 /* AsyncAwaitIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncAwaitIntegrationTests.swift; sourceTree = ""; }; 0840319686A223CC4AD3FAB1 /* leveldb_remote_document_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = leveldb_remote_document_cache_test.cc; sourceTree = ""; }; 0D964D4936953635AC7E0834 /* Validation_BloomFilterTest_MD5_1_01_bloom_filter_proto.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_1_01_bloom_filter_proto.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_1_01_bloom_filter_proto.json; sourceTree = ""; }; + 0E73D03B9C02CAC7BEBAFA86 /* TestHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TestHelper.swift; path = TestHelper/TestHelper.swift; sourceTree = ""; }; 0EE5300F8233D14025EF0456 /* string_apple_test.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; path = string_apple_test.mm; sourceTree = ""; }; 11984BA0A99D7A7ABA5B0D90 /* Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS.release.xcconfig"; sourceTree = ""; }; 1235769122B7E915007DDFA9 /* EncodableFieldValueTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncodableFieldValueTests.swift; sourceTree = ""; }; @@ -1724,6 +1752,7 @@ 129A369928CA555B005AE7E2 /* FIRCountTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FIRCountTests.mm; sourceTree = ""; }; 12F4357299652983A615F886 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 132E32997D781B896672D30A /* reference_set_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reference_set_test.cc; sourceTree = ""; }; + 15249D092D85B40EFC8A1459 /* pipeline.pb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pipeline.pb.h; sourceTree = ""; }; 166CE73C03AB4366AAC5201C /* leveldb_index_manager_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = leveldb_index_manager_test.cc; sourceTree = ""; }; 1A7D48A017ECB54FD381D126 /* Validation_BloomFilterTest_MD5_5000_1_membership_test_result.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_5000_1_membership_test_result.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_5000_1_membership_test_result.json; sourceTree = ""; }; 1A8141230C7E3986EACEF0B6 /* thread_safe_memoizer_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = thread_safe_memoizer_test.cc; sourceTree = ""; }; @@ -1734,6 +1763,7 @@ 1CA9800A53669EFBFFB824E3 /* memory_remote_document_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = memory_remote_document_cache_test.cc; sourceTree = ""; }; 1E0C7C0DCD2790019E66D8CC /* bloom_filter.pb.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = bloom_filter.pb.cc; sourceTree = ""; }; 1F50E872B3F117A674DA8E94 /* index_backfiller_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = index_backfiller_test.cc; sourceTree = ""; }; + 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = field_behavior.pb.cc; sourceTree = ""; }; 214877F52A705012D6720CA0 /* object_value_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = object_value_test.cc; sourceTree = ""; }; 2220F583583EFC28DE792ABE /* Pods_Firestore_IntegrationTests_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_IntegrationTests_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2286F308EFB0534B1BDE05B9 /* memory_target_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = memory_target_cache_test.cc; sourceTree = ""; }; @@ -1773,6 +1803,7 @@ 403DBF6EFB541DFD01582AA3 /* path_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = path_test.cc; sourceTree = ""; }; 40F9D09063A07F710811A84F /* value_util_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = value_util_test.cc; sourceTree = ""; }; 4132F30044D5DF1FB15B2A9D /* fake_credentials_provider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = fake_credentials_provider.h; sourceTree = ""; }; + 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = explain_stats.pb.cc; sourceTree = ""; }; 432C71959255C5DBDF522F52 /* byte_stream_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = byte_stream_test.cc; sourceTree = ""; }; 4334F87873015E3763954578 /* status_testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = status_testing.h; sourceTree = ""; }; 4375BDCDBCA9938C7F086730 /* Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_5000_1_bloom_filter_proto.json; sourceTree = ""; }; @@ -1892,6 +1923,7 @@ 57F8EE51B5EFC9FAB185B66C /* Validation_BloomFilterTest_MD5_5000_01_bloom_filter_proto.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_5000_01_bloom_filter_proto.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_5000_01_bloom_filter_proto.json; sourceTree = ""; }; 584AE2C37A55B408541A6FF3 /* remote_event_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = remote_event_test.cc; sourceTree = ""; }; 5918805E993304321A05E82B /* Pods_Firestore_Example_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_Example_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 59BF06E5A4988F9F949DD871 /* PipelineApiTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PipelineApiTests.swift; sourceTree = ""; }; 5B5414D28802BC76FDADABD6 /* stream_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = stream_test.cc; sourceTree = ""; }; 5B96CC29E9946508F022859C /* Validation_BloomFilterTest_MD5_50000_0001_membership_test_result.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_50000_0001_membership_test_result.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_50000_0001_membership_test_result.json; sourceTree = ""; }; 5C68EE4CB94C0DD6E333F546 /* Validation_BloomFilterTest_MD5_1_01_membership_test_result.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_1_01_membership_test_result.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_1_01_membership_test_result.json; sourceTree = ""; }; @@ -1983,6 +2015,8 @@ 7EB299CF85034F09CFD6F3FD /* remote_document_cache_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = remote_document_cache_test.cc; sourceTree = ""; }; 84076EADF6872C78CDAC7291 /* bundle_builder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = bundle_builder.h; sourceTree = ""; }; 84434E57CA72951015FC71BC /* Pods-Firestore_FuzzTests_iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Firestore_FuzzTests_iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Firestore_FuzzTests_iOS/Pods-Firestore_FuzzTests_iOS.debug.xcconfig"; sourceTree = ""; }; + 861684E49DAC993D153E60D0 /* PipelineTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PipelineTests.swift; sourceTree = ""; }; + 86C7F725E6E1DA312807D8D3 /* explain_stats.pb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = explain_stats.pb.h; sourceTree = ""; }; 872C92ABD71B12784A1C5520 /* async_testing.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = async_testing.cc; sourceTree = ""; }; 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 87553338E42B8ECA05BA987E /* grpc_stream_tester.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = grpc_stream_tester.cc; sourceTree = ""; }; @@ -2014,6 +2048,7 @@ A20BAA3D2F994384279727EC /* md5_testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = md5_testing.h; sourceTree = ""; }; A2E6F09AD1EE0A6A452E9A08 /* bloom_filter_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = bloom_filter_test.cc; sourceTree = ""; }; A366F6AE1A5A77548485C091 /* bundle.pb.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = bundle.pb.cc; sourceTree = ""; }; + A4192EB032E23129EF23605A /* field_behavior.pb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_behavior.pb.h; sourceTree = ""; }; A5466E7809AD2871FFDE6C76 /* view_testing.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = view_testing.cc; sourceTree = ""; }; A5D9044B72061CAF284BC9E4 /* Validation_BloomFilterTest_MD5_50000_0001_bloom_filter_proto.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_50000_0001_bloom_filter_proto.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_50000_0001_bloom_filter_proto.json; sourceTree = ""; }; A5FA86650A18F3B7A8162287 /* Pods-Firestore_Benchmarks_iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Firestore_Benchmarks_iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Firestore_Benchmarks_iOS/Pods-Firestore_Benchmarks_iOS.release.xcconfig"; sourceTree = ""; }; @@ -2088,6 +2123,7 @@ D0A6E9136804A41CEC9D55D4 /* delayed_constructor_test.cc */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.cpp; path = delayed_constructor_test.cc; sourceTree = ""; }; D22D4C211AC32E4F8B4883DA /* Validation_BloomFilterTest_MD5_500_0001_bloom_filter_proto.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = Validation_BloomFilterTest_MD5_500_0001_bloom_filter_proto.json; path = bloom_filter_golden_test_data/Validation_BloomFilterTest_MD5_500_0001_bloom_filter_proto.json; sourceTree = ""; }; D3CC3DC5338DCAF43A211155 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; + D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */ = {isa = PBXFileReference; includeInIndex = 1; path = pipeline.pb.cc; sourceTree = ""; }; D5B2593BCB52957D62F1C9D3 /* perf_spec_test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = perf_spec_test.json; sourceTree = ""; }; D5B25E7E7D6873CBA4571841 /* FIRNumericTransformTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FIRNumericTransformTests.mm; sourceTree = ""; }; D7DF4A6F740086A2D8C0E28E /* Pods_Firestore_Tests_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Firestore_Tests_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -2272,6 +2308,8 @@ 124C932B22C1642C00CA8C2D /* CodableIntegrationTests.swift */, 3355BE9391CC4857AF0BDAE3 /* DatabaseTests.swift */, 62E54B832A9E910A003347C8 /* IndexingTests.swift */, + 59BF06E5A4988F9F949DD871 /* PipelineApiTests.swift */, + 861684E49DAC993D153E60D0 /* PipelineTests.swift */, 621D620928F9CE7400D2FA26 /* QueryIntegrationTests.swift */, 4D65F6E69993611D47DC8E7C /* SnapshotListenerSourceTests.swift */, EFF22EA92C5060A4009A369B /* VectorIntegrationTests.swift */, @@ -2310,8 +2348,12 @@ 544129D121C2DDC800EFB9CC /* common.pb.h */, 544129D821C2DDC800EFB9CC /* document.pb.cc */, 544129D721C2DDC800EFB9CC /* document.pb.h */, + 428662F00938E9E21F7080D7 /* explain_stats.pb.cc */, + 86C7F725E6E1DA312807D8D3 /* explain_stats.pb.h */, 544129D421C2DDC800EFB9CC /* firestore.pb.cc */, 544129D321C2DDC800EFB9CC /* firestore.pb.h */, + D49E7AEE500651D25C5360C3 /* pipeline.pb.cc */, + 15249D092D85B40EFC8A1459 /* pipeline.pb.h */, 544129D621C2DDC800EFB9CC /* query.pb.cc */, 544129D021C2DDC800EFB9CC /* query.pb.h */, 544129D921C2DDC800EFB9CC /* write.pb.cc */, @@ -2561,6 +2603,7 @@ 544A20ED20F6C046004E52CD /* API */, 5495EB012040E90200EBA509 /* Codable */, 124C932A22C1635300CA8C2D /* Integration */, + C7D3D622BB13EB3C3301DA4F /* TestHelper */, 620C1427763BA5D3CCFB5A1F /* BridgingHeader.h */, 54C9EDF52040E16300A969CD /* Info.plist */, ); @@ -2778,6 +2821,8 @@ children = ( 618BBE9520B89AAC00B5BCE7 /* annotations.pb.cc */, 618BBE9620B89AAC00B5BCE7 /* annotations.pb.h */, + 1F78CD3208A1D5885B4C134E /* field_behavior.pb.cc */, + A4192EB032E23129EF23605A /* field_behavior.pb.h */, 618BBE9720B89AAC00B5BCE7 /* http.pb.cc */, 618BBE9420B89AAC00B5BCE7 /* http.pb.h */, 1C3F7302BF4AE6CBC00ECDD0 /* resource.pb.cc */, @@ -2938,6 +2983,14 @@ path = core; sourceTree = ""; }; + C7D3D622BB13EB3C3301DA4F /* TestHelper */ = { + isa = PBXGroup; + children = ( + 0E73D03B9C02CAC7BEBAFA86 /* TestHelper.swift */, + ); + name = TestHelper; + sourceTree = ""; + }; DAFF0CF621E64AC30062958F /* macOS */ = { isa = PBXGroup; children = ( @@ -4227,8 +4280,10 @@ AC6C1E57B18730428CB15E03 /* executor_libdispatch_test.mm in Sources */, E7D415B8717701B952C344E5 /* executor_std_test.cc in Sources */, 470A37727BBF516B05ED276A /* executor_test.cc in Sources */, + 2F72DBE2EC6E24A81C69DEF0 /* explain_stats.pb.cc in Sources */, 2E0BBA7E627EB240BA11B0D0 /* exponential_backoff_test.cc in Sources */, 9009C285F418EA80C46CF06B /* fake_target_metadata_provider.cc in Sources */, + 7B58861D0978827BC4CB1DFA /* field_behavior.pb.cc in Sources */, 2E373EA9D5FF8C6DE2507675 /* field_index_test.cc in Sources */, 07B1E8C62772758BC82FEBEE /* field_mask_test.cc in Sources */, D9366A834BFF13246DC3AF9E /* field_path_test.cc in Sources */, @@ -4304,6 +4359,7 @@ BE1D7C7E413449AFFBA21BCB /* overlay_test.cc in Sources */, DB7E9C5A59CCCDDB7F0C238A /* path_test.cc in Sources */, E30BF9E316316446371C956C /* persistence_testing.cc in Sources */, + 60DA778E447F9ACD402FDA2F /* pipeline.pb.cc in Sources */, 0455FC6E2A281BD755FD933A /* precondition_test.cc in Sources */, 5ECE040F87E9FCD0A5D215DB /* pretty_printing_test.cc in Sources */, 938F2AF6EC5CD0B839300DB0 /* query.pb.cc in Sources */, @@ -4450,8 +4506,10 @@ B220E091D8F4E6DE1EA44F57 /* executor_libdispatch_test.mm in Sources */, BAB43C839445782040657239 /* executor_std_test.cc in Sources */, 3A7CB01751697ED599F2D9A1 /* executor_test.cc in Sources */, + 7CAF0E8C47FB2DD486240D47 /* explain_stats.pb.cc in Sources */, EF3518F84255BAF3EBD317F6 /* exponential_backoff_test.cc in Sources */, 4DAFC3A3FD5E96910A517320 /* fake_target_metadata_provider.cc in Sources */, + E9BC6A5BC2B209B1BA2F8BD6 /* field_behavior.pb.cc in Sources */, 69D3AD697D1A7BF803A08160 /* field_index_test.cc in Sources */, ED4E2AC80CAF2A8FDDAC3DEE /* field_mask_test.cc in Sources */, 41EAC526C543064B8F3F7EDA /* field_path_test.cc in Sources */, @@ -4527,6 +4585,7 @@ 2045517602D767BD01EA71D9 /* overlay_test.cc in Sources */, 0963F6D7B0F9AE1E24B82866 /* path_test.cc in Sources */, 92D7081085679497DC112EDB /* persistence_testing.cc in Sources */, + 8429E18EFBAF473209731E01 /* pipeline.pb.cc in Sources */, 152543FD706D5E8851C8DA92 /* precondition_test.cc in Sources */, 2639ABDA17EECEB7F62D1D83 /* pretty_printing_test.cc in Sources */, 5FA3DB52A478B01384D3A2ED /* query.pb.cc in Sources */, @@ -4649,8 +4708,11 @@ 432056C4D1259F76C80FC2A8 /* FSTUserDataReaderTests.mm in Sources */, 3B1E27D951407FD237E64D07 /* FirestoreEncoderTests.swift in Sources */, 62E54B862A9E910B003347C8 /* IndexingTests.swift in Sources */, + 3D5F7AA7BB68529F47BE4B12 /* PipelineApiTests.swift in Sources */, + 655F8647F57E5F2155DFF7B5 /* PipelineTests.swift in Sources */, 621D620C28F9CE7400D2FA26 /* QueryIntegrationTests.swift in Sources */, 1CFBD4563960D8A20C4679A3 /* SnapshotListenerSourceTests.swift in Sources */, + EE4C4BE7F93366AE6368EE02 /* TestHelper.swift in Sources */, EFF22EAC2C5060A4009A369B /* VectorIntegrationTests.swift in Sources */, 4D42E5C756229C08560DD731 /* XCTestCase+Await.mm in Sources */, 09BE8C01EC33D1FD82262D5D /* aggregate_query_test.cc in Sources */, @@ -4697,8 +4759,10 @@ 5F6CE37B34C542704C5605A4 /* executor_libdispatch_test.mm in Sources */, AECCD9663BB3DC52199F954A /* executor_std_test.cc in Sources */, 18F644E6AA98E6D6F3F1F809 /* executor_test.cc in Sources */, + ABE599C3BF9FB6AFF18AA901 /* explain_stats.pb.cc in Sources */, 6938575C8B5E6FE0D562547A /* exponential_backoff_test.cc in Sources */, 258B372CF33B7E7984BBA659 /* fake_target_metadata_provider.cc in Sources */, + 2FC2B732841BF2C425EB35DF /* field_behavior.pb.cc in Sources */, F8BD2F61EFA35C2D5120D9EB /* field_index_test.cc in Sources */, F272A8C41D2353700A11D1FB /* field_mask_test.cc in Sources */, AF6D6C47F9A25C65BFDCBBA0 /* field_path_test.cc in Sources */, @@ -4774,6 +4838,7 @@ A5583822218F9D5B1E86FCAC /* overlay_test.cc in Sources */, 70A171FC43BE328767D1B243 /* path_test.cc in Sources */, EECC1EC64CA963A8376FA55C /* persistence_testing.cc in Sources */, + 5CDD24225992674A4D3E3D4E /* pipeline.pb.cc in Sources */, 34D69886DAD4A2029BFC5C63 /* precondition_test.cc in Sources */, F56E9334642C207D7D85D428 /* pretty_printing_test.cc in Sources */, 22A00AC39CAB3426A943E037 /* query.pb.cc in Sources */, @@ -4896,8 +4961,11 @@ 75A176239B37354588769206 /* FSTUserDataReaderTests.mm in Sources */, 5E89B1A5A5430713C79C4854 /* FirestoreEncoderTests.swift in Sources */, 62E54B852A9E910B003347C8 /* IndexingTests.swift in Sources */, + DF6FBE5BBD578B0DD34CEFA1 /* PipelineApiTests.swift in Sources */, + C8C2B945D84DD98391145F3F /* PipelineTests.swift in Sources */, 621D620B28F9CE7400D2FA26 /* QueryIntegrationTests.swift in Sources */, A0BC30D482B0ABD1A3A24CDC /* SnapshotListenerSourceTests.swift in Sources */, + A78366DBE0BFDE42474A728A /* TestHelper.swift in Sources */, EFF22EAB2C5060A4009A369B /* VectorIntegrationTests.swift in Sources */, 736C4E82689F1CA1859C4A3F /* XCTestCase+Await.mm in Sources */, 412BE974741729A6683C386F /* aggregate_query_test.cc in Sources */, @@ -4944,8 +5012,10 @@ 49C593017B5438B216FAF593 /* executor_libdispatch_test.mm in Sources */, 17DFF30CF61D87883986E8B6 /* executor_std_test.cc in Sources */, 814724DE70EFC3DDF439CD78 /* executor_test.cc in Sources */, + A296B0110550890E1D8D59A3 /* explain_stats.pb.cc in Sources */, BD6CC8614970A3D7D2CF0D49 /* exponential_backoff_test.cc in Sources */, 4D2655C5675D83205C3749DC /* fake_target_metadata_provider.cc in Sources */, + FB462B2C6D3C167DF32BA0E1 /* field_behavior.pb.cc in Sources */, 50C852E08626CFA7DC889EEA /* field_index_test.cc in Sources */, A1563EFEB021936D3FFE07E3 /* field_mask_test.cc in Sources */, B235E260EA0DCB7BAC04F69B /* field_path_test.cc in Sources */, @@ -5021,6 +5091,7 @@ D1BCDAEACF6408200DFB9870 /* overlay_test.cc in Sources */, B3A309CCF5D75A555C7196E1 /* path_test.cc in Sources */, 46EAC2828CD942F27834F497 /* persistence_testing.cc in Sources */, + D64792BBFA130E26CB3D1028 /* pipeline.pb.cc in Sources */, 9EE1447AA8E68DF98D0590FF /* precondition_test.cc in Sources */, F6079BFC9460B190DA85C2E6 /* pretty_printing_test.cc in Sources */, 7B0F073BDB6D0D6E542E23D4 /* query.pb.cc in Sources */, @@ -5177,8 +5248,10 @@ B6FB468E208F9BAB00554BA2 /* executor_libdispatch_test.mm in Sources */, B6FB468F208F9BAE00554BA2 /* executor_std_test.cc in Sources */, B6FB4690208F9BB300554BA2 /* executor_test.cc in Sources */, + DDC782CBA37AA9B0EA373B7A /* explain_stats.pb.cc in Sources */, B6D1B68520E2AB1B00B35856 /* exponential_backoff_test.cc in Sources */, FAE5DA6ED3E1842DC21453EE /* fake_target_metadata_provider.cc in Sources */, + F21A3E06BBEC807FADB43AAF /* field_behavior.pb.cc in Sources */, 03AEB9E07A605AE1B5827548 /* field_index_test.cc in Sources */, 549CCA5720A36E1F00BCEB75 /* field_mask_test.cc in Sources */, B686F2AF2023DDEE0028D6BE /* field_path_test.cc in Sources */, @@ -5254,6 +5327,7 @@ 4D20563D846FA0F3BEBFDE9D /* overlay_test.cc in Sources */, 5A080105CCBFDB6BF3F3772D /* path_test.cc in Sources */, 21C17F15579341289AD01051 /* persistence_testing.cc in Sources */, + C8889F3C37F1CC3E64558287 /* pipeline.pb.cc in Sources */, 549CCA5920A36E1F00BCEB75 /* precondition_test.cc in Sources */, 6A94393D83EB338DFAF6A0D2 /* pretty_printing_test.cc in Sources */, 544129DC21C2DDC800EFB9CC /* query.pb.cc in Sources */, @@ -5395,8 +5469,11 @@ F5BDECEB3B43BD1591EEADBD /* FSTUserDataReaderTests.mm in Sources */, 6F45846C159D3C063DBD3CBE /* FirestoreEncoderTests.swift in Sources */, 62E54B842A9E910B003347C8 /* IndexingTests.swift in Sources */, + BD74B0E1FC752236A7376BC3 /* PipelineApiTests.swift in Sources */, + E04CB0D580980748D5DC453F /* PipelineTests.swift in Sources */, 621D620A28F9CE7400D2FA26 /* QueryIntegrationTests.swift in Sources */, B00F8D1819EE20C45B660940 /* SnapshotListenerSourceTests.swift in Sources */, + AD34726BFD3461FF64BBD56D /* TestHelper.swift in Sources */, EFF22EAA2C5060A4009A369B /* VectorIntegrationTests.swift in Sources */, 5492E0442021457E00B64F25 /* XCTestCase+Await.mm in Sources */, B04E4FE20930384DF3A402F9 /* aggregate_query_test.cc in Sources */, @@ -5443,8 +5520,10 @@ B6BF6EFEF887B072068BA658 /* executor_libdispatch_test.mm in Sources */, 125B1048ECB755C2106802EB /* executor_std_test.cc in Sources */, DABB9FB61B1733F985CBF713 /* executor_test.cc in Sources */, + E9071BE412DC42300B936BAF /* explain_stats.pb.cc in Sources */, 7BCF050BA04537B0E7D44730 /* exponential_backoff_test.cc in Sources */, BA1C5EAE87393D8E60F5AE6D /* fake_target_metadata_provider.cc in Sources */, + 3A110ECBF96B6E44BA77011A /* field_behavior.pb.cc in Sources */, 84285C3F63D916A4786724A8 /* field_index_test.cc in Sources */, 6A40835DB2C02B9F07C02E88 /* field_mask_test.cc in Sources */, D00E69F7FDF2BE674115AD3F /* field_path_test.cc in Sources */, @@ -5520,6 +5599,7 @@ 4D7900401B1BF3D3C24DDC7E /* overlay_test.cc in Sources */, 6105A1365831B79A7DEEA4F3 /* path_test.cc in Sources */, CB8BEF34CC4A996C7BE85119 /* persistence_testing.cc in Sources */, + BC9966788F245D79A63C2E47 /* pipeline.pb.cc in Sources */, 4194B7BB8B0352E1AC5D69B9 /* precondition_test.cc in Sources */, 0EA40EDACC28F445F9A3F32F /* pretty_printing_test.cc in Sources */, 63B91FC476F3915A44F00796 /* query.pb.cc in Sources */, diff --git a/Firestore/Example/Firestore.xcodeproj/xcshareddata/xcschemes/Firestore_IntegrationTests_macOS.xcscheme b/Firestore/Example/Firestore.xcodeproj/xcshareddata/xcschemes/Firestore_IntegrationTests_macOS.xcscheme index 809a72983a5..b6e7d07944b 100644 --- a/Firestore/Example/Firestore.xcodeproj/xcshareddata/xcschemes/Firestore_IntegrationTests_macOS.xcscheme +++ b/Firestore/Example/Firestore.xcodeproj/xcshareddata/xcschemes/Firestore_IntegrationTests_macOS.xcscheme @@ -27,6 +27,15 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + @@ -39,17 +48,6 @@ - - - - - - - - +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/extension_set.h" +#include "google/protobuf/wire_format_lite.h" +#include "google/protobuf/descriptor.h" +#include "google/protobuf/generated_message_reflection.h" +#include "google/protobuf/reflection_ops.h" +#include "google/protobuf/wire_format.h" +#include "google/protobuf/generated_message_tctable_impl.h" +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" +PROTOBUF_PRAGMA_INIT_SEG +namespace _pb = ::google::protobuf; +namespace _pbi = ::google::protobuf::internal; +namespace _fl = ::google::protobuf::internal::field_layout; +namespace google { +namespace api { +} // namespace api +} // namespace google +static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2fapi_2ffield_5fbehavior_2eproto[1]; +static constexpr const ::_pb::ServiceDescriptor** + file_level_service_descriptors_google_2fapi_2ffield_5fbehavior_2eproto = nullptr; +const ::uint32_t TableStruct_google_2fapi_2ffield_5fbehavior_2eproto::offsets[1] = {}; +static constexpr ::_pbi::MigrationSchema* schemas = nullptr; +static constexpr ::_pb::Message* const* file_default_instances = nullptr; +const char descriptor_table_protodef_google_2fapi_2ffield_5fbehavior_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + "\n\037google/api/field_behavior.proto\022\ngoogl" + "e.api\032 google/protobuf/descriptor.proto*" + "\266\001\n\rFieldBehavior\022\036\n\032FIELD_BEHAVIOR_UNSP" + "ECIFIED\020\000\022\014\n\010OPTIONAL\020\001\022\014\n\010REQUIRED\020\002\022\017\n" + "\013OUTPUT_ONLY\020\003\022\016\n\nINPUT_ONLY\020\004\022\r\n\tIMMUTA" + "BLE\020\005\022\022\n\016UNORDERED_LIST\020\006\022\025\n\021NON_EMPTY_D" + "EFAULT\020\007\022\016\n\nIDENTIFIER\020\010:U\n\016field_behavi" + "or\022\035.google.protobuf.FieldOptions\030\234\010 \003(\016" + "2\031.google.api.FieldBehaviorB\002\020\000Bp\n\016com.g" + "oogle.apiB\022FieldBehaviorProtoP\001ZAgoogle." + "golang.org/genproto/googleapis/api/annot" + "ations;annotations\242\002\004GAPIb\006proto3" +}; +static const ::_pbi::DescriptorTable* const descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto_deps[1] = + { + &::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto, +}; +static ::absl::once_flag descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto_once; +const ::_pbi::DescriptorTable descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto = { + false, + false, + 473, + descriptor_table_protodef_google_2fapi_2ffield_5fbehavior_2eproto, + "google/api/field_behavior.proto", + &descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto_once, + descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto_deps, + 1, + 0, + schemas, + file_default_instances, + TableStruct_google_2fapi_2ffield_5fbehavior_2eproto::offsets, + nullptr, + file_level_enum_descriptors_google_2fapi_2ffield_5fbehavior_2eproto, + file_level_service_descriptors_google_2fapi_2ffield_5fbehavior_2eproto, +}; + +// This function exists to be marked as weak. +// It can significantly speed up compilation by breaking up LLVM's SCC +// in the .pb.cc translation units. Large translation units see a +// reduction of more than 35% of walltime for optimized builds. Without +// the weak attribute all the messages in the file, including all the +// vtables and everything they use become part of the same SCC through +// a cycle like: +// GetMetadata -> descriptor table -> default instances -> +// vtables -> GetMetadata +// By adding a weak function here we break the connection from the +// individual vtables back into the descriptor table. +PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto_getter() { + return &descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto; +} +// Force running AddDescriptors() at dynamic initialization time. +PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 +static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fapi_2ffield_5fbehavior_2eproto(&descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto); +namespace google { +namespace api { +const ::google::protobuf::EnumDescriptor* FieldBehavior_descriptor() { + ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto); + return file_level_enum_descriptors_google_2fapi_2ffield_5fbehavior_2eproto[0]; +} +PROTOBUF_CONSTINIT const uint32_t FieldBehavior_internal_data_[] = { + 589824u, 0u, }; +bool FieldBehavior_IsValid(int value) { + return 0 <= value && value <= 8; +} +PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 ::google::protobuf::internal::ExtensionIdentifier< ::google::protobuf::FieldOptions, + ::google::protobuf::internal::RepeatedEnumTypeTraits< ::google::api::FieldBehavior, ::google::api::FieldBehavior_IsValid>, 14, false> + field_behavior(kFieldBehaviorFieldNumber, static_cast< ::google::api::FieldBehavior >(0), nullptr); +// @@protoc_insertion_point(namespace_scope) +} // namespace api +} // namespace google +namespace google { +namespace protobuf { +} // namespace protobuf +} // namespace google +// @@protoc_insertion_point(global_scope) +#include "google/protobuf/port_undef.inc" diff --git a/Firestore/Protos/cpp/google/api/field_behavior.pb.h b/Firestore/Protos/cpp/google/api/field_behavior.pb.h new file mode 100644 index 00000000000..e04739e7ce7 --- /dev/null +++ b/Firestore/Protos/cpp/google/api/field_behavior.pb.h @@ -0,0 +1,168 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/api/field_behavior.proto +// Protobuf C++ Version: 4.25.1 + +#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fapi_2ffield_5fbehavior_2eproto_2epb_2eh +#define GOOGLE_PROTOBUF_INCLUDED_google_2fapi_2ffield_5fbehavior_2eproto_2epb_2eh + +#include +#include +#include +#include + +#include "google/protobuf/port_def.inc" +#if PROTOBUF_VERSION < 4025000 +#error "This file was generated by a newer version of protoc which is" +#error "incompatible with your Protocol Buffer headers. Please update" +#error "your headers." +#endif // PROTOBUF_VERSION + +#if 4025001 < PROTOBUF_MIN_PROTOC_VERSION +#error "This file was generated by an older version of protoc which is" +#error "incompatible with your Protocol Buffer headers. Please" +#error "regenerate this file with a newer version of protoc." +#endif // PROTOBUF_MIN_PROTOC_VERSION +#include "google/protobuf/port_undef.inc" +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/arena.h" +#include "google/protobuf/arenastring.h" +#include "google/protobuf/generated_message_tctable_decl.h" +#include "google/protobuf/generated_message_util.h" +#include "google/protobuf/metadata_lite.h" +#include "google/protobuf/generated_message_reflection.h" +#include "google/protobuf/repeated_field.h" // IWYU pragma: export +#include "google/protobuf/extension_set.h" // IWYU pragma: export +#include "google/protobuf/generated_enum_reflection.h" +#include "google/protobuf/descriptor.pb.h" +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" + +#define PROTOBUF_INTERNAL_EXPORT_google_2fapi_2ffield_5fbehavior_2eproto + +namespace google { +namespace protobuf { +namespace internal { +class AnyMetadata; +} // namespace internal +} // namespace protobuf +} // namespace google + +// Internal implementation detail -- do not use these members. +struct TableStruct_google_2fapi_2ffield_5fbehavior_2eproto { + static const ::uint32_t offsets[]; +}; +extern const ::google::protobuf::internal::DescriptorTable + descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto; +namespace google { +namespace protobuf { +} // namespace protobuf +} // namespace google + +namespace google { +namespace api { +enum FieldBehavior : int { + FIELD_BEHAVIOR_UNSPECIFIED = 0, + OPTIONAL = 1, + REQUIRED = 2, + OUTPUT_ONLY = 3, + INPUT_ONLY = 4, + IMMUTABLE = 5, + UNORDERED_LIST = 6, + NON_EMPTY_DEFAULT = 7, + IDENTIFIER = 8, + FieldBehavior_INT_MIN_SENTINEL_DO_NOT_USE_ = + std::numeric_limits<::int32_t>::min(), + FieldBehavior_INT_MAX_SENTINEL_DO_NOT_USE_ = + std::numeric_limits<::int32_t>::max(), +}; + +bool FieldBehavior_IsValid(int value); +extern const uint32_t FieldBehavior_internal_data_[]; +constexpr FieldBehavior FieldBehavior_MIN = static_cast(0); +constexpr FieldBehavior FieldBehavior_MAX = static_cast(8); +constexpr int FieldBehavior_ARRAYSIZE = 8 + 1; +const ::google::protobuf::EnumDescriptor* +FieldBehavior_descriptor(); +template +const std::string& FieldBehavior_Name(T value) { + static_assert(std::is_same::value || + std::is_integral::value, + "Incorrect type passed to FieldBehavior_Name()."); + return FieldBehavior_Name(static_cast(value)); +} +template <> +inline const std::string& FieldBehavior_Name(FieldBehavior value) { + return ::google::protobuf::internal::NameOfDenseEnum( + static_cast(value)); +} +inline bool FieldBehavior_Parse(absl::string_view name, FieldBehavior* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FieldBehavior_descriptor(), name, value); +} + +// =================================================================== + + + +// =================================================================== + + + +static const int kFieldBehaviorFieldNumber = 1052; +extern ::google::protobuf::internal::ExtensionIdentifier< ::google::protobuf::FieldOptions, + ::google::protobuf::internal::RepeatedEnumTypeTraits< ::google::api::FieldBehavior, ::google::api::FieldBehavior_IsValid>, 14, false > + field_behavior; + +// =================================================================== + + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif // __GNUC__ + +// @@protoc_insertion_point(namespace_scope) +} // namespace api +} // namespace google + + +namespace google { +namespace protobuf { + +template <> +struct is_proto_enum<::google::api::FieldBehavior> : std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor<::google::api::FieldBehavior>() { + return ::google::api::FieldBehavior_descriptor(); +} + +} // namespace protobuf +} // namespace google + +// @@protoc_insertion_point(global_scope) + +#include "google/protobuf/port_undef.inc" + +#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fapi_2ffield_5fbehavior_2eproto_2epb_2eh diff --git a/Firestore/Protos/cpp/google/api/http.pb.cc b/Firestore/Protos/cpp/google/api/http.pb.cc index 3964f8fc33e..c6a9fa49c1b 100644 --- a/Firestore/Protos/cpp/google/api/http.pb.cc +++ b/Firestore/Protos/cpp/google/api/http.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/api/http.pb.h b/Firestore/Protos/cpp/google/api/http.pb.h index 54c6bad8167..bc1f7426a3c 100644 --- a/Firestore/Protos/cpp/google/api/http.pb.h +++ b/Firestore/Protos/cpp/google/api/http.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/api/resource.pb.cc b/Firestore/Protos/cpp/google/api/resource.pb.cc index fd34f4f0934..2ea1c7562ff 100644 --- a/Firestore/Protos/cpp/google/api/resource.pb.cc +++ b/Firestore/Protos/cpp/google/api/resource.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/api/resource.pb.h b/Firestore/Protos/cpp/google/api/resource.pb.h index 458c078fb57..de855a0a335 100644 --- a/Firestore/Protos/cpp/google/api/resource.pb.h +++ b/Firestore/Protos/cpp/google/api/resource.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/admin/index.pb.cc b/Firestore/Protos/cpp/google/firestore/admin/index.pb.cc index 9e7a2a53d6a..d0ee81c51aa 100644 --- a/Firestore/Protos/cpp/google/firestore/admin/index.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/admin/index.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/admin/index.pb.h b/Firestore/Protos/cpp/google/firestore/admin/index.pb.h index 6095d8eba33..474abbd3b56 100644 --- a/Firestore/Protos/cpp/google/firestore/admin/index.pb.h +++ b/Firestore/Protos/cpp/google/firestore/admin/index.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.cc index 2b6366af7fa..1302ce50dff 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.h b/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.h index 26750c24e40..604f7d4d266 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.h +++ b/Firestore/Protos/cpp/google/firestore/v1/aggregation_result.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.cc index f3ad4ff4ae2..850d8b10da2 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.h b/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.h index e4e2fa8331b..69d2b086157 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.h +++ b/Firestore/Protos/cpp/google/firestore/v1/bloom_filter.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/common.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/common.pb.cc index f3113c8ed9c..c92596182be 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/common.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/v1/common.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/common.pb.h b/Firestore/Protos/cpp/google/firestore/v1/common.pb.h index 814ed5c9723..45e09440cc3 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/common.pb.h +++ b/Firestore/Protos/cpp/google/firestore/v1/common.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/document.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/document.pb.cc index 3167a814ee4..8f299b1a166 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/document.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/v1/document.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,6 +59,41 @@ struct ArrayValueDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ArrayValueDefaultTypeInternal _ArrayValue_default_instance_; +inline constexpr Function::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : args_{}, + options_{}, + name_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + _cached_size_{0} {} + +template +PROTOBUF_CONSTEXPR Function::Function(::_pbi::ConstantInitialized) + : _impl_(::_pbi::ConstantInitialized()) {} +struct FunctionDefaultTypeInternal { + PROTOBUF_CONSTEXPR FunctionDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~FunctionDefaultTypeInternal() {} + union { + Function _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FunctionDefaultTypeInternal _Function_default_instance_; + template +PROTOBUF_CONSTEXPR Function_OptionsEntry_DoNotUse::Function_OptionsEntry_DoNotUse(::_pbi::ConstantInitialized) {} +struct Function_OptionsEntry_DoNotUseDefaultTypeInternal { + PROTOBUF_CONSTEXPR Function_OptionsEntry_DoNotUseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~Function_OptionsEntry_DoNotUseDefaultTypeInternal() {} + union { + Function_OptionsEntry_DoNotUse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Function_OptionsEntry_DoNotUseDefaultTypeInternal _Function_OptionsEntry_DoNotUse_default_instance_; + inline constexpr MapValue::Impl_::Impl_( ::_pbi::ConstantInitialized) noexcept : fields_{}, @@ -90,6 +125,60 @@ struct MapValue_FieldsEntry_DoNotUseDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MapValue_FieldsEntry_DoNotUseDefaultTypeInternal _MapValue_FieldsEntry_DoNotUse_default_instance_; +inline constexpr Pipeline::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : stages_{}, + _cached_size_{0} {} + +template +PROTOBUF_CONSTEXPR Pipeline::Pipeline(::_pbi::ConstantInitialized) + : _impl_(::_pbi::ConstantInitialized()) {} +struct PipelineDefaultTypeInternal { + PROTOBUF_CONSTEXPR PipelineDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~PipelineDefaultTypeInternal() {} + union { + Pipeline _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 PipelineDefaultTypeInternal _Pipeline_default_instance_; + +inline constexpr Pipeline_Stage::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : args_{}, + options_{}, + name_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + _cached_size_{0} {} + +template +PROTOBUF_CONSTEXPR Pipeline_Stage::Pipeline_Stage(::_pbi::ConstantInitialized) + : _impl_(::_pbi::ConstantInitialized()) {} +struct Pipeline_StageDefaultTypeInternal { + PROTOBUF_CONSTEXPR Pipeline_StageDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~Pipeline_StageDefaultTypeInternal() {} + union { + Pipeline_Stage _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Pipeline_StageDefaultTypeInternal _Pipeline_Stage_default_instance_; + template +PROTOBUF_CONSTEXPR Pipeline_Stage_OptionsEntry_DoNotUse::Pipeline_Stage_OptionsEntry_DoNotUse(::_pbi::ConstantInitialized) {} +struct Pipeline_Stage_OptionsEntry_DoNotUseDefaultTypeInternal { + PROTOBUF_CONSTEXPR Pipeline_Stage_OptionsEntry_DoNotUseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~Pipeline_Stage_OptionsEntry_DoNotUseDefaultTypeInternal() {} + union { + Pipeline_Stage_OptionsEntry_DoNotUse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Pipeline_Stage_OptionsEntry_DoNotUseDefaultTypeInternal _Pipeline_Stage_OptionsEntry_DoNotUse_default_instance_; + inline constexpr Value::Impl_::Impl_( ::_pbi::ConstantInitialized) noexcept : value_type_{}, @@ -148,7 +237,7 @@ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT } // namespace v1 } // namespace firestore } // namespace google -static ::_pb::Metadata file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[6]; +static ::_pb::Metadata file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[11]; static constexpr const ::_pb::EnumDescriptor** file_level_enum_descriptors_google_2ffirestore_2fv1_2fdocument_2eproto = nullptr; static constexpr const ::_pb::ServiceDescriptor** @@ -202,6 +291,9 @@ const ::uint32_t TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto::offsets ::_pbi::kInvalidFieldOffsetTag, ::_pbi::kInvalidFieldOffsetTag, ::_pbi::kInvalidFieldOffsetTag, + ::_pbi::kInvalidFieldOffsetTag, + ::_pbi::kInvalidFieldOffsetTag, + ::_pbi::kInvalidFieldOffsetTag, PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Value, _impl_.value_type_), ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ArrayValue, _internal_metadata_), @@ -233,6 +325,61 @@ const ::uint32_t TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto::offsets ~0u, // no _split_ ~0u, // no sizeof(Split) PROTOBUF_FIELD_OFFSET(::google::firestore::v1::MapValue, _impl_.fields_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function_OptionsEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function_OptionsEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function_OptionsEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function_OptionsEntry_DoNotUse, value_), + 0, + 1, + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function, _impl_.name_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function, _impl_.args_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Function, _impl_.options_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage_OptionsEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage_OptionsEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage_OptionsEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage_OptionsEntry_DoNotUse, value_), + 0, + 1, + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage, _impl_.name_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage, _impl_.args_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline_Stage, _impl_.options_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::Pipeline, _impl_.stages_), }; static const ::_pbi::MigrationSchema @@ -240,9 +387,14 @@ static const ::_pbi::MigrationSchema {0, 10, -1, sizeof(::google::firestore::v1::Document_FieldsEntry_DoNotUse)}, {12, 24, -1, sizeof(::google::firestore::v1::Document)}, {28, -1, -1, sizeof(::google::firestore::v1::Value)}, - {48, -1, -1, sizeof(::google::firestore::v1::ArrayValue)}, - {57, 67, -1, sizeof(::google::firestore::v1::MapValue_FieldsEntry_DoNotUse)}, - {69, -1, -1, sizeof(::google::firestore::v1::MapValue)}, + {51, -1, -1, sizeof(::google::firestore::v1::ArrayValue)}, + {60, 70, -1, sizeof(::google::firestore::v1::MapValue_FieldsEntry_DoNotUse)}, + {72, -1, -1, sizeof(::google::firestore::v1::MapValue)}, + {81, 91, -1, sizeof(::google::firestore::v1::Function_OptionsEntry_DoNotUse)}, + {93, -1, -1, sizeof(::google::firestore::v1::Function)}, + {104, 114, -1, sizeof(::google::firestore::v1::Pipeline_Stage_OptionsEntry_DoNotUse)}, + {116, -1, -1, sizeof(::google::firestore::v1::Pipeline_Stage)}, + {127, -1, -1, sizeof(::google::firestore::v1::Pipeline)}, }; static const ::_pb::Message* const file_default_instances[] = { @@ -252,42 +404,66 @@ static const ::_pb::Message* const file_default_instances[] = { &::google::firestore::v1::_ArrayValue_default_instance_._instance, &::google::firestore::v1::_MapValue_FieldsEntry_DoNotUse_default_instance_._instance, &::google::firestore::v1::_MapValue_default_instance_._instance, + &::google::firestore::v1::_Function_OptionsEntry_DoNotUse_default_instance_._instance, + &::google::firestore::v1::_Function_default_instance_._instance, + &::google::firestore::v1::_Pipeline_Stage_OptionsEntry_DoNotUse_default_instance_._instance, + &::google::firestore::v1::_Pipeline_Stage_default_instance_._instance, + &::google::firestore::v1::_Pipeline_default_instance_._instance, }; const char descriptor_table_protodef_google_2ffirestore_2fv1_2fdocument_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { "\n\"google/firestore/v1/document.proto\022\023go" - "ogle.firestore.v1\032\034google/protobuf/struc" - "t.proto\032\037google/protobuf/timestamp.proto" - "\032\030google/type/latlng.proto\"\200\002\n\010Document\022" - "\014\n\004name\030\001 \001(\t\0229\n\006fields\030\002 \003(\0132).google.f" - "irestore.v1.Document.FieldsEntry\022/\n\013crea" - "te_time\030\003 \001(\0132\032.google.protobuf.Timestam" - "p\022/\n\013update_time\030\004 \001(\0132\032.google.protobuf" - ".Timestamp\032I\n\013FieldsEntry\022\013\n\003key\030\001 \001(\t\022)" - "\n\005value\030\002 \001(\0132\032.google.firestore.v1.Valu" - "e:\0028\001\"\256\003\n\005Value\0220\n\nnull_value\030\013 \001(\0162\032.go" - "ogle.protobuf.NullValueH\000\022\027\n\rboolean_val" - "ue\030\001 \001(\010H\000\022\027\n\rinteger_value\030\002 \001(\003H\000\022\026\n\014d" - "ouble_value\030\003 \001(\001H\000\0225\n\017timestamp_value\030\n" - " \001(\0132\032.google.protobuf.TimestampH\000\022\026\n\014st" - "ring_value\030\021 \001(\tH\000\022\025\n\013bytes_value\030\022 \001(\014H" - "\000\022\031\n\017reference_value\030\005 \001(\tH\000\022.\n\017geo_poin" - "t_value\030\010 \001(\0132\023.google.type.LatLngH\000\0226\n\013" - "array_value\030\t \001(\0132\037.google.firestore.v1." - "ArrayValueH\000\0222\n\tmap_value\030\006 \001(\0132\035.google" - ".firestore.v1.MapValueH\000B\014\n\nvalue_type\"8" - "\n\nArrayValue\022*\n\006values\030\001 \003(\0132\032.google.fi" - "restore.v1.Value\"\220\001\n\010MapValue\0229\n\006fields\030" - "\001 \003(\0132).google.firestore.v1.MapValue.Fie" - "ldsEntry\032I\n\013FieldsEntry\022\013\n\003key\030\001 \001(\t\022)\n\005" - "value\030\002 \001(\0132\032.google.firestore.v1.Value:" - "\0028\001B\261\001\n\027com.google.firestore.v1B\rDocumen" - "tProtoP\001Z_impl_.value_type_.map_value_; } +const ::google::firestore::v1::Function& Value::_Internal::function_value(const Value* msg) { + return *msg->_impl_.value_type_.function_value_; +} +const ::google::firestore::v1::Pipeline& Value::_Internal::pipeline_value(const Value* msg) { + return *msg->_impl_.value_type_.pipeline_value_; +} void Value::set_allocated_timestamp_value(::google::protobuf::Timestamp* timestamp_value) { ::google::protobuf::Arena* message_arena = GetArena(); clear_value_type(); @@ -790,6 +974,32 @@ void Value::set_allocated_map_value(::google::firestore::v1::MapValue* map_value } // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.Value.map_value) } +void Value::set_allocated_function_value(::google::firestore::v1::Function* function_value) { + ::google::protobuf::Arena* message_arena = GetArena(); + clear_value_type(); + if (function_value) { + ::google::protobuf::Arena* submessage_arena = function_value->GetArena(); + if (message_arena != submessage_arena) { + function_value = ::google::protobuf::internal::GetOwnedMessage(message_arena, function_value, submessage_arena); + } + set_has_function_value(); + _impl_.value_type_.function_value_ = function_value; + } + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.Value.function_value) +} +void Value::set_allocated_pipeline_value(::google::firestore::v1::Pipeline* pipeline_value) { + ::google::protobuf::Arena* message_arena = GetArena(); + clear_value_type(); + if (pipeline_value) { + ::google::protobuf::Arena* submessage_arena = pipeline_value->GetArena(); + if (message_arena != submessage_arena) { + pipeline_value = ::google::protobuf::internal::GetOwnedMessage(message_arena, pipeline_value, submessage_arena); + } + set_has_pipeline_value(); + _impl_.value_type_.pipeline_value_ = pipeline_value; + } + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.Value.pipeline_value) +} Value::Value(::google::protobuf::Arena* arena) : ::google::protobuf::Message(arena) { SharedCtor(arena); @@ -847,6 +1057,15 @@ Value::Value( case kMapValue: _impl_.value_type_.map_value_ = CreateMaybeMessage<::google::firestore::v1::MapValue>(arena, *from._impl_.value_type_.map_value_); break; + case kFieldReferenceValue: + new (&_impl_.value_type_.field_reference_value_) decltype(_impl_.value_type_.field_reference_value_){arena, from._impl_.value_type_.field_reference_value_}; + break; + case kFunctionValue: + _impl_.value_type_.function_value_ = CreateMaybeMessage<::google::firestore::v1::Function>(arena, *from._impl_.value_type_.function_value_); + break; + case kPipelineValue: + _impl_.value_type_.pipeline_value_ = CreateMaybeMessage<::google::firestore::v1::Pipeline>(arena, *from._impl_.value_type_.pipeline_value_); + break; } // @@protoc_insertion_point(copy_constructor:google.firestore.v1.Value) @@ -930,6 +1149,22 @@ void Value::clear_value_type() { } break; } + case kFieldReferenceValue: { + _impl_.value_type_.field_reference_value_.Destroy(); + break; + } + case kFunctionValue: { + if (GetArena() == nullptr) { + delete _impl_.value_type_.function_value_; + } + break; + } + case kPipelineValue: { + if (GetArena() == nullptr) { + delete _impl_.value_type_.pipeline_value_; + } + break; + } case VALUE_TYPE_NOT_SET: { break; } @@ -957,16 +1192,16 @@ const char* Value::_InternalParse( PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 -const ::_pbi::TcParseTable<0, 11, 4, 69, 2> Value::_table_ = { +const ::_pbi::TcParseTable<0, 14, 6, 90, 2> Value::_table_ = { { 0, // no _has_bits_ 0, // no _extensions_ - 18, 0, // max_field_number, fast_idx_mask + 21, 0, // max_field_number, fast_idx_mask offsetof(decltype(_table_), field_lookup_table), - 4294768712, // skipmap + 4292933704, // skipmap offsetof(decltype(_table_), field_entries), - 11, // num_field_entries - 4, // num_aux_entries + 14, // num_field_entries + 6, // num_aux_entries offsetof(decltype(_table_), aux_entries), &_Value_default_instance_._instance, ::_pbi::TcParser::GenericFallback, // fallback @@ -1008,16 +1243,28 @@ const ::_pbi::TcParseTable<0, 11, 4, 69, 2> Value::_table_ = { // bytes bytes_value = 18; {PROTOBUF_FIELD_OFFSET(Value, _impl_.value_type_.bytes_value_), _Internal::kOneofCaseOffset + 0, 0, (0 | ::_fl::kFcOneof | ::_fl::kBytes | ::_fl::kRepAString)}, + // string field_reference_value = 19; + {PROTOBUF_FIELD_OFFSET(Value, _impl_.value_type_.field_reference_value_), _Internal::kOneofCaseOffset + 0, 0, + (0 | ::_fl::kFcOneof | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // .google.firestore.v1.Function function_value = 20; + {PROTOBUF_FIELD_OFFSET(Value, _impl_.value_type_.function_value_), _Internal::kOneofCaseOffset + 0, 4, + (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, + // .google.firestore.v1.Pipeline pipeline_value = 21; + {PROTOBUF_FIELD_OFFSET(Value, _impl_.value_type_.pipeline_value_), _Internal::kOneofCaseOffset + 0, 5, + (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, }}, {{ {::_pbi::TcParser::GetTable<::google::firestore::v1::MapValue>()}, {::_pbi::TcParser::GetTable<::google::type::LatLng>()}, {::_pbi::TcParser::GetTable<::google::firestore::v1::ArrayValue>()}, {::_pbi::TcParser::GetTable<::google::protobuf::Timestamp>()}, + {::_pbi::TcParser::GetTable<::google::firestore::v1::Function>()}, + {::_pbi::TcParser::GetTable<::google::firestore::v1::Pipeline>()}, }}, {{ - "\31\0\0\0\17\0\0\0\0\0\14\0\0\0\0\0" + "\31\0\0\0\17\0\0\0\0\0\14\0\25\0\0\0" "google.firestore.v1.Value" "reference_value" "string_value" + "field_reference_value" }}, }; @@ -1096,6 +1343,25 @@ ::uint8_t* Value::_InternalSerialize( target = stream->WriteBytesMaybeAliased(18, _s, target); break; } + case kFieldReferenceValue: { + const std::string& _s = this->_internal_field_reference_value(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.Value.field_reference_value"); + target = stream->WriteStringMaybeAliased(19, _s, target); + break; + } + case kFunctionValue: { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 20, _Internal::function_value(this), + _Internal::function_value(this).GetCachedSize(), target, stream); + break; + } + case kPipelineValue: { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 21, _Internal::pipeline_value(this), + _Internal::pipeline_value(this).GetCachedSize(), target, stream); + break; + } default: break; } @@ -1181,6 +1447,24 @@ ::size_t Value::ByteSizeLong() const { 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.value_type_.map_value_); break; } + // string field_reference_value = 19; + case kFieldReferenceValue: { + total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize( + this->_internal_field_reference_value()); + break; + } + // .google.firestore.v1.Function function_value = 20; + case kFunctionValue: { + total_size += + 2 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.value_type_.function_value_); + break; + } + // .google.firestore.v1.Pipeline pipeline_value = 21; + case kPipelineValue: { + total_size += + 2 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.value_type_.pipeline_value_); + break; + } case VALUE_TYPE_NOT_SET: { break; } @@ -1253,6 +1537,20 @@ void Value::MergeImpl(::google::protobuf::Message& to_msg, const ::google::proto from._internal_map_value()); break; } + case kFieldReferenceValue: { + _this->_internal_set_field_reference_value(from._internal_field_reference_value()); + break; + } + case kFunctionValue: { + _this->_internal_mutable_function_value()->::google::firestore::v1::Function::MergeFrom( + from._internal_function_value()); + break; + } + case kPipelineValue: { + _this->_internal_mutable_pipeline_value()->::google::firestore::v1::Pipeline::MergeFrom( + from._internal_pipeline_value()); + break; + } case VALUE_TYPE_NOT_SET: { break; } @@ -1686,6 +1984,737 @@ ::google::protobuf::Metadata MapValue::GetMetadata() const { &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_once, file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[5]); } +// =================================================================== + +Function_OptionsEntry_DoNotUse::Function_OptionsEntry_DoNotUse() {} +Function_OptionsEntry_DoNotUse::Function_OptionsEntry_DoNotUse(::google::protobuf::Arena* arena) + : SuperType(arena) {} +::google::protobuf::Metadata Function_OptionsEntry_DoNotUse::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[6]); +} +// =================================================================== + +class Function::_Internal { + public: +}; + +Function::Function(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.Function) +} +inline PROTOBUF_NDEBUG_INLINE Function::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, + const Impl_& from) + : args_{visibility, arena, from.args_}, + options_{visibility, arena, from.options_}, + name_(arena, from.name_), + _cached_size_{0} {} + +Function::Function( + ::google::protobuf::Arena* arena, + const Function& from) + : ::google::protobuf::Message(arena) { + Function* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); + + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.Function) +} +inline PROTOBUF_NDEBUG_INLINE Function::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena) + : args_{visibility, arena}, + options_{visibility, arena}, + name_(arena), + _cached_size_{0} {} + +inline void Function::SharedCtor(::_pb::Arena* arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +Function::~Function() { + // @@protoc_insertion_point(destructor:google.firestore.v1.Function) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void Function::SharedDtor() { + ABSL_DCHECK(GetArena() == nullptr); + _impl_.name_.Destroy(); + _impl_.~Impl_(); +} + +PROTOBUF_NOINLINE void Function::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.Function) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.args_.Clear(); + _impl_.options_.Clear(); + _impl_.name_.ClearToEmpty(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* Function::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 3, 3, 48, 2> Function::_table_ = { + { + 0, // no _has_bits_ + 0, // no _extensions_ + 3, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_Function_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + {::_pbi::TcParser::FastMtR1, + {18, 63, 0, PROTOBUF_FIELD_OFFSET(Function, _impl_.args_)}}, + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + {::_pbi::TcParser::FastUS1, + {10, 63, 0, PROTOBUF_FIELD_OFFSET(Function, _impl_.name_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + {PROTOBUF_FIELD_OFFSET(Function, _impl_.name_), 0, 0, + (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + {PROTOBUF_FIELD_OFFSET(Function, _impl_.args_), 0, 0, + (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + {PROTOBUF_FIELD_OFFSET(Function, _impl_.options_), 0, 1, + (0 | ::_fl::kFcRepeated | ::_fl::kMap)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::firestore::v1::Value>()}, + {::_pbi::TcParser::GetMapAuxInfo< + decltype(Function()._impl_.options_)>( + 1, 0, 0, 9, + 11)}, + {::_pbi::TcParser::CreateInArenaStorageCb<::google::firestore::v1::Value>}, + }}, {{ + "\34\4\0\7\0\0\0\0" + "google.firestore.v1.Function" + "name" + "options" + }}, +}; + +::uint8_t* Function::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.Function) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + if (!this->_internal_name().empty()) { + const std::string& _s = this->_internal_name(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.Function.name"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + for (unsigned i = 0, + n = static_cast(this->_internal_args_size()); i < n; i++) { + const auto& repfield = this->_internal_args().Get(i); + target = ::google::protobuf::internal::WireFormatLite:: + InternalWriteMessage(2, repfield, repfield.GetCachedSize(), target, stream); + } + + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + if (!_internal_options().empty()) { + using MapType = ::google::protobuf::Map; + using WireHelper = _pbi::MapEntryFuncs; + const auto& field = _internal_options(); + + if (stream->IsSerializationDeterministic() && field.size() > 1) { + for (const auto& entry : ::google::protobuf::internal::MapSorterPtr(field)) { + target = WireHelper::InternalSerialize( + 3, entry.first, entry.second, target, stream); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + entry.first.data(), static_cast(entry.first.length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.Function.options"); + } + } else { + for (const auto& entry : field) { + target = WireHelper::InternalSerialize( + 3, entry.first, entry.second, target, stream); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + entry.first.data(), static_cast(entry.first.length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.Function.options"); + } + } + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.Function) + return target; +} + +::size_t Function::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.Function) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + total_size += 1UL * this->_internal_args_size(); + for (const auto& msg : this->_internal_args()) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + total_size += 1 * ::google::protobuf::internal::FromIntSize(_internal_options_size()); + for (const auto& entry : _internal_options()) { + total_size += _pbi::MapEntryFuncs::ByteSizeLong(entry.first, entry.second); + } + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + if (!this->_internal_name().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this->_internal_name()); + } + + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData Function::_class_data_ = { + Function::MergeImpl, + nullptr, // OnDemandRegisterArenaDtor +}; +const ::google::protobuf::Message::ClassData* Function::GetClassData() const { + return &_class_data_; +} + +void Function::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.Function) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + _this->_internal_mutable_args()->MergeFrom( + from._internal_args()); + _this->_impl_.options_.MergeFrom(from._impl_.options_); + if (!from._internal_name().empty()) { + _this->_internal_set_name(from._internal_name()); + } + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void Function::CopyFrom(const Function& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.Function) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool Function::IsInitialized() const { + return true; +} + +::_pbi::CachedSize* Function::AccessCachedSize() const { + return &_impl_._cached_size_; +} +void Function::InternalSwap(Function* PROTOBUF_RESTRICT other) { + using std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + _impl_.args_.InternalSwap(&other->_impl_.args_); + _impl_.options_.InternalSwap(&other->_impl_.options_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena); +} + +::google::protobuf::Metadata Function::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[7]); +} +// =================================================================== + +Pipeline_Stage_OptionsEntry_DoNotUse::Pipeline_Stage_OptionsEntry_DoNotUse() {} +Pipeline_Stage_OptionsEntry_DoNotUse::Pipeline_Stage_OptionsEntry_DoNotUse(::google::protobuf::Arena* arena) + : SuperType(arena) {} +::google::protobuf::Metadata Pipeline_Stage_OptionsEntry_DoNotUse::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[8]); +} +// =================================================================== + +class Pipeline_Stage::_Internal { + public: +}; + +Pipeline_Stage::Pipeline_Stage(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.Pipeline.Stage) +} +inline PROTOBUF_NDEBUG_INLINE Pipeline_Stage::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, + const Impl_& from) + : args_{visibility, arena, from.args_}, + options_{visibility, arena, from.options_}, + name_(arena, from.name_), + _cached_size_{0} {} + +Pipeline_Stage::Pipeline_Stage( + ::google::protobuf::Arena* arena, + const Pipeline_Stage& from) + : ::google::protobuf::Message(arena) { + Pipeline_Stage* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); + + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.Pipeline.Stage) +} +inline PROTOBUF_NDEBUG_INLINE Pipeline_Stage::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena) + : args_{visibility, arena}, + options_{visibility, arena}, + name_(arena), + _cached_size_{0} {} + +inline void Pipeline_Stage::SharedCtor(::_pb::Arena* arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +Pipeline_Stage::~Pipeline_Stage() { + // @@protoc_insertion_point(destructor:google.firestore.v1.Pipeline.Stage) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void Pipeline_Stage::SharedDtor() { + ABSL_DCHECK(GetArena() == nullptr); + _impl_.name_.Destroy(); + _impl_.~Impl_(); +} + +PROTOBUF_NOINLINE void Pipeline_Stage::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.Pipeline.Stage) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.args_.Clear(); + _impl_.options_.Clear(); + _impl_.name_.ClearToEmpty(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* Pipeline_Stage::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 3, 3, 54, 2> Pipeline_Stage::_table_ = { + { + 0, // no _has_bits_ + 0, // no _extensions_ + 3, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_Pipeline_Stage_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + {::_pbi::TcParser::FastMtR1, + {18, 63, 0, PROTOBUF_FIELD_OFFSET(Pipeline_Stage, _impl_.args_)}}, + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + {::_pbi::TcParser::FastUS1, + {10, 63, 0, PROTOBUF_FIELD_OFFSET(Pipeline_Stage, _impl_.name_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + {PROTOBUF_FIELD_OFFSET(Pipeline_Stage, _impl_.name_), 0, 0, + (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + {PROTOBUF_FIELD_OFFSET(Pipeline_Stage, _impl_.args_), 0, 0, + (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + {PROTOBUF_FIELD_OFFSET(Pipeline_Stage, _impl_.options_), 0, 1, + (0 | ::_fl::kFcRepeated | ::_fl::kMap)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::firestore::v1::Value>()}, + {::_pbi::TcParser::GetMapAuxInfo< + decltype(Pipeline_Stage()._impl_.options_)>( + 1, 0, 0, 9, + 11)}, + {::_pbi::TcParser::CreateInArenaStorageCb<::google::firestore::v1::Value>}, + }}, {{ + "\42\4\0\7\0\0\0\0" + "google.firestore.v1.Pipeline.Stage" + "name" + "options" + }}, +}; + +::uint8_t* Pipeline_Stage::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.Pipeline.Stage) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + if (!this->_internal_name().empty()) { + const std::string& _s = this->_internal_name(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.Pipeline.Stage.name"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + for (unsigned i = 0, + n = static_cast(this->_internal_args_size()); i < n; i++) { + const auto& repfield = this->_internal_args().Get(i); + target = ::google::protobuf::internal::WireFormatLite:: + InternalWriteMessage(2, repfield, repfield.GetCachedSize(), target, stream); + } + + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + if (!_internal_options().empty()) { + using MapType = ::google::protobuf::Map; + using WireHelper = _pbi::MapEntryFuncs; + const auto& field = _internal_options(); + + if (stream->IsSerializationDeterministic() && field.size() > 1) { + for (const auto& entry : ::google::protobuf::internal::MapSorterPtr(field)) { + target = WireHelper::InternalSerialize( + 3, entry.first, entry.second, target, stream); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + entry.first.data(), static_cast(entry.first.length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.Pipeline.Stage.options"); + } + } else { + for (const auto& entry : field) { + target = WireHelper::InternalSerialize( + 3, entry.first, entry.second, target, stream); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + entry.first.data(), static_cast(entry.first.length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.Pipeline.Stage.options"); + } + } + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.Pipeline.Stage) + return target; +} + +::size_t Pipeline_Stage::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.Pipeline.Stage) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + total_size += 1UL * this->_internal_args_size(); + for (const auto& msg : this->_internal_args()) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + total_size += 1 * ::google::protobuf::internal::FromIntSize(_internal_options_size()); + for (const auto& entry : _internal_options()) { + total_size += _pbi::MapEntryFuncs::ByteSizeLong(entry.first, entry.second); + } + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + if (!this->_internal_name().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this->_internal_name()); + } + + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData Pipeline_Stage::_class_data_ = { + Pipeline_Stage::MergeImpl, + nullptr, // OnDemandRegisterArenaDtor +}; +const ::google::protobuf::Message::ClassData* Pipeline_Stage::GetClassData() const { + return &_class_data_; +} + +void Pipeline_Stage::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.Pipeline.Stage) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + _this->_internal_mutable_args()->MergeFrom( + from._internal_args()); + _this->_impl_.options_.MergeFrom(from._impl_.options_); + if (!from._internal_name().empty()) { + _this->_internal_set_name(from._internal_name()); + } + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void Pipeline_Stage::CopyFrom(const Pipeline_Stage& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.Pipeline.Stage) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool Pipeline_Stage::IsInitialized() const { + return true; +} + +::_pbi::CachedSize* Pipeline_Stage::AccessCachedSize() const { + return &_impl_._cached_size_; +} +void Pipeline_Stage::InternalSwap(Pipeline_Stage* PROTOBUF_RESTRICT other) { + using std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + _impl_.args_.InternalSwap(&other->_impl_.args_); + _impl_.options_.InternalSwap(&other->_impl_.options_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena); +} + +::google::protobuf::Metadata Pipeline_Stage::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[9]); +} +// =================================================================== + +class Pipeline::_Internal { + public: +}; + +Pipeline::Pipeline(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.Pipeline) +} +inline PROTOBUF_NDEBUG_INLINE Pipeline::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, + const Impl_& from) + : stages_{visibility, arena, from.stages_}, + _cached_size_{0} {} + +Pipeline::Pipeline( + ::google::protobuf::Arena* arena, + const Pipeline& from) + : ::google::protobuf::Message(arena) { + Pipeline* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); + + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.Pipeline) +} +inline PROTOBUF_NDEBUG_INLINE Pipeline::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena) + : stages_{visibility, arena}, + _cached_size_{0} {} + +inline void Pipeline::SharedCtor(::_pb::Arena* arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +Pipeline::~Pipeline() { + // @@protoc_insertion_point(destructor:google.firestore.v1.Pipeline) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void Pipeline::SharedDtor() { + ABSL_DCHECK(GetArena() == nullptr); + _impl_.~Impl_(); +} + +PROTOBUF_NOINLINE void Pipeline::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.Pipeline) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.stages_.Clear(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* Pipeline::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 1, 0, 2> Pipeline::_table_ = { + { + 0, // no _has_bits_ + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_Pipeline_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // repeated .google.firestore.v1.Pipeline.Stage stages = 1 [(.google.api.field_behavior) = REQUIRED]; + {::_pbi::TcParser::FastMtR1, + {10, 63, 0, PROTOBUF_FIELD_OFFSET(Pipeline, _impl_.stages_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .google.firestore.v1.Pipeline.Stage stages = 1 [(.google.api.field_behavior) = REQUIRED]; + {PROTOBUF_FIELD_OFFSET(Pipeline, _impl_.stages_), 0, 0, + (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::firestore::v1::Pipeline_Stage>()}, + }}, {{ + }}, +}; + +::uint8_t* Pipeline::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.Pipeline) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + // repeated .google.firestore.v1.Pipeline.Stage stages = 1 [(.google.api.field_behavior) = REQUIRED]; + for (unsigned i = 0, + n = static_cast(this->_internal_stages_size()); i < n; i++) { + const auto& repfield = this->_internal_stages().Get(i); + target = ::google::protobuf::internal::WireFormatLite:: + InternalWriteMessage(1, repfield, repfield.GetCachedSize(), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.Pipeline) + return target; +} + +::size_t Pipeline::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.Pipeline) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .google.firestore.v1.Pipeline.Stage stages = 1 [(.google.api.field_behavior) = REQUIRED]; + total_size += 1UL * this->_internal_stages_size(); + for (const auto& msg : this->_internal_stages()) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData Pipeline::_class_data_ = { + Pipeline::MergeImpl, + nullptr, // OnDemandRegisterArenaDtor +}; +const ::google::protobuf::Message::ClassData* Pipeline::GetClassData() const { + return &_class_data_; +} + +void Pipeline::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.Pipeline) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + _this->_internal_mutable_stages()->MergeFrom( + from._internal_stages()); + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void Pipeline::CopyFrom(const Pipeline& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.Pipeline) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool Pipeline::IsInitialized() const { + return true; +} + +::_pbi::CachedSize* Pipeline::AccessCachedSize() const { + return &_impl_._cached_size_; +} +void Pipeline::InternalSwap(Pipeline* PROTOBUF_RESTRICT other) { + using std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + _impl_.stages_.InternalSwap(&other->_impl_.stages_); +} + +::google::protobuf::Metadata Pipeline::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fdocument_2eproto[10]); +} // @@protoc_insertion_point(namespace_scope) } // namespace v1 } // namespace firestore diff --git a/Firestore/Protos/cpp/google/firestore/v1/document.pb.h b/Firestore/Protos/cpp/google/firestore/v1/document.pb.h index 440f2d29ffc..9e1fabdf0a3 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/document.pb.h +++ b/Firestore/Protos/cpp/google/firestore/v1/document.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,6 +53,7 @@ #include "google/protobuf/map_entry.h" #include "google/protobuf/map_field_inl.h" #include "google/protobuf/unknown_field_set.h" +#include "google/api/field_behavior.pb.h" #include "google/protobuf/struct.pb.h" #include "google/protobuf/timestamp.pb.h" #include "google/type/latlng.pb.h" @@ -89,12 +90,27 @@ extern DocumentDefaultTypeInternal _Document_default_instance_; class Document_FieldsEntry_DoNotUse; struct Document_FieldsEntry_DoNotUseDefaultTypeInternal; extern Document_FieldsEntry_DoNotUseDefaultTypeInternal _Document_FieldsEntry_DoNotUse_default_instance_; +class Function; +struct FunctionDefaultTypeInternal; +extern FunctionDefaultTypeInternal _Function_default_instance_; +class Function_OptionsEntry_DoNotUse; +struct Function_OptionsEntry_DoNotUseDefaultTypeInternal; +extern Function_OptionsEntry_DoNotUseDefaultTypeInternal _Function_OptionsEntry_DoNotUse_default_instance_; class MapValue; struct MapValueDefaultTypeInternal; extern MapValueDefaultTypeInternal _MapValue_default_instance_; class MapValue_FieldsEntry_DoNotUse; struct MapValue_FieldsEntry_DoNotUseDefaultTypeInternal; extern MapValue_FieldsEntry_DoNotUseDefaultTypeInternal _MapValue_FieldsEntry_DoNotUse_default_instance_; +class Pipeline; +struct PipelineDefaultTypeInternal; +extern PipelineDefaultTypeInternal _Pipeline_default_instance_; +class Pipeline_Stage; +struct Pipeline_StageDefaultTypeInternal; +extern Pipeline_StageDefaultTypeInternal _Pipeline_Stage_default_instance_; +class Pipeline_Stage_OptionsEntry_DoNotUse; +struct Pipeline_Stage_OptionsEntry_DoNotUseDefaultTypeInternal; +extern Pipeline_Stage_OptionsEntry_DoNotUseDefaultTypeInternal _Pipeline_Stage_OptionsEntry_DoNotUse_default_instance_; class Value; struct ValueDefaultTypeInternal; extern ValueDefaultTypeInternal _Value_default_instance_; @@ -296,6 +312,256 @@ class ArrayValue final : friend struct ::TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto; };// ------------------------------------------------------------------- +class Function final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Function) */ { + public: + inline Function() : Function(nullptr) {} + ~Function() override; + template + explicit PROTOBUF_CONSTEXPR Function(::google::protobuf::internal::ConstantInitialized); + + inline Function(const Function& from) + : Function(nullptr, from) {} + Function(Function&& from) noexcept + : Function() { + *this = ::std::move(from); + } + + inline Function& operator=(const Function& from) { + CopyFrom(from); + return *this; + } + inline Function& operator=(Function&& from) noexcept { + if (this == &from) return *this; + if (GetArena() == from.GetArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const Function& default_instance() { + return *internal_default_instance(); + } + static inline const Function* internal_default_instance() { + return reinterpret_cast( + &_Function_default_instance_); + } + static constexpr int kIndexInFileMessages = + 7; + + friend void swap(Function& a, Function& b) { + a.Swap(&b); + } + inline void Swap(Function* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() != nullptr && + GetArena() == other->GetArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() == other->GetArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(Function* other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + Function* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const Function& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const Function& from) { + Function::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void InternalSwap(Function* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "google.firestore.v1.Function"; + } + protected: + explicit Function(::google::protobuf::Arena* arena); + Function(::google::protobuf::Arena* arena, const Function& from); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + + // accessors ------------------------------------------------------- + + enum : int { + kArgsFieldNumber = 2, + kOptionsFieldNumber = 3, + kNameFieldNumber = 1, + }; + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + int args_size() const; + private: + int _internal_args_size() const; + + public: + void clear_args() ; + ::google::firestore::v1::Value* mutable_args(int index); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Value >* + mutable_args(); + private: + const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>& _internal_args() const; + ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>* _internal_mutable_args(); + public: + const ::google::firestore::v1::Value& args(int index) const; + ::google::firestore::v1::Value* add_args(); + const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Value >& + args() const; + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + int options_size() const; + private: + int _internal_options_size() const; + + public: + void clear_options() ; + const ::google::protobuf::Map& options() const; + ::google::protobuf::Map* mutable_options(); + + private: + const ::google::protobuf::Map& _internal_options() const; + ::google::protobuf::Map* _internal_mutable_options(); + + public: + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + void clear_name() ; + const std::string& name() const; + template + void set_name(Arg_&& arg, Args_... args); + std::string* mutable_name(); + PROTOBUF_NODISCARD std::string* release_name(); + void set_allocated_name(std::string* value); + + private: + const std::string& _internal_name() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_name( + const std::string& value); + std::string* _internal_mutable_name(); + + public: + // @@protoc_insertion_point(class_scope:google.firestore.v1.Function) + private: + class _Internal; + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 1, 3, 3, + 48, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + + inline explicit constexpr Impl_( + ::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena); + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena, const Impl_& from); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Value > args_; + ::google::protobuf::internal::MapField + options_; + ::google::protobuf::internal::ArenaStringPtr name_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto; +};// ------------------------------------------------------------------- + +class Function_OptionsEntry_DoNotUse final + : public ::google::protobuf::internal::MapEntry< + Function_OptionsEntry_DoNotUse, std::string, ::google::firestore::v1::Value, + ::google::protobuf::internal::WireFormatLite::TYPE_STRING, + ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE> { + public: + using SuperType = ::google::protobuf::internal::MapEntry< + Function_OptionsEntry_DoNotUse, std::string, ::google::firestore::v1::Value, + ::google::protobuf::internal::WireFormatLite::TYPE_STRING, + ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE>; + Function_OptionsEntry_DoNotUse(); + template + explicit PROTOBUF_CONSTEXPR Function_OptionsEntry_DoNotUse( + ::google::protobuf::internal::ConstantInitialized); + explicit Function_OptionsEntry_DoNotUse(::google::protobuf::Arena* arena); + static const Function_OptionsEntry_DoNotUse* internal_default_instance() { + return reinterpret_cast( + &_Function_OptionsEntry_DoNotUse_default_instance_); + } + static bool ValidateKey(std::string* s) { + return ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast(s->size()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.firestore.v1.Function.OptionsEntry.key"); + } + static bool ValidateValue(void*) { return true; } + ::google::protobuf::Metadata GetMetadata() const final; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto; +}; +// ------------------------------------------------------------------- + class MapValue final : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.MapValue) */ { public: @@ -508,26 +774,26 @@ class MapValue_FieldsEntry_DoNotUse final }; // ------------------------------------------------------------------- -class Value final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Value) */ { +class Pipeline final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Pipeline) */ { public: - inline Value() : Value(nullptr) {} - ~Value() override; + inline Pipeline() : Pipeline(nullptr) {} + ~Pipeline() override; template - explicit PROTOBUF_CONSTEXPR Value(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR Pipeline(::google::protobuf::internal::ConstantInitialized); - inline Value(const Value& from) - : Value(nullptr, from) {} - Value(Value&& from) noexcept - : Value() { + inline Pipeline(const Pipeline& from) + : Pipeline(nullptr, from) {} + Pipeline(Pipeline&& from) noexcept + : Pipeline() { *this = ::std::move(from); } - inline Value& operator=(const Value& from) { + inline Pipeline& operator=(const Pipeline& from) { CopyFrom(from); return *this; } - inline Value& operator=(Value&& from) noexcept { + inline Pipeline& operator=(Pipeline&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -559,35 +825,20 @@ class Value final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const Value& default_instance() { + static const Pipeline& default_instance() { return *internal_default_instance(); } - enum ValueTypeCase { - kNullValue = 11, - kBooleanValue = 1, - kIntegerValue = 2, - kDoubleValue = 3, - kTimestampValue = 10, - kStringValue = 17, - kBytesValue = 18, - kReferenceValue = 5, - kGeoPointValue = 8, - kArrayValue = 9, - kMapValue = 6, - VALUE_TYPE_NOT_SET = 0, - }; - - static inline const Value* internal_default_instance() { - return reinterpret_cast( - &_Value_default_instance_); + static inline const Pipeline* internal_default_instance() { + return reinterpret_cast( + &_Pipeline_default_instance_); } static constexpr int kIndexInFileMessages = - 2; + 10; - friend void swap(Value& a, Value& b) { + friend void swap(Pipeline& a, Pipeline& b) { a.Swap(&b); } - inline void Swap(Value* other) { + inline void Swap(Pipeline* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -600,7 +851,7 @@ class Value final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(Value* other) { + void UnsafeArenaSwap(Pipeline* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -608,14 +859,14 @@ class Value final : // implements Message ---------------------------------------------- - Value* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + Pipeline* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const Value& from); + void CopyFrom(const Pipeline& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const Value& from) { - Value::MergeImpl(*this, from); + void MergeFrom( const Pipeline& from) { + Pipeline::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -633,16 +884,16 @@ class Value final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(Value* other); + void InternalSwap(Pipeline* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.Value"; + return "google.firestore.v1.Pipeline"; } protected: - explicit Value(::google::protobuf::Arena* arena); - Value(::google::protobuf::Arena* arena, const Value& from); + explicit Pipeline(::google::protobuf::Arena* arena); + Pipeline(::google::protobuf::Arena* arena, const Pipeline& from); public: static const ClassData _class_data_; @@ -652,42 +903,498 @@ class Value final : // nested types ---------------------------------------------------- + using Stage = Pipeline_Stage; + // accessors ------------------------------------------------------- enum : int { - kNullValueFieldNumber = 11, - kBooleanValueFieldNumber = 1, - kIntegerValueFieldNumber = 2, - kDoubleValueFieldNumber = 3, - kTimestampValueFieldNumber = 10, - kStringValueFieldNumber = 17, - kBytesValueFieldNumber = 18, - kReferenceValueFieldNumber = 5, - kGeoPointValueFieldNumber = 8, - kArrayValueFieldNumber = 9, - kMapValueFieldNumber = 6, + kStagesFieldNumber = 1, }; - // .google.protobuf.NullValue null_value = 11; - bool has_null_value() const; - void clear_null_value() ; - ::google::protobuf::NullValue null_value() const; - void set_null_value(::google::protobuf::NullValue value); - + // repeated .google.firestore.v1.Pipeline.Stage stages = 1 [(.google.api.field_behavior) = REQUIRED]; + int stages_size() const; private: - ::google::protobuf::NullValue _internal_null_value() const; - void _internal_set_null_value(::google::protobuf::NullValue value); + int _internal_stages_size() const; public: - // bool boolean_value = 1; - bool has_boolean_value() const; - void clear_boolean_value() ; - bool boolean_value() const; - void set_boolean_value(bool value); - + void clear_stages() ; + ::google::firestore::v1::Pipeline_Stage* mutable_stages(int index); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Pipeline_Stage >* + mutable_stages(); private: - bool _internal_boolean_value() const; - void _internal_set_boolean_value(bool value); - + const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Pipeline_Stage>& _internal_stages() const; + ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Pipeline_Stage>* _internal_mutable_stages(); + public: + const ::google::firestore::v1::Pipeline_Stage& stages(int index) const; + ::google::firestore::v1::Pipeline_Stage* add_stages(); + const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Pipeline_Stage >& + stages() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.Pipeline) + private: + class _Internal; + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 0, 1, 1, + 0, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + + inline explicit constexpr Impl_( + ::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena); + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena, const Impl_& from); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Pipeline_Stage > stages_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto; +};// ------------------------------------------------------------------- + +class Pipeline_Stage final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Pipeline.Stage) */ { + public: + inline Pipeline_Stage() : Pipeline_Stage(nullptr) {} + ~Pipeline_Stage() override; + template + explicit PROTOBUF_CONSTEXPR Pipeline_Stage(::google::protobuf::internal::ConstantInitialized); + + inline Pipeline_Stage(const Pipeline_Stage& from) + : Pipeline_Stage(nullptr, from) {} + Pipeline_Stage(Pipeline_Stage&& from) noexcept + : Pipeline_Stage() { + *this = ::std::move(from); + } + + inline Pipeline_Stage& operator=(const Pipeline_Stage& from) { + CopyFrom(from); + return *this; + } + inline Pipeline_Stage& operator=(Pipeline_Stage&& from) noexcept { + if (this == &from) return *this; + if (GetArena() == from.GetArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const Pipeline_Stage& default_instance() { + return *internal_default_instance(); + } + static inline const Pipeline_Stage* internal_default_instance() { + return reinterpret_cast( + &_Pipeline_Stage_default_instance_); + } + static constexpr int kIndexInFileMessages = + 9; + + friend void swap(Pipeline_Stage& a, Pipeline_Stage& b) { + a.Swap(&b); + } + inline void Swap(Pipeline_Stage* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() != nullptr && + GetArena() == other->GetArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() == other->GetArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(Pipeline_Stage* other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + Pipeline_Stage* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const Pipeline_Stage& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const Pipeline_Stage& from) { + Pipeline_Stage::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void InternalSwap(Pipeline_Stage* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "google.firestore.v1.Pipeline.Stage"; + } + protected: + explicit Pipeline_Stage(::google::protobuf::Arena* arena); + Pipeline_Stage(::google::protobuf::Arena* arena, const Pipeline_Stage& from); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + + // accessors ------------------------------------------------------- + + enum : int { + kArgsFieldNumber = 2, + kOptionsFieldNumber = 3, + kNameFieldNumber = 1, + }; + // repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; + int args_size() const; + private: + int _internal_args_size() const; + + public: + void clear_args() ; + ::google::firestore::v1::Value* mutable_args(int index); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Value >* + mutable_args(); + private: + const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>& _internal_args() const; + ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>* _internal_mutable_args(); + public: + const ::google::firestore::v1::Value& args(int index) const; + ::google::firestore::v1::Value* add_args(); + const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Value >& + args() const; + // map options = 3 [(.google.api.field_behavior) = OPTIONAL]; + int options_size() const; + private: + int _internal_options_size() const; + + public: + void clear_options() ; + const ::google::protobuf::Map& options() const; + ::google::protobuf::Map* mutable_options(); + + private: + const ::google::protobuf::Map& _internal_options() const; + ::google::protobuf::Map* _internal_mutable_options(); + + public: + // string name = 1 [(.google.api.field_behavior) = REQUIRED]; + void clear_name() ; + const std::string& name() const; + template + void set_name(Arg_&& arg, Args_... args); + std::string* mutable_name(); + PROTOBUF_NODISCARD std::string* release_name(); + void set_allocated_name(std::string* value); + + private: + const std::string& _internal_name() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_name( + const std::string& value); + std::string* _internal_mutable_name(); + + public: + // @@protoc_insertion_point(class_scope:google.firestore.v1.Pipeline.Stage) + private: + class _Internal; + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 1, 3, 3, + 54, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + + inline explicit constexpr Impl_( + ::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena); + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena, const Impl_& from); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Value > args_; + ::google::protobuf::internal::MapField + options_; + ::google::protobuf::internal::ArenaStringPtr name_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto; +};// ------------------------------------------------------------------- + +class Pipeline_Stage_OptionsEntry_DoNotUse final + : public ::google::protobuf::internal::MapEntry< + Pipeline_Stage_OptionsEntry_DoNotUse, std::string, ::google::firestore::v1::Value, + ::google::protobuf::internal::WireFormatLite::TYPE_STRING, + ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE> { + public: + using SuperType = ::google::protobuf::internal::MapEntry< + Pipeline_Stage_OptionsEntry_DoNotUse, std::string, ::google::firestore::v1::Value, + ::google::protobuf::internal::WireFormatLite::TYPE_STRING, + ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE>; + Pipeline_Stage_OptionsEntry_DoNotUse(); + template + explicit PROTOBUF_CONSTEXPR Pipeline_Stage_OptionsEntry_DoNotUse( + ::google::protobuf::internal::ConstantInitialized); + explicit Pipeline_Stage_OptionsEntry_DoNotUse(::google::protobuf::Arena* arena); + static const Pipeline_Stage_OptionsEntry_DoNotUse* internal_default_instance() { + return reinterpret_cast( + &_Pipeline_Stage_OptionsEntry_DoNotUse_default_instance_); + } + static bool ValidateKey(std::string* s) { + return ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast(s->size()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.firestore.v1.Pipeline.Stage.OptionsEntry.key"); + } + static bool ValidateValue(void*) { return true; } + ::google::protobuf::Metadata GetMetadata() const final; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fdocument_2eproto; +}; +// ------------------------------------------------------------------- + +class Value final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Value) */ { + public: + inline Value() : Value(nullptr) {} + ~Value() override; + template + explicit PROTOBUF_CONSTEXPR Value(::google::protobuf::internal::ConstantInitialized); + + inline Value(const Value& from) + : Value(nullptr, from) {} + Value(Value&& from) noexcept + : Value() { + *this = ::std::move(from); + } + + inline Value& operator=(const Value& from) { + CopyFrom(from); + return *this; + } + inline Value& operator=(Value&& from) noexcept { + if (this == &from) return *this; + if (GetArena() == from.GetArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const Value& default_instance() { + return *internal_default_instance(); + } + enum ValueTypeCase { + kNullValue = 11, + kBooleanValue = 1, + kIntegerValue = 2, + kDoubleValue = 3, + kTimestampValue = 10, + kStringValue = 17, + kBytesValue = 18, + kReferenceValue = 5, + kGeoPointValue = 8, + kArrayValue = 9, + kMapValue = 6, + kFieldReferenceValue = 19, + kFunctionValue = 20, + kPipelineValue = 21, + VALUE_TYPE_NOT_SET = 0, + }; + + static inline const Value* internal_default_instance() { + return reinterpret_cast( + &_Value_default_instance_); + } + static constexpr int kIndexInFileMessages = + 2; + + friend void swap(Value& a, Value& b) { + a.Swap(&b); + } + inline void Swap(Value* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() != nullptr && + GetArena() == other->GetArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() == other->GetArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(Value* other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + Value* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const Value& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const Value& from) { + Value::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void InternalSwap(Value* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "google.firestore.v1.Value"; + } + protected: + explicit Value(::google::protobuf::Arena* arena); + Value(::google::protobuf::Arena* arena, const Value& from); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kNullValueFieldNumber = 11, + kBooleanValueFieldNumber = 1, + kIntegerValueFieldNumber = 2, + kDoubleValueFieldNumber = 3, + kTimestampValueFieldNumber = 10, + kStringValueFieldNumber = 17, + kBytesValueFieldNumber = 18, + kReferenceValueFieldNumber = 5, + kGeoPointValueFieldNumber = 8, + kArrayValueFieldNumber = 9, + kMapValueFieldNumber = 6, + kFieldReferenceValueFieldNumber = 19, + kFunctionValueFieldNumber = 20, + kPipelineValueFieldNumber = 21, + }; + // .google.protobuf.NullValue null_value = 11; + bool has_null_value() const; + void clear_null_value() ; + ::google::protobuf::NullValue null_value() const; + void set_null_value(::google::protobuf::NullValue value); + + private: + ::google::protobuf::NullValue _internal_null_value() const; + void _internal_set_null_value(::google::protobuf::NullValue value); + + public: + // bool boolean_value = 1; + bool has_boolean_value() const; + void clear_boolean_value() ; + bool boolean_value() const; + void set_boolean_value(bool value); + + private: + bool _internal_boolean_value() const; + void _internal_set_boolean_value(bool value); + public: // int64 integer_value = 2; bool has_integer_value() const; @@ -837,6 +1544,61 @@ class Value final : const ::google::firestore::v1::MapValue& _internal_map_value() const; ::google::firestore::v1::MapValue* _internal_mutable_map_value(); + public: + // string field_reference_value = 19; + bool has_field_reference_value() const; + void clear_field_reference_value() ; + const std::string& field_reference_value() const; + template + void set_field_reference_value(Arg_&& arg, Args_... args); + std::string* mutable_field_reference_value(); + PROTOBUF_NODISCARD std::string* release_field_reference_value(); + void set_allocated_field_reference_value(std::string* value); + + private: + const std::string& _internal_field_reference_value() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_field_reference_value( + const std::string& value); + std::string* _internal_mutable_field_reference_value(); + + public: + // .google.firestore.v1.Function function_value = 20; + bool has_function_value() const; + private: + bool _internal_has_function_value() const; + + public: + void clear_function_value() ; + const ::google::firestore::v1::Function& function_value() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Function* release_function_value(); + ::google::firestore::v1::Function* mutable_function_value(); + void set_allocated_function_value(::google::firestore::v1::Function* value); + void unsafe_arena_set_allocated_function_value(::google::firestore::v1::Function* value); + ::google::firestore::v1::Function* unsafe_arena_release_function_value(); + + private: + const ::google::firestore::v1::Function& _internal_function_value() const; + ::google::firestore::v1::Function* _internal_mutable_function_value(); + + public: + // .google.firestore.v1.Pipeline pipeline_value = 21; + bool has_pipeline_value() const; + private: + bool _internal_has_pipeline_value() const; + + public: + void clear_pipeline_value() ; + const ::google::firestore::v1::Pipeline& pipeline_value() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Pipeline* release_pipeline_value(); + ::google::firestore::v1::Pipeline* mutable_pipeline_value(); + void set_allocated_pipeline_value(::google::firestore::v1::Pipeline* value); + void unsafe_arena_set_allocated_pipeline_value(::google::firestore::v1::Pipeline* value); + ::google::firestore::v1::Pipeline* unsafe_arena_release_pipeline_value(); + + private: + const ::google::firestore::v1::Pipeline& _internal_pipeline_value() const; + ::google::firestore::v1::Pipeline* _internal_mutable_pipeline_value(); + public: void clear_value_type(); ValueTypeCase value_type_case() const; @@ -854,14 +1616,17 @@ class Value final : void set_has_geo_point_value(); void set_has_array_value(); void set_has_map_value(); + void set_has_field_reference_value(); + void set_has_function_value(); + void set_has_pipeline_value(); inline bool has_value_type() const; inline void clear_has_value_type(); friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 0, 11, 4, - 69, 2> + 0, 14, 6, + 90, 2> _table_; friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; @@ -891,6 +1656,9 @@ class Value final : ::google::type::LatLng* geo_point_value_; ::google::firestore::v1::ArrayValue* array_value_; ::google::firestore::v1::MapValue* map_value_; + ::google::protobuf::internal::ArenaStringPtr field_reference_value_; + ::google::firestore::v1::Function* function_value_; + ::google::firestore::v1::Pipeline* pipeline_value_; } value_type_; mutable ::google::protobuf::internal::CachedSize _cached_size_; ::uint32_t _oneof_case_[1]; @@ -1984,155 +2752,392 @@ inline ::google::type::LatLng* Value::mutable_geo_point_value() ABSL_ATTRIBUTE_L return _msg; } -// .google.firestore.v1.ArrayValue array_value = 9; -inline bool Value::has_array_value() const { - return value_type_case() == kArrayValue; +// .google.firestore.v1.ArrayValue array_value = 9; +inline bool Value::has_array_value() const { + return value_type_case() == kArrayValue; +} +inline bool Value::_internal_has_array_value() const { + return value_type_case() == kArrayValue; +} +inline void Value::set_has_array_value() { + _impl_._oneof_case_[0] = kArrayValue; +} +inline void Value::clear_array_value() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (value_type_case() == kArrayValue) { + if (GetArena() == nullptr) { + delete _impl_.value_type_.array_value_; + } + clear_has_value_type(); + } +} +inline ::google::firestore::v1::ArrayValue* Value::release_array_value() { + // @@protoc_insertion_point(field_release:google.firestore.v1.Value.array_value) + if (value_type_case() == kArrayValue) { + clear_has_value_type(); + auto* temp = _impl_.value_type_.array_value_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); + } + _impl_.value_type_.array_value_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline const ::google::firestore::v1::ArrayValue& Value::_internal_array_value() const { + return value_type_case() == kArrayValue ? *_impl_.value_type_.array_value_ : reinterpret_cast<::google::firestore::v1::ArrayValue&>(::google::firestore::v1::_ArrayValue_default_instance_); +} +inline const ::google::firestore::v1::ArrayValue& Value::array_value() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Value.array_value) + return _internal_array_value(); +} +inline ::google::firestore::v1::ArrayValue* Value::unsafe_arena_release_array_value() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.Value.array_value) + if (value_type_case() == kArrayValue) { + clear_has_value_type(); + auto* temp = _impl_.value_type_.array_value_; + _impl_.value_type_.array_value_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline void Value::unsafe_arena_set_allocated_array_value(::google::firestore::v1::ArrayValue* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_value_type(); + if (value) { + set_has_array_value(); + _impl_.value_type_.array_value_ = value; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.Value.array_value) +} +inline ::google::firestore::v1::ArrayValue* Value::_internal_mutable_array_value() { + if (value_type_case() != kArrayValue) { + clear_value_type(); + set_has_array_value(); + _impl_.value_type_.array_value_ = CreateMaybeMessage<::google::firestore::v1::ArrayValue>(GetArena()); + } + return _impl_.value_type_.array_value_; +} +inline ::google::firestore::v1::ArrayValue* Value::mutable_array_value() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::ArrayValue* _msg = _internal_mutable_array_value(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Value.array_value) + return _msg; +} + +// .google.firestore.v1.MapValue map_value = 6; +inline bool Value::has_map_value() const { + return value_type_case() == kMapValue; +} +inline bool Value::_internal_has_map_value() const { + return value_type_case() == kMapValue; +} +inline void Value::set_has_map_value() { + _impl_._oneof_case_[0] = kMapValue; +} +inline void Value::clear_map_value() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (value_type_case() == kMapValue) { + if (GetArena() == nullptr) { + delete _impl_.value_type_.map_value_; + } + clear_has_value_type(); + } +} +inline ::google::firestore::v1::MapValue* Value::release_map_value() { + // @@protoc_insertion_point(field_release:google.firestore.v1.Value.map_value) + if (value_type_case() == kMapValue) { + clear_has_value_type(); + auto* temp = _impl_.value_type_.map_value_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); + } + _impl_.value_type_.map_value_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline const ::google::firestore::v1::MapValue& Value::_internal_map_value() const { + return value_type_case() == kMapValue ? *_impl_.value_type_.map_value_ : reinterpret_cast<::google::firestore::v1::MapValue&>(::google::firestore::v1::_MapValue_default_instance_); +} +inline const ::google::firestore::v1::MapValue& Value::map_value() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Value.map_value) + return _internal_map_value(); +} +inline ::google::firestore::v1::MapValue* Value::unsafe_arena_release_map_value() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.Value.map_value) + if (value_type_case() == kMapValue) { + clear_has_value_type(); + auto* temp = _impl_.value_type_.map_value_; + _impl_.value_type_.map_value_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline void Value::unsafe_arena_set_allocated_map_value(::google::firestore::v1::MapValue* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_value_type(); + if (value) { + set_has_map_value(); + _impl_.value_type_.map_value_ = value; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.Value.map_value) +} +inline ::google::firestore::v1::MapValue* Value::_internal_mutable_map_value() { + if (value_type_case() != kMapValue) { + clear_value_type(); + set_has_map_value(); + _impl_.value_type_.map_value_ = CreateMaybeMessage<::google::firestore::v1::MapValue>(GetArena()); + } + return _impl_.value_type_.map_value_; +} +inline ::google::firestore::v1::MapValue* Value::mutable_map_value() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::MapValue* _msg = _internal_mutable_map_value(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Value.map_value) + return _msg; +} + +// string field_reference_value = 19; +inline bool Value::has_field_reference_value() const { + return value_type_case() == kFieldReferenceValue; +} +inline void Value::set_has_field_reference_value() { + _impl_._oneof_case_[0] = kFieldReferenceValue; +} +inline void Value::clear_field_reference_value() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (value_type_case() == kFieldReferenceValue) { + _impl_.value_type_.field_reference_value_.Destroy(); + clear_has_value_type(); + } +} +inline const std::string& Value::field_reference_value() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Value.field_reference_value) + return _internal_field_reference_value(); +} +template +inline PROTOBUF_ALWAYS_INLINE void Value::set_field_reference_value(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (value_type_case() != kFieldReferenceValue) { + clear_value_type(); + + set_has_field_reference_value(); + _impl_.value_type_.field_reference_value_.InitDefault(); + } + _impl_.value_type_.field_reference_value_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.Value.field_reference_value) +} +inline std::string* Value::mutable_field_reference_value() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_field_reference_value(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Value.field_reference_value) + return _s; +} +inline const std::string& Value::_internal_field_reference_value() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + if (value_type_case() != kFieldReferenceValue) { + return ::google::protobuf::internal::GetEmptyStringAlreadyInited(); + } + return _impl_.value_type_.field_reference_value_.Get(); +} +inline void Value::_internal_set_field_reference_value(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (value_type_case() != kFieldReferenceValue) { + clear_value_type(); + + set_has_field_reference_value(); + _impl_.value_type_.field_reference_value_.InitDefault(); + } + _impl_.value_type_.field_reference_value_.Set(value, GetArena()); +} +inline std::string* Value::_internal_mutable_field_reference_value() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (value_type_case() != kFieldReferenceValue) { + clear_value_type(); + + set_has_field_reference_value(); + _impl_.value_type_.field_reference_value_.InitDefault(); + } + return _impl_.value_type_.field_reference_value_.Mutable( GetArena()); +} +inline std::string* Value::release_field_reference_value() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.Value.field_reference_value) + if (value_type_case() != kFieldReferenceValue) { + return nullptr; + } + clear_has_value_type(); + return _impl_.value_type_.field_reference_value_.Release(); +} +inline void Value::set_allocated_field_reference_value(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (has_value_type()) { + clear_value_type(); + } + if (value != nullptr) { + set_has_field_reference_value(); + _impl_.value_type_.field_reference_value_.InitAllocated(value, GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.Value.field_reference_value) +} + +// .google.firestore.v1.Function function_value = 20; +inline bool Value::has_function_value() const { + return value_type_case() == kFunctionValue; } -inline bool Value::_internal_has_array_value() const { - return value_type_case() == kArrayValue; +inline bool Value::_internal_has_function_value() const { + return value_type_case() == kFunctionValue; } -inline void Value::set_has_array_value() { - _impl_._oneof_case_[0] = kArrayValue; +inline void Value::set_has_function_value() { + _impl_._oneof_case_[0] = kFunctionValue; } -inline void Value::clear_array_value() { +inline void Value::clear_function_value() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (value_type_case() == kArrayValue) { + if (value_type_case() == kFunctionValue) { if (GetArena() == nullptr) { - delete _impl_.value_type_.array_value_; + delete _impl_.value_type_.function_value_; } clear_has_value_type(); } } -inline ::google::firestore::v1::ArrayValue* Value::release_array_value() { - // @@protoc_insertion_point(field_release:google.firestore.v1.Value.array_value) - if (value_type_case() == kArrayValue) { +inline ::google::firestore::v1::Function* Value::release_function_value() { + // @@protoc_insertion_point(field_release:google.firestore.v1.Value.function_value) + if (value_type_case() == kFunctionValue) { clear_has_value_type(); - auto* temp = _impl_.value_type_.array_value_; + auto* temp = _impl_.value_type_.function_value_; if (GetArena() != nullptr) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); } - _impl_.value_type_.array_value_ = nullptr; + _impl_.value_type_.function_value_ = nullptr; return temp; } else { return nullptr; } } -inline const ::google::firestore::v1::ArrayValue& Value::_internal_array_value() const { - return value_type_case() == kArrayValue ? *_impl_.value_type_.array_value_ : reinterpret_cast<::google::firestore::v1::ArrayValue&>(::google::firestore::v1::_ArrayValue_default_instance_); +inline const ::google::firestore::v1::Function& Value::_internal_function_value() const { + return value_type_case() == kFunctionValue ? *_impl_.value_type_.function_value_ : reinterpret_cast<::google::firestore::v1::Function&>(::google::firestore::v1::_Function_default_instance_); } -inline const ::google::firestore::v1::ArrayValue& Value::array_value() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.Value.array_value) - return _internal_array_value(); +inline const ::google::firestore::v1::Function& Value::function_value() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Value.function_value) + return _internal_function_value(); } -inline ::google::firestore::v1::ArrayValue* Value::unsafe_arena_release_array_value() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.Value.array_value) - if (value_type_case() == kArrayValue) { +inline ::google::firestore::v1::Function* Value::unsafe_arena_release_function_value() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.Value.function_value) + if (value_type_case() == kFunctionValue) { clear_has_value_type(); - auto* temp = _impl_.value_type_.array_value_; - _impl_.value_type_.array_value_ = nullptr; + auto* temp = _impl_.value_type_.function_value_; + _impl_.value_type_.function_value_ = nullptr; return temp; } else { return nullptr; } } -inline void Value::unsafe_arena_set_allocated_array_value(::google::firestore::v1::ArrayValue* value) { +inline void Value::unsafe_arena_set_allocated_function_value(::google::firestore::v1::Function* value) { // We rely on the oneof clear method to free the earlier contents // of this oneof. We can directly use the pointer we're given to // set the new value. clear_value_type(); if (value) { - set_has_array_value(); - _impl_.value_type_.array_value_ = value; + set_has_function_value(); + _impl_.value_type_.function_value_ = value; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.Value.array_value) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.Value.function_value) } -inline ::google::firestore::v1::ArrayValue* Value::_internal_mutable_array_value() { - if (value_type_case() != kArrayValue) { +inline ::google::firestore::v1::Function* Value::_internal_mutable_function_value() { + if (value_type_case() != kFunctionValue) { clear_value_type(); - set_has_array_value(); - _impl_.value_type_.array_value_ = CreateMaybeMessage<::google::firestore::v1::ArrayValue>(GetArena()); + set_has_function_value(); + _impl_.value_type_.function_value_ = CreateMaybeMessage<::google::firestore::v1::Function>(GetArena()); } - return _impl_.value_type_.array_value_; + return _impl_.value_type_.function_value_; } -inline ::google::firestore::v1::ArrayValue* Value::mutable_array_value() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::ArrayValue* _msg = _internal_mutable_array_value(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.Value.array_value) +inline ::google::firestore::v1::Function* Value::mutable_function_value() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Function* _msg = _internal_mutable_function_value(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Value.function_value) return _msg; } -// .google.firestore.v1.MapValue map_value = 6; -inline bool Value::has_map_value() const { - return value_type_case() == kMapValue; +// .google.firestore.v1.Pipeline pipeline_value = 21; +inline bool Value::has_pipeline_value() const { + return value_type_case() == kPipelineValue; } -inline bool Value::_internal_has_map_value() const { - return value_type_case() == kMapValue; +inline bool Value::_internal_has_pipeline_value() const { + return value_type_case() == kPipelineValue; } -inline void Value::set_has_map_value() { - _impl_._oneof_case_[0] = kMapValue; +inline void Value::set_has_pipeline_value() { + _impl_._oneof_case_[0] = kPipelineValue; } -inline void Value::clear_map_value() { +inline void Value::clear_pipeline_value() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (value_type_case() == kMapValue) { + if (value_type_case() == kPipelineValue) { if (GetArena() == nullptr) { - delete _impl_.value_type_.map_value_; + delete _impl_.value_type_.pipeline_value_; } clear_has_value_type(); } } -inline ::google::firestore::v1::MapValue* Value::release_map_value() { - // @@protoc_insertion_point(field_release:google.firestore.v1.Value.map_value) - if (value_type_case() == kMapValue) { +inline ::google::firestore::v1::Pipeline* Value::release_pipeline_value() { + // @@protoc_insertion_point(field_release:google.firestore.v1.Value.pipeline_value) + if (value_type_case() == kPipelineValue) { clear_has_value_type(); - auto* temp = _impl_.value_type_.map_value_; + auto* temp = _impl_.value_type_.pipeline_value_; if (GetArena() != nullptr) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); } - _impl_.value_type_.map_value_ = nullptr; + _impl_.value_type_.pipeline_value_ = nullptr; return temp; } else { return nullptr; } } -inline const ::google::firestore::v1::MapValue& Value::_internal_map_value() const { - return value_type_case() == kMapValue ? *_impl_.value_type_.map_value_ : reinterpret_cast<::google::firestore::v1::MapValue&>(::google::firestore::v1::_MapValue_default_instance_); +inline const ::google::firestore::v1::Pipeline& Value::_internal_pipeline_value() const { + return value_type_case() == kPipelineValue ? *_impl_.value_type_.pipeline_value_ : reinterpret_cast<::google::firestore::v1::Pipeline&>(::google::firestore::v1::_Pipeline_default_instance_); } -inline const ::google::firestore::v1::MapValue& Value::map_value() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.Value.map_value) - return _internal_map_value(); +inline const ::google::firestore::v1::Pipeline& Value::pipeline_value() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Value.pipeline_value) + return _internal_pipeline_value(); } -inline ::google::firestore::v1::MapValue* Value::unsafe_arena_release_map_value() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.Value.map_value) - if (value_type_case() == kMapValue) { +inline ::google::firestore::v1::Pipeline* Value::unsafe_arena_release_pipeline_value() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.Value.pipeline_value) + if (value_type_case() == kPipelineValue) { clear_has_value_type(); - auto* temp = _impl_.value_type_.map_value_; - _impl_.value_type_.map_value_ = nullptr; + auto* temp = _impl_.value_type_.pipeline_value_; + _impl_.value_type_.pipeline_value_ = nullptr; return temp; } else { return nullptr; } } -inline void Value::unsafe_arena_set_allocated_map_value(::google::firestore::v1::MapValue* value) { +inline void Value::unsafe_arena_set_allocated_pipeline_value(::google::firestore::v1::Pipeline* value) { // We rely on the oneof clear method to free the earlier contents // of this oneof. We can directly use the pointer we're given to // set the new value. clear_value_type(); if (value) { - set_has_map_value(); - _impl_.value_type_.map_value_ = value; + set_has_pipeline_value(); + _impl_.value_type_.pipeline_value_ = value; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.Value.map_value) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.Value.pipeline_value) } -inline ::google::firestore::v1::MapValue* Value::_internal_mutable_map_value() { - if (value_type_case() != kMapValue) { +inline ::google::firestore::v1::Pipeline* Value::_internal_mutable_pipeline_value() { + if (value_type_case() != kPipelineValue) { clear_value_type(); - set_has_map_value(); - _impl_.value_type_.map_value_ = CreateMaybeMessage<::google::firestore::v1::MapValue>(GetArena()); + set_has_pipeline_value(); + _impl_.value_type_.pipeline_value_ = CreateMaybeMessage<::google::firestore::v1::Pipeline>(GetArena()); } - return _impl_.value_type_.map_value_; + return _impl_.value_type_.pipeline_value_; } -inline ::google::firestore::v1::MapValue* Value::mutable_map_value() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::MapValue* _msg = _internal_mutable_map_value(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.Value.map_value) +inline ::google::firestore::v1::Pipeline* Value::mutable_pipeline_value() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Pipeline* _msg = _internal_mutable_pipeline_value(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Value.pipeline_value) return _msg; } @@ -2232,6 +3237,331 @@ inline ::google::protobuf::Map* Map return _internal_mutable_fields(); } +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// Function + +// string name = 1 [(.google.api.field_behavior) = REQUIRED]; +inline void Function::clear_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.name_.ClearToEmpty(); +} +inline const std::string& Function::name() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Function.name) + return _internal_name(); +} +template +inline PROTOBUF_ALWAYS_INLINE void Function::set_name(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.name_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.Function.name) +} +inline std::string* Function::mutable_name() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_name(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Function.name) + return _s; +} +inline const std::string& Function::_internal_name() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.name_.Get(); +} +inline void Function::_internal_set_name(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.name_.Set(value, GetArena()); +} +inline std::string* Function::_internal_mutable_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.name_.Mutable( GetArena()); +} +inline std::string* Function::release_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.Function.name) + return _impl_.name_.Release(); +} +inline void Function::set_allocated_name(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.name_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.name_.IsDefault()) { + _impl_.name_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.Function.name) +} + +// repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; +inline int Function::_internal_args_size() const { + return _internal_args().size(); +} +inline int Function::args_size() const { + return _internal_args_size(); +} +inline void Function::clear_args() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.args_.Clear(); +} +inline ::google::firestore::v1::Value* Function::mutable_args(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Function.args) + return _internal_mutable_args()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>* Function::mutable_args() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.Function.args) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_args(); +} +inline const ::google::firestore::v1::Value& Function::args(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Function.args) + return _internal_args().Get(index); +} +inline ::google::firestore::v1::Value* Function::add_args() ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::google::firestore::v1::Value* _add = _internal_mutable_args()->Add(); + // @@protoc_insertion_point(field_add:google.firestore.v1.Function.args) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>& Function::args() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.Function.args) + return _internal_args(); +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>& +Function::_internal_args() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.args_; +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>* +Function::_internal_mutable_args() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.args_; +} + +// map options = 3 [(.google.api.field_behavior) = OPTIONAL]; +inline int Function::_internal_options_size() const { + return _internal_options().size(); +} +inline int Function::options_size() const { + return _internal_options_size(); +} +inline void Function::clear_options() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.options_.Clear(); +} +inline const ::google::protobuf::Map& Function::_internal_options() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.options_.GetMap(); +} +inline const ::google::protobuf::Map& Function::options() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_map:google.firestore.v1.Function.options) + return _internal_options(); +} +inline ::google::protobuf::Map* Function::_internal_mutable_options() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _impl_.options_.MutableMap(); +} +inline ::google::protobuf::Map* Function::mutable_options() ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_map:google.firestore.v1.Function.options) + return _internal_mutable_options(); +} + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// Pipeline_Stage + +// string name = 1 [(.google.api.field_behavior) = REQUIRED]; +inline void Pipeline_Stage::clear_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.name_.ClearToEmpty(); +} +inline const std::string& Pipeline_Stage::name() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Pipeline.Stage.name) + return _internal_name(); +} +template +inline PROTOBUF_ALWAYS_INLINE void Pipeline_Stage::set_name(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.name_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.Pipeline.Stage.name) +} +inline std::string* Pipeline_Stage::mutable_name() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_name(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Pipeline.Stage.name) + return _s; +} +inline const std::string& Pipeline_Stage::_internal_name() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.name_.Get(); +} +inline void Pipeline_Stage::_internal_set_name(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.name_.Set(value, GetArena()); +} +inline std::string* Pipeline_Stage::_internal_mutable_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.name_.Mutable( GetArena()); +} +inline std::string* Pipeline_Stage::release_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.Pipeline.Stage.name) + return _impl_.name_.Release(); +} +inline void Pipeline_Stage::set_allocated_name(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.name_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.name_.IsDefault()) { + _impl_.name_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.Pipeline.Stage.name) +} + +// repeated .google.firestore.v1.Value args = 2 [(.google.api.field_behavior) = OPTIONAL]; +inline int Pipeline_Stage::_internal_args_size() const { + return _internal_args().size(); +} +inline int Pipeline_Stage::args_size() const { + return _internal_args_size(); +} +inline void Pipeline_Stage::clear_args() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.args_.Clear(); +} +inline ::google::firestore::v1::Value* Pipeline_Stage::mutable_args(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Pipeline.Stage.args) + return _internal_mutable_args()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>* Pipeline_Stage::mutable_args() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.Pipeline.Stage.args) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_args(); +} +inline const ::google::firestore::v1::Value& Pipeline_Stage::args(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Pipeline.Stage.args) + return _internal_args().Get(index); +} +inline ::google::firestore::v1::Value* Pipeline_Stage::add_args() ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::google::firestore::v1::Value* _add = _internal_mutable_args()->Add(); + // @@protoc_insertion_point(field_add:google.firestore.v1.Pipeline.Stage.args) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>& Pipeline_Stage::args() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.Pipeline.Stage.args) + return _internal_args(); +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>& +Pipeline_Stage::_internal_args() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.args_; +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Value>* +Pipeline_Stage::_internal_mutable_args() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.args_; +} + +// map options = 3 [(.google.api.field_behavior) = OPTIONAL]; +inline int Pipeline_Stage::_internal_options_size() const { + return _internal_options().size(); +} +inline int Pipeline_Stage::options_size() const { + return _internal_options_size(); +} +inline void Pipeline_Stage::clear_options() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.options_.Clear(); +} +inline const ::google::protobuf::Map& Pipeline_Stage::_internal_options() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.options_.GetMap(); +} +inline const ::google::protobuf::Map& Pipeline_Stage::options() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_map:google.firestore.v1.Pipeline.Stage.options) + return _internal_options(); +} +inline ::google::protobuf::Map* Pipeline_Stage::_internal_mutable_options() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _impl_.options_.MutableMap(); +} +inline ::google::protobuf::Map* Pipeline_Stage::mutable_options() ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_map:google.firestore.v1.Pipeline.Stage.options) + return _internal_mutable_options(); +} + +// ------------------------------------------------------------------- + +// Pipeline + +// repeated .google.firestore.v1.Pipeline.Stage stages = 1 [(.google.api.field_behavior) = REQUIRED]; +inline int Pipeline::_internal_stages_size() const { + return _internal_stages().size(); +} +inline int Pipeline::stages_size() const { + return _internal_stages_size(); +} +inline void Pipeline::clear_stages() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.stages_.Clear(); +} +inline ::google::firestore::v1::Pipeline_Stage* Pipeline::mutable_stages(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.Pipeline.stages) + return _internal_mutable_stages()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Pipeline_Stage>* Pipeline::mutable_stages() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.Pipeline.stages) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_stages(); +} +inline const ::google::firestore::v1::Pipeline_Stage& Pipeline::stages(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.Pipeline.stages) + return _internal_stages().Get(index); +} +inline ::google::firestore::v1::Pipeline_Stage* Pipeline::add_stages() ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::google::firestore::v1::Pipeline_Stage* _add = _internal_mutable_stages()->Add(); + // @@protoc_insertion_point(field_add:google.firestore.v1.Pipeline.stages) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Pipeline_Stage>& Pipeline::stages() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.Pipeline.stages) + return _internal_stages(); +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Pipeline_Stage>& +Pipeline::_internal_stages() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.stages_; +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Pipeline_Stage>* +Pipeline::_internal_mutable_stages() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.stages_; +} + #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ diff --git a/Firestore/Protos/cpp/google/firestore/v1/explain_stats.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/explain_stats.pb.cc new file mode 100644 index 00000000000..56f6a17eec0 --- /dev/null +++ b/Firestore/Protos/cpp/google/firestore/v1/explain_stats.pb.cc @@ -0,0 +1,366 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/firestore/v1/explain_stats.proto + +#include "google/firestore/v1/explain_stats.pb.h" + +#include +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/extension_set.h" +#include "google/protobuf/wire_format_lite.h" +#include "google/protobuf/descriptor.h" +#include "google/protobuf/generated_message_reflection.h" +#include "google/protobuf/reflection_ops.h" +#include "google/protobuf/wire_format.h" +#include "google/protobuf/generated_message_tctable_impl.h" +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" +PROTOBUF_PRAGMA_INIT_SEG +namespace _pb = ::google::protobuf; +namespace _pbi = ::google::protobuf::internal; +namespace _fl = ::google::protobuf::internal::field_layout; +namespace google { +namespace firestore { +namespace v1 { + +inline constexpr ExplainStats::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + data_{nullptr} {} + +template +PROTOBUF_CONSTEXPR ExplainStats::ExplainStats(::_pbi::ConstantInitialized) + : _impl_(::_pbi::ConstantInitialized()) {} +struct ExplainStatsDefaultTypeInternal { + PROTOBUF_CONSTEXPR ExplainStatsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~ExplainStatsDefaultTypeInternal() {} + union { + ExplainStats _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ExplainStatsDefaultTypeInternal _ExplainStats_default_instance_; +} // namespace v1 +} // namespace firestore +} // namespace google +static ::_pb::Metadata file_level_metadata_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto[1]; +static constexpr const ::_pb::EnumDescriptor** + file_level_enum_descriptors_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto = nullptr; +static constexpr const ::_pb::ServiceDescriptor** + file_level_service_descriptors_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto = nullptr; +const ::uint32_t TableStruct_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE( + protodesc_cold) = { + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExplainStats, _impl_._has_bits_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExplainStats, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExplainStats, _impl_.data_), + 0, +}; + +static const ::_pbi::MigrationSchema + schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + {0, 9, -1, sizeof(::google::firestore::v1::ExplainStats)}, +}; + +static const ::_pb::Message* const file_default_instances[] = { + &::google::firestore::v1::_ExplainStats_default_instance_._instance, +}; +const char descriptor_table_protodef_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + "\n\'google/firestore/v1/explain_stats.prot" + "o\022\023google.firestore.v1\032\031google/protobuf/" + "any.proto\"2\n\014ExplainStats\022\"\n\004data\030\001 \001(\0132" + "\024.google.protobuf.AnyB\302\001\n\027com.google.fir" + "estore.v1B\021ExplainStatsProtoP\001Z;cloud.go" + "ogle.com/go/firestore/apiv1/firestorepb;" + "firestorepb\252\002\031Google.Cloud.Firestore.V1\312" + "\002\031Google\\Cloud\\Firestore\\V1\352\002\034Google::Cl" + "oud::Firestore::V1b\006proto3" +}; +static const ::_pbi::DescriptorTable* const descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_deps[1] = + { + &::descriptor_table_google_2fprotobuf_2fany_2eproto, +}; +static ::absl::once_flag descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_once; +const ::_pbi::DescriptorTable descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto = { + false, + false, + 346, + descriptor_table_protodef_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto, + "google/firestore/v1/explain_stats.proto", + &descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_once, + descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_deps, + 1, + 1, + schemas, + file_default_instances, + TableStruct_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto::offsets, + file_level_metadata_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto, + file_level_enum_descriptors_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto, + file_level_service_descriptors_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto, +}; + +// This function exists to be marked as weak. +// It can significantly speed up compilation by breaking up LLVM's SCC +// in the .pb.cc translation units. Large translation units see a +// reduction of more than 35% of walltime for optimized builds. Without +// the weak attribute all the messages in the file, including all the +// vtables and everything they use become part of the same SCC through +// a cycle like: +// GetMetadata -> descriptor table -> default instances -> +// vtables -> GetMetadata +// By adding a weak function here we break the connection from the +// individual vtables back into the descriptor table. +PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_getter() { + return &descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto; +} +// Force running AddDescriptors() at dynamic initialization time. +PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 +static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto(&descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto); +namespace google { +namespace firestore { +namespace v1 { +// =================================================================== + +class ExplainStats::_Internal { + public: + using HasBits = decltype(std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(ExplainStats, _impl_._has_bits_); + static const ::google::protobuf::Any& data(const ExplainStats* msg); + static void set_has_data(HasBits* has_bits) { + (*has_bits)[0] |= 1u; + } +}; + +const ::google::protobuf::Any& ExplainStats::_Internal::data(const ExplainStats* msg) { + return *msg->_impl_.data_; +} +void ExplainStats::clear_data() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (_impl_.data_ != nullptr) _impl_.data_->Clear(); + _impl_._has_bits_[0] &= ~0x00000001u; +} +ExplainStats::ExplainStats(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.ExplainStats) +} +inline PROTOBUF_NDEBUG_INLINE ExplainStats::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, + const Impl_& from) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +ExplainStats::ExplainStats( + ::google::protobuf::Arena* arena, + const ExplainStats& from) + : ::google::protobuf::Message(arena) { + ExplainStats* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.data_ = (cached_has_bits & 0x00000001u) + ? CreateMaybeMessage<::google::protobuf::Any>(arena, *from._impl_.data_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.ExplainStats) +} +inline PROTOBUF_NDEBUG_INLINE ExplainStats::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena) + : _cached_size_{0} {} + +inline void ExplainStats::SharedCtor(::_pb::Arena* arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.data_ = {}; +} +ExplainStats::~ExplainStats() { + // @@protoc_insertion_point(destructor:google.firestore.v1.ExplainStats) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void ExplainStats::SharedDtor() { + ABSL_DCHECK(GetArena() == nullptr); + delete _impl_.data_; + _impl_.~Impl_(); +} + +PROTOBUF_NOINLINE void ExplainStats::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.ExplainStats) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000001u) { + ABSL_DCHECK(_impl_.data_ != nullptr); + _impl_.data_->Clear(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* ExplainStats::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 1, 0, 2> ExplainStats::_table_ = { + { + PROTOBUF_FIELD_OFFSET(ExplainStats, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_ExplainStats_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // .google.protobuf.Any data = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, PROTOBUF_FIELD_OFFSET(ExplainStats, _impl_.data_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .google.protobuf.Any data = 1; + {PROTOBUF_FIELD_OFFSET(ExplainStats, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, + (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::protobuf::Any>()}, + }}, {{ + }}, +}; + +::uint8_t* ExplainStats::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.ExplainStats) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + // .google.protobuf.Any data = 1; + if (cached_has_bits & 0x00000001u) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, _Internal::data(this), + _Internal::data(this).GetCachedSize(), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.ExplainStats) + return target; +} + +::size_t ExplainStats::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.ExplainStats) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // .google.protobuf.Any data = 1; + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000001u) { + total_size += + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.data_); + } + + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData ExplainStats::_class_data_ = { + ExplainStats::MergeImpl, + nullptr, // OnDemandRegisterArenaDtor +}; +const ::google::protobuf::Message::ClassData* ExplainStats::GetClassData() const { + return &_class_data_; +} + +void ExplainStats::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.ExplainStats) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + if ((from._impl_._has_bits_[0] & 0x00000001u) != 0) { + _this->_internal_mutable_data()->::google::protobuf::Any::MergeFrom( + from._internal_data()); + } + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void ExplainStats::CopyFrom(const ExplainStats& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.ExplainStats) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool ExplainStats::IsInitialized() const { + return true; +} + +::_pbi::CachedSize* ExplainStats::AccessCachedSize() const { + return &_impl_._cached_size_; +} +void ExplainStats::InternalSwap(ExplainStats* PROTOBUF_RESTRICT other) { + using std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + swap(_impl_.data_, other->_impl_.data_); +} + +::google::protobuf::Metadata ExplainStats::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto[0]); +} +// @@protoc_insertion_point(namespace_scope) +} // namespace v1 +} // namespace firestore +} // namespace google +namespace google { +namespace protobuf { +} // namespace protobuf +} // namespace google +// @@protoc_insertion_point(global_scope) +#include "google/protobuf/port_undef.inc" diff --git a/Firestore/Protos/cpp/google/firestore/v1/explain_stats.pb.h b/Firestore/Protos/cpp/google/firestore/v1/explain_stats.pb.h new file mode 100644 index 00000000000..9dfa833e6bc --- /dev/null +++ b/Firestore/Protos/cpp/google/firestore/v1/explain_stats.pb.h @@ -0,0 +1,398 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/firestore/v1/explain_stats.proto +// Protobuf C++ Version: 4.25.1 + +#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_2epb_2eh +#define GOOGLE_PROTOBUF_INCLUDED_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_2epb_2eh + +#include +#include +#include +#include + +#include "google/protobuf/port_def.inc" +#if PROTOBUF_VERSION < 4025000 +#error "This file was generated by a newer version of protoc which is" +#error "incompatible with your Protocol Buffer headers. Please update" +#error "your headers." +#endif // PROTOBUF_VERSION + +#if 4025001 < PROTOBUF_MIN_PROTOC_VERSION +#error "This file was generated by an older version of protoc which is" +#error "incompatible with your Protocol Buffer headers. Please" +#error "regenerate this file with a newer version of protoc." +#endif // PROTOBUF_MIN_PROTOC_VERSION +#include "google/protobuf/port_undef.inc" +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/arena.h" +#include "google/protobuf/arenastring.h" +#include "google/protobuf/generated_message_tctable_decl.h" +#include "google/protobuf/generated_message_util.h" +#include "google/protobuf/metadata_lite.h" +#include "google/protobuf/generated_message_reflection.h" +#include "google/protobuf/message.h" +#include "google/protobuf/repeated_field.h" // IWYU pragma: export +#include "google/protobuf/extension_set.h" // IWYU pragma: export +#include "google/protobuf/unknown_field_set.h" +#include "google/protobuf/any.pb.h" +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" + +#define PROTOBUF_INTERNAL_EXPORT_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto + +namespace google { +namespace protobuf { +namespace internal { +class AnyMetadata; +} // namespace internal +} // namespace protobuf +} // namespace google + +// Internal implementation detail -- do not use these members. +struct TableStruct_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto { + static const ::uint32_t offsets[]; +}; +extern const ::google::protobuf::internal::DescriptorTable + descriptor_table_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto; +namespace google { +namespace firestore { +namespace v1 { +class ExplainStats; +struct ExplainStatsDefaultTypeInternal; +extern ExplainStatsDefaultTypeInternal _ExplainStats_default_instance_; +} // namespace v1 +} // namespace firestore +namespace protobuf { +} // namespace protobuf +} // namespace google + +namespace google { +namespace firestore { +namespace v1 { + +// =================================================================== + + +// ------------------------------------------------------------------- + +class ExplainStats final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.ExplainStats) */ { + public: + inline ExplainStats() : ExplainStats(nullptr) {} + ~ExplainStats() override; + template + explicit PROTOBUF_CONSTEXPR ExplainStats(::google::protobuf::internal::ConstantInitialized); + + inline ExplainStats(const ExplainStats& from) + : ExplainStats(nullptr, from) {} + ExplainStats(ExplainStats&& from) noexcept + : ExplainStats() { + *this = ::std::move(from); + } + + inline ExplainStats& operator=(const ExplainStats& from) { + CopyFrom(from); + return *this; + } + inline ExplainStats& operator=(ExplainStats&& from) noexcept { + if (this == &from) return *this; + if (GetArena() == from.GetArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const ExplainStats& default_instance() { + return *internal_default_instance(); + } + static inline const ExplainStats* internal_default_instance() { + return reinterpret_cast( + &_ExplainStats_default_instance_); + } + static constexpr int kIndexInFileMessages = + 0; + + friend void swap(ExplainStats& a, ExplainStats& b) { + a.Swap(&b); + } + inline void Swap(ExplainStats* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() != nullptr && + GetArena() == other->GetArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() == other->GetArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ExplainStats* other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ExplainStats* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const ExplainStats& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const ExplainStats& from) { + ExplainStats::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void InternalSwap(ExplainStats* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "google.firestore.v1.ExplainStats"; + } + protected: + explicit ExplainStats(::google::protobuf::Arena* arena); + ExplainStats(::google::protobuf::Arena* arena, const ExplainStats& from); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kDataFieldNumber = 1, + }; + // .google.protobuf.Any data = 1; + bool has_data() const; + void clear_data() ; + const ::google::protobuf::Any& data() const; + PROTOBUF_NODISCARD ::google::protobuf::Any* release_data(); + ::google::protobuf::Any* mutable_data(); + void set_allocated_data(::google::protobuf::Any* value); + void unsafe_arena_set_allocated_data(::google::protobuf::Any* value); + ::google::protobuf::Any* unsafe_arena_release_data(); + + private: + const ::google::protobuf::Any& _internal_data() const; + ::google::protobuf::Any* _internal_mutable_data(); + + public: + // @@protoc_insertion_point(class_scope:google.firestore.v1.ExplainStats) + private: + class _Internal; + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 0, 1, 1, + 0, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + + inline explicit constexpr Impl_( + ::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena); + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena, const Impl_& from); + ::google::protobuf::internal::HasBits<1> _has_bits_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::Any* data_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto; +}; + +// =================================================================== + + + + +// =================================================================== + + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// ExplainStats + +// .google.protobuf.Any data = 1; +inline bool ExplainStats::has_data() const { + bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; + PROTOBUF_ASSUME(!value || _impl_.data_ != nullptr); + return value; +} +inline const ::google::protobuf::Any& ExplainStats::_internal_data() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + const ::google::protobuf::Any* p = _impl_.data_; + return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Any_default_instance_); +} +inline const ::google::protobuf::Any& ExplainStats::data() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ExplainStats.data) + return _internal_data(); +} +inline void ExplainStats::unsafe_arena_set_allocated_data(::google::protobuf::Any* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + _impl_.data_ = reinterpret_cast<::google::protobuf::Any*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.ExplainStats.data) +} +inline ::google::protobuf::Any* ExplainStats::release_data() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::protobuf::Any* released = _impl_.data_; + _impl_.data_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; +} +inline ::google::protobuf::Any* ExplainStats::unsafe_arena_release_data() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.ExplainStats.data) + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::protobuf::Any* temp = _impl_.data_; + _impl_.data_ = nullptr; + return temp; +} +inline ::google::protobuf::Any* ExplainStats::_internal_mutable_data() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_._has_bits_[0] |= 0x00000001u; + if (_impl_.data_ == nullptr) { + auto* p = CreateMaybeMessage<::google::protobuf::Any>(GetArena()); + _impl_.data_ = reinterpret_cast<::google::protobuf::Any*>(p); + } + return _impl_.data_; +} +inline ::google::protobuf::Any* ExplainStats::mutable_data() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::Any* _msg = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExplainStats.data) + return _msg; +} +inline void ExplainStats::set_allocated_data(::google::protobuf::Any* value) { + ::google::protobuf::Arena* message_arena = GetArena(); + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + + _impl_.data_ = reinterpret_cast<::google::protobuf::Any*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExplainStats.data) +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif // __GNUC__ + +// @@protoc_insertion_point(namespace_scope) +} // namespace v1 +} // namespace firestore +} // namespace google + + +// @@protoc_insertion_point(global_scope) + +#include "google/protobuf/port_undef.inc" + +#endif // GOOGLE_PROTOBUF_INCLUDED_google_2ffirestore_2fv1_2fexplain_5fstats_2eproto_2epb_2eh diff --git a/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.cc index 7cf9b349839..93dfc7f88b2 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -466,6 +466,54 @@ struct ListDocumentsResponseDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ListDocumentsResponseDefaultTypeInternal _ListDocumentsResponse_default_instance_; +inline constexpr ExecutePipelineResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + results_{}, + transaction_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + execution_time_{nullptr}, + explain_stats_{nullptr} {} + +template +PROTOBUF_CONSTEXPR ExecutePipelineResponse::ExecutePipelineResponse(::_pbi::ConstantInitialized) + : _impl_(::_pbi::ConstantInitialized()) {} +struct ExecutePipelineResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR ExecutePipelineResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~ExecutePipelineResponseDefaultTypeInternal() {} + union { + ExecutePipelineResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ExecutePipelineResponseDefaultTypeInternal _ExecutePipelineResponse_default_instance_; + +inline constexpr ExecutePipelineRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : database_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + pipeline_type_{}, + consistency_selector_{}, + _cached_size_{0}, + _oneof_case_{} {} + +template +PROTOBUF_CONSTEXPR ExecutePipelineRequest::ExecutePipelineRequest(::_pbi::ConstantInitialized) + : _impl_(::_pbi::ConstantInitialized()) {} +struct ExecutePipelineRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR ExecutePipelineRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~ExecutePipelineRequestDefaultTypeInternal() {} + union { + ExecutePipelineRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ExecutePipelineRequestDefaultTypeInternal _ExecutePipelineRequest_default_instance_; + inline constexpr CreateDocumentRequest::Impl_::Impl_( ::_pbi::ConstantInitialized) noexcept : _cached_size_{0}, @@ -714,7 +762,7 @@ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT } // namespace v1 } // namespace firestore } // namespace google -static ::_pb::Metadata file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[29]; +static ::_pb::Metadata file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[31]; static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2ffirestore_2fv1_2ffirestore_2eproto[1]; static constexpr const ::_pb::ServiceDescriptor** file_level_service_descriptors_google_2ffirestore_2fv1_2ffirestore_2eproto = nullptr; @@ -944,6 +992,37 @@ const ::uint32_t TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto::offset 1, ~0u, ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineRequest, _internal_metadata_), + ~0u, // no _extensions_ + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineRequest, _impl_._oneof_case_[0]), + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineRequest, _impl_.database_), + ::_pbi::kInvalidFieldOffsetTag, + ::_pbi::kInvalidFieldOffsetTag, + ::_pbi::kInvalidFieldOffsetTag, + ::_pbi::kInvalidFieldOffsetTag, + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineRequest, _impl_.pipeline_type_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineRequest, _impl_.consistency_selector_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineResponse, _impl_._has_bits_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineResponse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineResponse, _impl_.transaction_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineResponse, _impl_.results_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineResponse, _impl_.execution_time_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::ExecutePipelineResponse, _impl_.explain_stats_), + ~0u, + ~0u, + 0, + 1, + ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::google::firestore::v1::RunAggregationQueryRequest, _internal_metadata_), ~0u, // no _extensions_ PROTOBUF_FIELD_OFFSET(::google::firestore::v1::RunAggregationQueryRequest, _impl_._oneof_case_[0]), @@ -1154,20 +1233,22 @@ static const ::_pbi::MigrationSchema {182, -1, -1, sizeof(::google::firestore::v1::RollbackRequest)}, {192, -1, -1, sizeof(::google::firestore::v1::RunQueryRequest)}, {207, 219, -1, sizeof(::google::firestore::v1::RunQueryResponse)}, - {223, -1, -1, sizeof(::google::firestore::v1::RunAggregationQueryRequest)}, - {238, 249, -1, sizeof(::google::firestore::v1::RunAggregationQueryResponse)}, - {252, 262, -1, sizeof(::google::firestore::v1::WriteRequest_LabelsEntry_DoNotUse)}, - {264, -1, -1, sizeof(::google::firestore::v1::WriteRequest)}, - {277, 289, -1, sizeof(::google::firestore::v1::WriteResponse)}, - {293, 303, -1, sizeof(::google::firestore::v1::ListenRequest_LabelsEntry_DoNotUse)}, - {305, -1, -1, sizeof(::google::firestore::v1::ListenRequest)}, - {318, -1, -1, sizeof(::google::firestore::v1::ListenResponse)}, - {332, -1, -1, sizeof(::google::firestore::v1::Target_DocumentsTarget)}, - {341, -1, -1, sizeof(::google::firestore::v1::Target_QueryTarget)}, - {352, 369, -1, sizeof(::google::firestore::v1::Target)}, - {376, 389, -1, sizeof(::google::firestore::v1::TargetChange)}, - {394, -1, -1, sizeof(::google::firestore::v1::ListCollectionIdsRequest)}, - {405, -1, -1, sizeof(::google::firestore::v1::ListCollectionIdsResponse)}, + {223, -1, -1, sizeof(::google::firestore::v1::ExecutePipelineRequest)}, + {238, 250, -1, sizeof(::google::firestore::v1::ExecutePipelineResponse)}, + {254, -1, -1, sizeof(::google::firestore::v1::RunAggregationQueryRequest)}, + {269, 280, -1, sizeof(::google::firestore::v1::RunAggregationQueryResponse)}, + {283, 293, -1, sizeof(::google::firestore::v1::WriteRequest_LabelsEntry_DoNotUse)}, + {295, -1, -1, sizeof(::google::firestore::v1::WriteRequest)}, + {308, 320, -1, sizeof(::google::firestore::v1::WriteResponse)}, + {324, 334, -1, sizeof(::google::firestore::v1::ListenRequest_LabelsEntry_DoNotUse)}, + {336, -1, -1, sizeof(::google::firestore::v1::ListenRequest)}, + {349, -1, -1, sizeof(::google::firestore::v1::ListenResponse)}, + {363, -1, -1, sizeof(::google::firestore::v1::Target_DocumentsTarget)}, + {372, -1, -1, sizeof(::google::firestore::v1::Target_QueryTarget)}, + {383, 400, -1, sizeof(::google::firestore::v1::Target)}, + {407, 420, -1, sizeof(::google::firestore::v1::TargetChange)}, + {425, -1, -1, sizeof(::google::firestore::v1::ListCollectionIdsRequest)}, + {436, -1, -1, sizeof(::google::firestore::v1::ListCollectionIdsResponse)}, }; static const ::_pb::Message* const file_default_instances[] = { @@ -1186,6 +1267,8 @@ static const ::_pb::Message* const file_default_instances[] = { &::google::firestore::v1::_RollbackRequest_default_instance_._instance, &::google::firestore::v1::_RunQueryRequest_default_instance_._instance, &::google::firestore::v1::_RunQueryResponse_default_instance_._instance, + &::google::firestore::v1::_ExecutePipelineRequest_default_instance_._instance, + &::google::firestore::v1::_ExecutePipelineResponse_default_instance_._instance, &::google::firestore::v1::_RunAggregationQueryRequest_default_instance_._instance, &::google::firestore::v1::_RunAggregationQueryResponse_default_instance_._instance, &::google::firestore::v1::_WriteRequest_LabelsEntry_DoNotUse_default_instance_._instance, @@ -1204,211 +1287,234 @@ static const ::_pb::Message* const file_default_instances[] = { const char descriptor_table_protodef_google_2ffirestore_2fv1_2ffirestore_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { "\n#google/firestore/v1/firestore.proto\022\023g" "oogle.firestore.v1\032\034google/api/annotatio" - "ns.proto\032,google/firestore/v1/aggregatio" - "n_result.proto\032 google/firestore/v1/comm" - "on.proto\032\"google/firestore/v1/document.p" - "roto\032\037google/firestore/v1/query.proto\032\037g" - "oogle/firestore/v1/write.proto\032\033google/p" - "rotobuf/empty.proto\032\037google/protobuf/tim" - "estamp.proto\032\036google/protobuf/wrappers.p" - "roto\032\027google/rpc/status.proto\"\263\001\n\022GetDoc" - "umentRequest\022\014\n\004name\030\001 \001(\t\022/\n\004mask\030\002 \001(\013" - "2!.google.firestore.v1.DocumentMask\022\025\n\013t" - "ransaction\030\003 \001(\014H\000\022/\n\tread_time\030\005 \001(\0132\032." - "google.protobuf.TimestampH\000B\026\n\024consisten" - "cy_selector\"\235\002\n\024ListDocumentsRequest\022\016\n\006" - "parent\030\001 \001(\t\022\025\n\rcollection_id\030\002 \001(\t\022\021\n\tp" - "age_size\030\003 \001(\005\022\022\n\npage_token\030\004 \001(\t\022\020\n\010or" - "der_by\030\006 \001(\t\022/\n\004mask\030\007 \001(\0132!.google.fire" - "store.v1.DocumentMask\022\025\n\013transaction\030\010 \001" - "(\014H\000\022/\n\tread_time\030\n \001(\0132\032.google.protobu" - "f.TimestampH\000\022\024\n\014show_missing\030\014 \001(\010B\026\n\024c" - "onsistency_selector\"b\n\025ListDocumentsResp" - "onse\0220\n\tdocuments\030\001 \003(\0132\035.google.firesto" - "re.v1.Document\022\027\n\017next_page_token\030\002 \001(\t\"" - "\265\001\n\025CreateDocumentRequest\022\016\n\006parent\030\001 \001(" - "\t\022\025\n\rcollection_id\030\002 \001(\t\022\023\n\013document_id\030" - "\003 \001(\t\022/\n\010document\030\004 \001(\0132\035.google.firesto" - "re.v1.Document\022/\n\004mask\030\005 \001(\0132!.google.fi" - "restore.v1.DocumentMask\"\356\001\n\025UpdateDocume" - "ntRequest\022/\n\010document\030\001 \001(\0132\035.google.fir" - "estore.v1.Document\0226\n\013update_mask\030\002 \001(\0132" - "!.google.firestore.v1.DocumentMask\022/\n\004ma" - "sk\030\003 \001(\0132!.google.firestore.v1.DocumentM" - "ask\022;\n\020current_document\030\004 \001(\0132!.google.f" - "irestore.v1.Precondition\"b\n\025DeleteDocume" - "ntRequest\022\014\n\004name\030\001 \001(\t\022;\n\020current_docum" - "ent\030\002 \001(\0132!.google.firestore.v1.Precondi" - "tion\"\224\002\n\030BatchGetDocumentsRequest\022\020\n\010dat" - "abase\030\001 \001(\t\022\021\n\tdocuments\030\002 \003(\t\022/\n\004mask\030\003" - " \001(\0132!.google.firestore.v1.DocumentMask\022" - "\025\n\013transaction\030\004 \001(\014H\000\022B\n\017new_transactio" - "n\030\005 \001(\0132\'.google.firestore.v1.Transactio" - "nOptionsH\000\022/\n\tread_time\030\007 \001(\0132\032.google.p" - "rotobuf.TimestampH\000B\026\n\024consistency_selec" - "tor\"\254\001\n\031BatchGetDocumentsResponse\022.\n\005fou" - "nd\030\001 \001(\0132\035.google.firestore.v1.DocumentH" - "\000\022\021\n\007missing\030\002 \001(\tH\000\022\023\n\013transaction\030\003 \001(" - "\014\022-\n\tread_time\030\004 \001(\0132\032.google.protobuf.T" - "imestampB\010\n\006result\"e\n\027BeginTransactionRe" - "quest\022\020\n\010database\030\001 \001(\t\0228\n\007options\030\002 \001(\013" - "2\'.google.firestore.v1.TransactionOption" - "s\"/\n\030BeginTransactionResponse\022\023\n\013transac" - "tion\030\001 \001(\014\"b\n\rCommitRequest\022\020\n\010database\030" - "\001 \001(\t\022*\n\006writes\030\002 \003(\0132\032.google.firestore" - ".v1.Write\022\023\n\013transaction\030\003 \001(\014\"z\n\016Commit" - "Response\0227\n\rwrite_results\030\001 \003(\0132 .google" - ".firestore.v1.WriteResult\022/\n\013commit_time" - "\030\002 \001(\0132\032.google.protobuf.Timestamp\"8\n\017Ro" - "llbackRequest\022\020\n\010database\030\001 \001(\t\022\023\n\013trans" - "action\030\002 \001(\014\"\225\002\n\017RunQueryRequest\022\016\n\006pare" - "nt\030\001 \001(\t\022@\n\020structured_query\030\002 \001(\0132$.goo" - "gle.firestore.v1.StructuredQueryH\000\022\025\n\013tr" - "ansaction\030\005 \001(\014H\001\022B\n\017new_transaction\030\006 \001" - "(\0132\'.google.firestore.v1.TransactionOpti" - "onsH\001\022/\n\tread_time\030\007 \001(\0132\032.google.protob" - "uf.TimestampH\001B\014\n\nquery_typeB\026\n\024consiste" - "ncy_selector\"\240\001\n\020RunQueryResponse\022\023\n\013tra" - "nsaction\030\002 \001(\014\022/\n\010document\030\001 \001(\0132\035.googl" - "e.firestore.v1.Document\022-\n\tread_time\030\003 \001" - "(\0132\032.google.protobuf.Timestamp\022\027\n\017skippe" - "d_results\030\004 \001(\005\"\267\002\n\032RunAggregationQueryR" - "equest\022\016\n\006parent\030\001 \001(\t\022W\n\034structured_agg" - "regation_query\030\002 \001(\0132/.google.firestore." - "v1.StructuredAggregationQueryH\000\022\025\n\013trans" - "action\030\004 \001(\014H\001\022B\n\017new_transaction\030\005 \001(\0132" - "\'.google.firestore.v1.TransactionOptions" - "H\001\022/\n\tread_time\030\006 \001(\0132\032.google.protobuf." - "TimestampH\001B\014\n\nquery_typeB\026\n\024consistency" - "_selector\"\231\001\n\033RunAggregationQueryRespons" - "e\0226\n\006result\030\001 \001(\0132&.google.firestore.v1." - "AggregationResult\022\023\n\013transaction\030\002 \001(\014\022-" - "\n\tread_time\030\003 \001(\0132\032.google.protobuf.Time" - "stamp\"\343\001\n\014WriteRequest\022\020\n\010database\030\001 \001(\t" - "\022\021\n\tstream_id\030\002 \001(\t\022*\n\006writes\030\003 \003(\0132\032.go" - "ogle.firestore.v1.Write\022\024\n\014stream_token\030" - "\004 \001(\014\022=\n\006labels\030\005 \003(\0132-.google.firestore" - ".v1.WriteRequest.LabelsEntry\032-\n\013LabelsEn" - "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"\242\001\n\r" - "WriteResponse\022\021\n\tstream_id\030\001 \001(\t\022\024\n\014stre" - "am_token\030\002 \001(\014\0227\n\rwrite_results\030\003 \003(\0132 ." - "google.firestore.v1.WriteResult\022/\n\013commi" - "t_time\030\004 \001(\0132\032.google.protobuf.Timestamp" - "\"\355\001\n\rListenRequest\022\020\n\010database\030\001 \001(\t\0221\n\n" - "add_target\030\002 \001(\0132\033.google.firestore.v1.T" - "argetH\000\022\027\n\rremove_target\030\003 \001(\005H\000\022>\n\006labe" - "ls\030\004 \003(\0132..google.firestore.v1.ListenReq" - "uest.LabelsEntry\032-\n\013LabelsEntry\022\013\n\003key\030\001" - " \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001B\017\n\rtarget_change" - "\"\325\002\n\016ListenResponse\022:\n\rtarget_change\030\002 \001" - "(\0132!.google.firestore.v1.TargetChangeH\000\022" - ">\n\017document_change\030\003 \001(\0132#.google.firest" - "ore.v1.DocumentChangeH\000\022>\n\017document_dele" - "te\030\004 \001(\0132#.google.firestore.v1.DocumentD" - "eleteH\000\022>\n\017document_remove\030\006 \001(\0132#.googl" - "e.firestore.v1.DocumentRemoveH\000\0226\n\006filte" - "r\030\005 \001(\0132$.google.firestore.v1.ExistenceF" - "ilterH\000B\017\n\rresponse_type\"\326\003\n\006Target\0228\n\005q" - "uery\030\002 \001(\0132\'.google.firestore.v1.Target." - "QueryTargetH\000\022@\n\tdocuments\030\003 \001(\0132+.googl" - "e.firestore.v1.Target.DocumentsTargetH\000\022" - "\026\n\014resume_token\030\004 \001(\014H\001\022/\n\tread_time\030\013 \001" - "(\0132\032.google.protobuf.TimestampH\001\022\021\n\ttarg" - "et_id\030\005 \001(\005\022\014\n\004once\030\006 \001(\010\0223\n\016expected_co" - "unt\030\014 \001(\0132\033.google.protobuf.Int32Value\032$" - "\n\017DocumentsTarget\022\021\n\tdocuments\030\002 \003(\t\032m\n\013" - "QueryTarget\022\016\n\006parent\030\001 \001(\t\022@\n\020structure" - "d_query\030\002 \001(\0132$.google.firestore.v1.Stru" - "cturedQueryH\000B\014\n\nquery_typeB\r\n\013target_ty" - "peB\r\n\013resume_type\"\252\002\n\014TargetChange\022N\n\022ta" - "rget_change_type\030\001 \001(\01622.google.firestor" - "e.v1.TargetChange.TargetChangeType\022\022\n\nta" - "rget_ids\030\002 \003(\005\022!\n\005cause\030\003 \001(\0132\022.google.r" - "pc.Status\022\024\n\014resume_token\030\004 \001(\014\022-\n\tread_" - "time\030\006 \001(\0132\032.google.protobuf.Timestamp\"N" - "\n\020TargetChangeType\022\r\n\tNO_CHANGE\020\000\022\007\n\003ADD" - "\020\001\022\n\n\006REMOVE\020\002\022\013\n\007CURRENT\020\003\022\t\n\005RESET\020\004\"Q" - "\n\030ListCollectionIdsRequest\022\016\n\006parent\030\001 \001" - "(\t\022\021\n\tpage_size\030\002 \001(\005\022\022\n\npage_token\030\003 \001(" - "\t\"L\n\031ListCollectionIdsResponse\022\026\n\016collec" - "tion_ids\030\001 \003(\t\022\027\n\017next_page_token\030\002 \001(\t2" - "\236\024\n\tFirestore\022\217\001\n\013GetDocument\022\'.google.f" - "irestore.v1.GetDocumentRequest\032\035.google." - "firestore.v1.Document\"8\202\323\344\223\0022\0220/v1/{name" - "=projects/*/databases/*/documents/*/**}\022" - "\262\001\n\rListDocuments\022).google.firestore.v1." - "ListDocumentsRequest\032*.google.firestore." - "v1.ListDocumentsResponse\"J\202\323\344\223\002D\022B/v1/{p" - "arent=projects/*/databases/*/documents/*" - "/**}/{collection_id}\022\257\001\n\016CreateDocument\022" - "*.google.firestore.v1.CreateDocumentRequ" - "est\032\035.google.firestore.v1.Document\"R\202\323\344\223" - "\002L\"@/v1/{parent=projects/*/databases/*/d" - "ocuments/**}/{collection_id}:\010document\022\250" - "\001\n\016UpdateDocument\022*.google.firestore.v1." - "UpdateDocumentRequest\032\035.google.firestore" - ".v1.Document\"K\202\323\344\223\002E29/v1/{document.name" - "=projects/*/databases/*/documents/*/**}:" - "\010document\022\216\001\n\016DeleteDocument\022*.google.fi" - "restore.v1.DeleteDocumentRequest\032\026.googl" - "e.protobuf.Empty\"8\202\323\344\223\0022*0/v1/{name=proj" - "ects/*/databases/*/documents/*/**}\022\271\001\n\021B" - "atchGetDocuments\022-.google.firestore.v1.B" - "atchGetDocumentsRequest\032..google.firesto" - "re.v1.BatchGetDocumentsResponse\"C\202\323\344\223\002=\"" - "8/v1/{database=projects/*/databases/*}/d" - "ocuments:batchGet:\001*0\001\022\274\001\n\020BeginTransact" - "ion\022,.google.firestore.v1.BeginTransacti" - "onRequest\032-.google.firestore.v1.BeginTra" - "nsactionResponse\"K\202\323\344\223\002E\"@/v1/{database=" - "projects/*/databases/*}/documents:beginT" - "ransaction:\001*\022\224\001\n\006Commit\022\".google.firest" - "ore.v1.CommitRequest\032#.google.firestore." - "v1.CommitResponse\"A\202\323\344\223\002;\"6/v1/{database" - "=projects/*/databases/*}/documents:commi" - "t:\001*\022\215\001\n\010Rollback\022$.google.firestore.v1." - "RollbackRequest\032\026.google.protobuf.Empty\"" - "C\202\323\344\223\002=\"8/v1/{database=projects/*/databa" - "ses/*}/documents:rollback:\001*\022\337\001\n\010RunQuer" - "y\022$.google.firestore.v1.RunQueryRequest\032" - "%.google.firestore.v1.RunQueryResponse\"\203" - "\001\202\323\344\223\002}\"6/v1/{parent=projects/*/database" - "s/*/documents}:runQuery:\001*Z@\";/v1/{paren" + "ns.proto\032\037google/api/field_behavior.prot" + "o\032,google/firestore/v1/aggregation_resul" + "t.proto\032 google/firestore/v1/common.prot" + "o\032\"google/firestore/v1/document.proto\032\'g" + "oogle/firestore/v1/explain_stats.proto\032\"" + "google/firestore/v1/pipeline.proto\032\037goog" + "le/firestore/v1/query.proto\032\037google/fire" + "store/v1/write.proto\032\033google/protobuf/em" + "pty.proto\032\037google/protobuf/timestamp.pro" + "to\032\036google/protobuf/wrappers.proto\032\027goog" + "le/rpc/status.proto\"\263\001\n\022GetDocumentReque" + "st\022\014\n\004name\030\001 \001(\t\022/\n\004mask\030\002 \001(\0132!.google." + "firestore.v1.DocumentMask\022\025\n\013transaction" + "\030\003 \001(\014H\000\022/\n\tread_time\030\005 \001(\0132\032.google.pro" + "tobuf.TimestampH\000B\026\n\024consistency_selecto" + "r\"\235\002\n\024ListDocumentsRequest\022\016\n\006parent\030\001 \001" + "(\t\022\025\n\rcollection_id\030\002 \001(\t\022\021\n\tpage_size\030\003" + " \001(\005\022\022\n\npage_token\030\004 \001(\t\022\020\n\010order_by\030\006 \001" + "(\t\022/\n\004mask\030\007 \001(\0132!.google.firestore.v1.D" + "ocumentMask\022\025\n\013transaction\030\010 \001(\014H\000\022/\n\tre" + "ad_time\030\n \001(\0132\032.google.protobuf.Timestam" + "pH\000\022\024\n\014show_missing\030\014 \001(\010B\026\n\024consistency" + "_selector\"b\n\025ListDocumentsResponse\0220\n\tdo" + "cuments\030\001 \003(\0132\035.google.firestore.v1.Docu" + "ment\022\027\n\017next_page_token\030\002 \001(\t\"\265\001\n\025Create" + "DocumentRequest\022\016\n\006parent\030\001 \001(\t\022\025\n\rcolle" + "ction_id\030\002 \001(\t\022\023\n\013document_id\030\003 \001(\t\022/\n\010d" + "ocument\030\004 \001(\0132\035.google.firestore.v1.Docu" + "ment\022/\n\004mask\030\005 \001(\0132!.google.firestore.v1" + ".DocumentMask\"\356\001\n\025UpdateDocumentRequest\022" + "/\n\010document\030\001 \001(\0132\035.google.firestore.v1." + "Document\0226\n\013update_mask\030\002 \001(\0132!.google.f" + "irestore.v1.DocumentMask\022/\n\004mask\030\003 \001(\0132!" + ".google.firestore.v1.DocumentMask\022;\n\020cur" + "rent_document\030\004 \001(\0132!.google.firestore.v" + "1.Precondition\"b\n\025DeleteDocumentRequest\022" + "\014\n\004name\030\001 \001(\t\022;\n\020current_document\030\002 \001(\0132" + "!.google.firestore.v1.Precondition\"\224\002\n\030B" + "atchGetDocumentsRequest\022\020\n\010database\030\001 \001(" + "\t\022\021\n\tdocuments\030\002 \003(\t\022/\n\004mask\030\003 \001(\0132!.goo" + "gle.firestore.v1.DocumentMask\022\025\n\013transac" + "tion\030\004 \001(\014H\000\022B\n\017new_transaction\030\005 \001(\0132\'." + "google.firestore.v1.TransactionOptionsH\000" + "\022/\n\tread_time\030\007 \001(\0132\032.google.protobuf.Ti" + "mestampH\000B\026\n\024consistency_selector\"\254\001\n\031Ba" + "tchGetDocumentsResponse\022.\n\005found\030\001 \001(\0132\035" + ".google.firestore.v1.DocumentH\000\022\021\n\007missi" + "ng\030\002 \001(\tH\000\022\023\n\013transaction\030\003 \001(\014\022-\n\tread_" + "time\030\004 \001(\0132\032.google.protobuf.TimestampB\010" + "\n\006result\"e\n\027BeginTransactionRequest\022\020\n\010d" + "atabase\030\001 \001(\t\0228\n\007options\030\002 \001(\0132\'.google." + "firestore.v1.TransactionOptions\"/\n\030Begin" + "TransactionResponse\022\023\n\013transaction\030\001 \001(\014" + "\"b\n\rCommitRequest\022\020\n\010database\030\001 \001(\t\022*\n\006w" + "rites\030\002 \003(\0132\032.google.firestore.v1.Write\022" + "\023\n\013transaction\030\003 \001(\014\"z\n\016CommitResponse\0227" + "\n\rwrite_results\030\001 \003(\0132 .google.firestore" + ".v1.WriteResult\022/\n\013commit_time\030\002 \001(\0132\032.g" + "oogle.protobuf.Timestamp\"8\n\017RollbackRequ" + "est\022\020\n\010database\030\001 \001(\t\022\023\n\013transaction\030\002 \001" + "(\014\"\225\002\n\017RunQueryRequest\022\016\n\006parent\030\001 \001(\t\022@" + "\n\020structured_query\030\002 \001(\0132$.google.firest" + "ore.v1.StructuredQueryH\000\022\025\n\013transaction\030" + "\005 \001(\014H\001\022B\n\017new_transaction\030\006 \001(\0132\'.googl" + "e.firestore.v1.TransactionOptionsH\001\022/\n\tr" + "ead_time\030\007 \001(\0132\032.google.protobuf.Timesta" + "mpH\001B\014\n\nquery_typeB\026\n\024consistency_select" + "or\"\240\001\n\020RunQueryResponse\022\023\n\013transaction\030\002" + " \001(\014\022/\n\010document\030\001 \001(\0132\035.google.firestor" + "e.v1.Document\022-\n\tread_time\030\003 \001(\0132\032.googl" + "e.protobuf.Timestamp\022\027\n\017skipped_results\030" + "\004 \001(\005\"\254\002\n\026ExecutePipelineRequest\022\025\n\010data" + "base\030\001 \001(\tB\003\340A\002\022F\n\023structured_pipeline\030\002" + " \001(\0132\'.google.firestore.v1.StructuredPip" + "elineH\000\022\025\n\013transaction\030\005 \001(\014H\001\022B\n\017new_tr" + "ansaction\030\006 \001(\0132\'.google.firestore.v1.Tr" + "ansactionOptionsH\001\022/\n\tread_time\030\007 \001(\0132\032." + "google.protobuf.TimestampH\001B\017\n\rpipeline_" + "typeB\026\n\024consistency_selector\"\314\001\n\027Execute" + "PipelineResponse\022\023\n\013transaction\030\001 \001(\014\022.\n" + "\007results\030\002 \003(\0132\035.google.firestore.v1.Doc" + "ument\0222\n\016execution_time\030\003 \001(\0132\032.google.p" + "rotobuf.Timestamp\0228\n\rexplain_stats\030\004 \001(\013" + "2!.google.firestore.v1.ExplainStats\"\267\002\n\032" + "RunAggregationQueryRequest\022\016\n\006parent\030\001 \001" + "(\t\022W\n\034structured_aggregation_query\030\002 \001(\013" + "2/.google.firestore.v1.StructuredAggrega" + "tionQueryH\000\022\025\n\013transaction\030\004 \001(\014H\001\022B\n\017ne" + "w_transaction\030\005 \001(\0132\'.google.firestore.v" + "1.TransactionOptionsH\001\022/\n\tread_time\030\006 \001(" + "\0132\032.google.protobuf.TimestampH\001B\014\n\nquery" + "_typeB\026\n\024consistency_selector\"\231\001\n\033RunAgg" + "regationQueryResponse\0226\n\006result\030\001 \001(\0132&." + "google.firestore.v1.AggregationResult\022\023\n" + "\013transaction\030\002 \001(\014\022-\n\tread_time\030\003 \001(\0132\032." + "google.protobuf.Timestamp\"\343\001\n\014WriteReque" + "st\022\020\n\010database\030\001 \001(\t\022\021\n\tstream_id\030\002 \001(\t\022" + "*\n\006writes\030\003 \003(\0132\032.google.firestore.v1.Wr" + "ite\022\024\n\014stream_token\030\004 \001(\014\022=\n\006labels\030\005 \003(" + "\0132-.google.firestore.v1.WriteRequest.Lab" + "elsEntry\032-\n\013LabelsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005" + "value\030\002 \001(\t:\0028\001\"\242\001\n\rWriteResponse\022\021\n\tstr" + "eam_id\030\001 \001(\t\022\024\n\014stream_token\030\002 \001(\014\0227\n\rwr" + "ite_results\030\003 \003(\0132 .google.firestore.v1." + "WriteResult\022/\n\013commit_time\030\004 \001(\0132\032.googl" + "e.protobuf.Timestamp\"\355\001\n\rListenRequest\022\020" + "\n\010database\030\001 \001(\t\0221\n\nadd_target\030\002 \001(\0132\033.g" + "oogle.firestore.v1.TargetH\000\022\027\n\rremove_ta" + "rget\030\003 \001(\005H\000\022>\n\006labels\030\004 \003(\0132..google.fi" + "restore.v1.ListenRequest.LabelsEntry\032-\n\013" + "LabelsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:" + "\0028\001B\017\n\rtarget_change\"\325\002\n\016ListenResponse\022" + ":\n\rtarget_change\030\002 \001(\0132!.google.firestor" + "e.v1.TargetChangeH\000\022>\n\017document_change\030\003" + " \001(\0132#.google.firestore.v1.DocumentChang" + "eH\000\022>\n\017document_delete\030\004 \001(\0132#.google.fi" + "restore.v1.DocumentDeleteH\000\022>\n\017document_" + "remove\030\006 \001(\0132#.google.firestore.v1.Docum" + "entRemoveH\000\0226\n\006filter\030\005 \001(\0132$.google.fir" + "estore.v1.ExistenceFilterH\000B\017\n\rresponse_" + "type\"\326\003\n\006Target\0228\n\005query\030\002 \001(\0132\'.google." + "firestore.v1.Target.QueryTargetH\000\022@\n\tdoc" + "uments\030\003 \001(\0132+.google.firestore.v1.Targe" + "t.DocumentsTargetH\000\022\026\n\014resume_token\030\004 \001(" + "\014H\001\022/\n\tread_time\030\013 \001(\0132\032.google.protobuf" + ".TimestampH\001\022\021\n\ttarget_id\030\005 \001(\005\022\014\n\004once\030" + "\006 \001(\010\0223\n\016expected_count\030\014 \001(\0132\033.google.p" + "rotobuf.Int32Value\032$\n\017DocumentsTarget\022\021\n" + "\tdocuments\030\002 \003(\t\032m\n\013QueryTarget\022\016\n\006paren" + "t\030\001 \001(\t\022@\n\020structured_query\030\002 \001(\0132$.goog" + "le.firestore.v1.StructuredQueryH\000B\014\n\nque" + "ry_typeB\r\n\013target_typeB\r\n\013resume_type\"\252\002" + "\n\014TargetChange\022N\n\022target_change_type\030\001 \001" + "(\01622.google.firestore.v1.TargetChange.Ta" + "rgetChangeType\022\022\n\ntarget_ids\030\002 \003(\005\022!\n\005ca" + "use\030\003 \001(\0132\022.google.rpc.Status\022\024\n\014resume_" + "token\030\004 \001(\014\022-\n\tread_time\030\006 \001(\0132\032.google." + "protobuf.Timestamp\"N\n\020TargetChangeType\022\r" + "\n\tNO_CHANGE\020\000\022\007\n\003ADD\020\001\022\n\n\006REMOVE\020\002\022\013\n\007CU" + "RRENT\020\003\022\t\n\005RESET\020\004\"Q\n\030ListCollectionIdsR" + "equest\022\016\n\006parent\030\001 \001(\t\022\021\n\tpage_size\030\002 \001(" + "\005\022\022\n\npage_token\030\003 \001(\t\"L\n\031ListCollectionI" + "dsResponse\022\026\n\016collection_ids\030\001 \003(\t\022\027\n\017ne" + "xt_page_token\030\002 \001(\t2\333\025\n\tFirestore\022\217\001\n\013Ge" + "tDocument\022\'.google.firestore.v1.GetDocum" + "entRequest\032\035.google.firestore.v1.Documen" + "t\"8\202\323\344\223\0022\0220/v1/{name=projects/*/database" + "s/*/documents/*/**}\022\262\001\n\rListDocuments\022)." + "google.firestore.v1.ListDocumentsRequest" + "\032*.google.firestore.v1.ListDocumentsResp" + "onse\"J\202\323\344\223\002D\022B/v1/{parent=projects/*/dat" + "abases/*/documents/*/**}/{collection_id}" + "\022\257\001\n\016CreateDocument\022*.google.firestore.v" + "1.CreateDocumentRequest\032\035.google.firesto" + "re.v1.Document\"R\202\323\344\223\002L\"@/v1/{parent=proj" + "ects/*/databases/*/documents/**}/{collec" + "tion_id}:\010document\022\250\001\n\016UpdateDocument\022*." + "google.firestore.v1.UpdateDocumentReques" + "t\032\035.google.firestore.v1.Document\"K\202\323\344\223\002E" + "29/v1/{document.name=projects/*/database" + "s/*/documents/*/**}:\010document\022\216\001\n\016Delete" + "Document\022*.google.firestore.v1.DeleteDoc" + "umentRequest\032\026.google.protobuf.Empty\"8\202\323" + "\344\223\0022*0/v1/{name=projects/*/databases/*/d" + "ocuments/*/**}\022\271\001\n\021BatchGetDocuments\022-.g" + "oogle.firestore.v1.BatchGetDocumentsRequ" + "est\032..google.firestore.v1.BatchGetDocume" + "ntsResponse\"C\202\323\344\223\002=\"8/v1/{database=proje" + "cts/*/databases/*}/documents:batchGet:\001*" + "0\001\022\274\001\n\020BeginTransaction\022,.google.firesto" + "re.v1.BeginTransactionRequest\032-.google.f" + "irestore.v1.BeginTransactionResponse\"K\202\323" + "\344\223\002E\"@/v1/{database=projects/*/databases" + "/*}/documents:beginTransaction:\001*\022\224\001\n\006Co" + "mmit\022\".google.firestore.v1.CommitRequest" + "\032#.google.firestore.v1.CommitResponse\"A\202" + "\323\344\223\002;\"6/v1/{database=projects/*/database" + "s/*}/documents:commit:\001*\022\215\001\n\010Rollback\022$." + "google.firestore.v1.RollbackRequest\032\026.go" + "ogle.protobuf.Empty\"C\202\323\344\223\002=\"8/v1/{databa" + "se=projects/*/databases/*}/documents:rol" + "lback:\001*\022\337\001\n\010RunQuery\022$.google.firestore" + ".v1.RunQueryRequest\032%.google.firestore.v" + "1.RunQueryResponse\"\203\001\202\323\344\223\002}\"6/v1/{parent" + "=projects/*/databases/*/documents}:runQu" + "ery:\001*Z@\";/v1/{parent=projects/*/databas" + "es/*/documents/*/**}:runQuery:\001*0\001\022\272\001\n\017E" + "xecutePipeline\022+.google.firestore.v1.Exe" + "cutePipelineRequest\032,.google.firestore.v" + "1.ExecutePipelineResponse\"J\202\323\344\223\002D\"\?/v1/{" + "database=projects/*/databases/*}/documen" + "ts:executePipeline:\001*0\001\022\227\002\n\023RunAggregati" + "onQuery\022/.google.firestore.v1.RunAggrega" + "tionQueryRequest\0320.google.firestore.v1.R" + "unAggregationQueryResponse\"\232\001\202\323\344\223\002\223\001\"A/v" + "1/{parent=projects/*/databases/*/documen" + "ts}:runAggregationQuery:\001*ZK\"F/v1/{paren" "t=projects/*/databases/*/documents/*/**}" - ":runQuery:\001*0\001\022\227\002\n\023RunAggregationQuery\022/" - ".google.firestore.v1.RunAggregationQuery" - "Request\0320.google.firestore.v1.RunAggrega" - "tionQueryResponse\"\232\001\202\323\344\223\002\223\001\"A/v1/{parent" - "=projects/*/databases/*/documents}:runAg" - "gregationQuery:\001*ZK\"F/v1/{parent=project" - "s/*/databases/*/documents/*/**}:runAggre" - "gationQuery:\001*0\001\022\224\001\n\005Write\022!.google.fire" - "store.v1.WriteRequest\032\".google.firestore" - ".v1.WriteResponse\"@\202\323\344\223\002:\"5/v1/{database" - "=projects/*/databases/*}/documents:write" - ":\001*(\0010\001\022\230\001\n\006Listen\022\".google.firestore.v1" - ".ListenRequest\032#.google.firestore.v1.Lis" - "tenResponse\"A\202\323\344\223\002;\"6/v1/{database=proje" - "cts/*/databases/*}/documents:listen:\001*(\001" - "0\001\022\213\002\n\021ListCollectionIds\022-.google.firest" - "ore.v1.ListCollectionIdsRequest\032..google" - ".firestore.v1.ListCollectionIdsResponse\"" - "\226\001\202\323\344\223\002\217\001\"\?/v1/{parent=projects/*/databa" - "ses/*/documents}:listCollectionIds:\001*ZI\"" - "D/v1/{parent=projects/*/databases/*/docu" - "ments/*/**}:listCollectionIds:\001*B\262\001\n\027com" - ".google.firestore.v1B\016FirestoreProtoP\001Z<" - "google.golang.org/genproto/googleapis/fi" - "restore/v1;firestore\242\002\004GCFS\252\002\036Google.Clo" - "ud.Firestore.V1Beta1\312\002\036Google\\Cloud\\Fire" - "store\\V1beta1b\006proto3" + ":runAggregationQuery:\001*0\001\022\224\001\n\005Write\022!.go" + "ogle.firestore.v1.WriteRequest\032\".google." + "firestore.v1.WriteResponse\"@\202\323\344\223\002:\"5/v1/" + "{database=projects/*/databases/*}/docume" + "nts:write:\001*(\0010\001\022\230\001\n\006Listen\022\".google.fir" + "estore.v1.ListenRequest\032#.google.firesto" + "re.v1.ListenResponse\"A\202\323\344\223\002;\"6/v1/{datab" + "ase=projects/*/databases/*}/documents:li" + "sten:\001*(\0010\001\022\213\002\n\021ListCollectionIds\022-.goog" + "le.firestore.v1.ListCollectionIdsRequest" + "\032..google.firestore.v1.ListCollectionIds" + "Response\"\226\001\202\323\344\223\002\217\001\"\?/v1/{parent=projects" + "/*/databases/*/documents}:listCollection" + "Ids:\001*ZI\"D/v1/{parent=projects/*/databas" + "es/*/documents/*/**}:listCollectionIds:\001" + "*B\262\001\n\027com.google.firestore.v1B\016Firestore" + "ProtoP\001Z_impl_.query_type_.structured_aggregation_query_; +const ::google::firestore::v1::StructuredPipeline& ExecutePipelineRequest::_Internal::structured_pipeline(const ExecutePipelineRequest* msg) { + return *msg->_impl_.pipeline_type_.structured_pipeline_; } -const ::google::firestore::v1::TransactionOptions& RunAggregationQueryRequest::_Internal::new_transaction(const RunAggregationQueryRequest* msg) { +const ::google::firestore::v1::TransactionOptions& ExecutePipelineRequest::_Internal::new_transaction(const ExecutePipelineRequest* msg) { return *msg->_impl_.consistency_selector_.new_transaction_; } -const ::google::protobuf::Timestamp& RunAggregationQueryRequest::_Internal::read_time(const RunAggregationQueryRequest* msg) { +const ::google::protobuf::Timestamp& ExecutePipelineRequest::_Internal::read_time(const ExecutePipelineRequest* msg) { return *msg->_impl_.consistency_selector_.read_time_; } -void RunAggregationQueryRequest::set_allocated_structured_aggregation_query(::google::firestore::v1::StructuredAggregationQuery* structured_aggregation_query) { +void ExecutePipelineRequest::set_allocated_structured_pipeline(::google::firestore::v1::StructuredPipeline* structured_pipeline) { ::google::protobuf::Arena* message_arena = GetArena(); - clear_query_type(); - if (structured_aggregation_query) { - ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(structured_aggregation_query)->GetArena(); + clear_pipeline_type(); + if (structured_pipeline) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(structured_pipeline)->GetArena(); if (message_arena != submessage_arena) { - structured_aggregation_query = ::google::protobuf::internal::GetOwnedMessage(message_arena, structured_aggregation_query, submessage_arena); + structured_pipeline = ::google::protobuf::internal::GetOwnedMessage(message_arena, structured_pipeline, submessage_arena); } - set_has_structured_aggregation_query(); - _impl_.query_type_.structured_aggregation_query_ = structured_aggregation_query; + set_has_structured_pipeline(); + _impl_.pipeline_type_.structured_pipeline_ = structured_pipeline; } - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunAggregationQueryRequest.structured_aggregation_query) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineRequest.structured_pipeline) } -void RunAggregationQueryRequest::clear_structured_aggregation_query() { +void ExecutePipelineRequest::clear_structured_pipeline() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (query_type_case() == kStructuredAggregationQuery) { + if (pipeline_type_case() == kStructuredPipeline) { if (GetArena() == nullptr) { - delete _impl_.query_type_.structured_aggregation_query_; + delete _impl_.pipeline_type_.structured_pipeline_; } - clear_has_query_type(); + clear_has_pipeline_type(); } } -void RunAggregationQueryRequest::set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* new_transaction) { +void ExecutePipelineRequest::set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* new_transaction) { ::google::protobuf::Arena* message_arena = GetArena(); clear_consistency_selector(); if (new_transaction) { @@ -6357,9 +6463,9 @@ void RunAggregationQueryRequest::set_allocated_new_transaction(::google::firesto set_has_new_transaction(); _impl_.consistency_selector_.new_transaction_ = new_transaction; } - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunAggregationQueryRequest.new_transaction) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineRequest.new_transaction) } -void RunAggregationQueryRequest::clear_new_transaction() { +void ExecutePipelineRequest::clear_new_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (consistency_selector_case() == kNewTransaction) { if (GetArena() == nullptr) { @@ -6368,7 +6474,7 @@ void RunAggregationQueryRequest::clear_new_transaction() { clear_has_consistency_selector(); } } -void RunAggregationQueryRequest::set_allocated_read_time(::google::protobuf::Timestamp* read_time) { +void ExecutePipelineRequest::set_allocated_read_time(::google::protobuf::Timestamp* read_time) { ::google::protobuf::Arena* message_arena = GetArena(); clear_consistency_selector(); if (read_time) { @@ -6379,9 +6485,9 @@ void RunAggregationQueryRequest::set_allocated_read_time(::google::protobuf::Tim set_has_read_time(); _impl_.consistency_selector_.read_time_ = read_time; } - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunAggregationQueryRequest.read_time) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineRequest.read_time) } -void RunAggregationQueryRequest::clear_read_time() { +void ExecutePipelineRequest::clear_read_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (consistency_selector_case() == kReadTime) { if (GetArena() == nullptr) { @@ -6390,34 +6496,34 @@ void RunAggregationQueryRequest::clear_read_time() { clear_has_consistency_selector(); } } -RunAggregationQueryRequest::RunAggregationQueryRequest(::google::protobuf::Arena* arena) +ExecutePipelineRequest::ExecutePipelineRequest(::google::protobuf::Arena* arena) : ::google::protobuf::Message(arena) { SharedCtor(arena); - // @@protoc_insertion_point(arena_constructor:google.firestore.v1.RunAggregationQueryRequest) + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.ExecutePipelineRequest) } -inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryRequest::Impl_::Impl_( +inline PROTOBUF_NDEBUG_INLINE ExecutePipelineRequest::Impl_::Impl_( ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from) - : parent_(arena, from.parent_), - query_type_{}, + : database_(arena, from.database_), + pipeline_type_{}, consistency_selector_{}, _cached_size_{0}, _oneof_case_{from._oneof_case_[0], from._oneof_case_[1]} {} -RunAggregationQueryRequest::RunAggregationQueryRequest( +ExecutePipelineRequest::ExecutePipelineRequest( ::google::protobuf::Arena* arena, - const RunAggregationQueryRequest& from) + const ExecutePipelineRequest& from) : ::google::protobuf::Message(arena) { - RunAggregationQueryRequest* const _this = this; + ExecutePipelineRequest* const _this = this; (void)_this; _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( from._internal_metadata_); new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); - switch (query_type_case()) { - case QUERY_TYPE_NOT_SET: + switch (pipeline_type_case()) { + case PIPELINE_TYPE_NOT_SET: break; - case kStructuredAggregationQuery: - _impl_.query_type_.structured_aggregation_query_ = CreateMaybeMessage<::google::firestore::v1::StructuredAggregationQuery>(arena, *from._impl_.query_type_.structured_aggregation_query_); + case kStructuredPipeline: + _impl_.pipeline_type_.structured_pipeline_ = CreateMaybeMessage<::google::firestore::v1::StructuredPipeline>(arena, *from._impl_.pipeline_type_.structured_pipeline_); break; } switch (consistency_selector_case()) { @@ -6434,30 +6540,30 @@ RunAggregationQueryRequest::RunAggregationQueryRequest( break; } - // @@protoc_insertion_point(copy_constructor:google.firestore.v1.RunAggregationQueryRequest) + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.ExecutePipelineRequest) } -inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryRequest::Impl_::Impl_( +inline PROTOBUF_NDEBUG_INLINE ExecutePipelineRequest::Impl_::Impl_( ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena) - : parent_(arena), - query_type_{}, + : database_(arena), + pipeline_type_{}, consistency_selector_{}, _cached_size_{0}, _oneof_case_{} {} -inline void RunAggregationQueryRequest::SharedCtor(::_pb::Arena* arena) { +inline void ExecutePipelineRequest::SharedCtor(::_pb::Arena* arena) { new (&_impl_) Impl_(internal_visibility(), arena); } -RunAggregationQueryRequest::~RunAggregationQueryRequest() { - // @@protoc_insertion_point(destructor:google.firestore.v1.RunAggregationQueryRequest) +ExecutePipelineRequest::~ExecutePipelineRequest() { + // @@protoc_insertion_point(destructor:google.firestore.v1.ExecutePipelineRequest) _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); SharedDtor(); } -inline void RunAggregationQueryRequest::SharedDtor() { +inline void ExecutePipelineRequest::SharedDtor() { ABSL_DCHECK(GetArena() == nullptr); - _impl_.parent_.Destroy(); - if (has_query_type()) { - clear_query_type(); + _impl_.database_.Destroy(); + if (has_pipeline_type()) { + clear_pipeline_type(); } if (has_consistency_selector()) { clear_consistency_selector(); @@ -6465,25 +6571,25 @@ inline void RunAggregationQueryRequest::SharedDtor() { _impl_.~Impl_(); } -void RunAggregationQueryRequest::clear_query_type() { -// @@protoc_insertion_point(one_of_clear_start:google.firestore.v1.RunAggregationQueryRequest) +void ExecutePipelineRequest::clear_pipeline_type() { +// @@protoc_insertion_point(one_of_clear_start:google.firestore.v1.ExecutePipelineRequest) PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - switch (query_type_case()) { - case kStructuredAggregationQuery: { + switch (pipeline_type_case()) { + case kStructuredPipeline: { if (GetArena() == nullptr) { - delete _impl_.query_type_.structured_aggregation_query_; + delete _impl_.pipeline_type_.structured_pipeline_; } break; } - case QUERY_TYPE_NOT_SET: { + case PIPELINE_TYPE_NOT_SET: { break; } } - _impl_._oneof_case_[0] = QUERY_TYPE_NOT_SET; + _impl_._oneof_case_[0] = PIPELINE_TYPE_NOT_SET; } -void RunAggregationQueryRequest::clear_consistency_selector() { -// @@protoc_insertion_point(one_of_clear_start:google.firestore.v1.RunAggregationQueryRequest) +void ExecutePipelineRequest::clear_consistency_selector() { +// @@protoc_insertion_point(one_of_clear_start:google.firestore.v1.ExecutePipelineRequest) PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); switch (consistency_selector_case()) { case kTransaction: { @@ -6510,20 +6616,20 @@ void RunAggregationQueryRequest::clear_consistency_selector() { } -PROTOBUF_NOINLINE void RunAggregationQueryRequest::Clear() { -// @@protoc_insertion_point(message_clear_start:google.firestore.v1.RunAggregationQueryRequest) +PROTOBUF_NOINLINE void ExecutePipelineRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.ExecutePipelineRequest) PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ::uint32_t cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; - _impl_.parent_.ClearToEmpty(); - clear_query_type(); + _impl_.database_.ClearToEmpty(); + clear_pipeline_type(); clear_consistency_selector(); _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); } -const char* RunAggregationQueryRequest::_InternalParse( +const char* ExecutePipelineRequest::_InternalParse( const char* ptr, ::_pbi::ParseContext* ctx) { ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); return ptr; @@ -6531,89 +6637,89 @@ const char* RunAggregationQueryRequest::_InternalParse( PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 -const ::_pbi::TcParseTable<0, 5, 3, 61, 2> RunAggregationQueryRequest::_table_ = { +const ::_pbi::TcParseTable<0, 5, 3, 59, 2> ExecutePipelineRequest::_table_ = { { 0, // no _has_bits_ 0, // no _extensions_ - 6, 0, // max_field_number, fast_idx_mask + 7, 0, // max_field_number, fast_idx_mask offsetof(decltype(_table_), field_lookup_table), - 4294967236, // skipmap + 4294967180, // skipmap offsetof(decltype(_table_), field_entries), 5, // num_field_entries 3, // num_aux_entries offsetof(decltype(_table_), aux_entries), - &_RunAggregationQueryRequest_default_instance_._instance, + &_ExecutePipelineRequest_default_instance_._instance, ::_pbi::TcParser::GenericFallback, // fallback }, {{ - // string parent = 1; + // string database = 1 [(.google.api.field_behavior) = REQUIRED]; {::_pbi::TcParser::FastUS1, - {10, 63, 0, PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.parent_)}}, + {10, 63, 0, PROTOBUF_FIELD_OFFSET(ExecutePipelineRequest, _impl_.database_)}}, }}, {{ 65535, 65535 }}, {{ - // string parent = 1; - {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.parent_), 0, 0, + // string database = 1 [(.google.api.field_behavior) = REQUIRED]; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineRequest, _impl_.database_), 0, 0, (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)}, - // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; - {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.query_type_.structured_aggregation_query_), _Internal::kOneofCaseOffset + 0, 0, + // .google.firestore.v1.StructuredPipeline structured_pipeline = 2; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineRequest, _impl_.pipeline_type_.structured_pipeline_), _Internal::kOneofCaseOffset + 0, 0, (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, - // bytes transaction = 4; - {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.consistency_selector_.transaction_), _Internal::kOneofCaseOffset + 4, 0, + // bytes transaction = 5; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineRequest, _impl_.consistency_selector_.transaction_), _Internal::kOneofCaseOffset + 4, 0, (0 | ::_fl::kFcOneof | ::_fl::kBytes | ::_fl::kRepAString)}, - // .google.firestore.v1.TransactionOptions new_transaction = 5; - {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.consistency_selector_.new_transaction_), _Internal::kOneofCaseOffset + 4, 1, + // .google.firestore.v1.TransactionOptions new_transaction = 6; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineRequest, _impl_.consistency_selector_.new_transaction_), _Internal::kOneofCaseOffset + 4, 1, (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, - // .google.protobuf.Timestamp read_time = 6; - {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.consistency_selector_.read_time_), _Internal::kOneofCaseOffset + 4, 2, + // .google.protobuf.Timestamp read_time = 7; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineRequest, _impl_.consistency_selector_.read_time_), _Internal::kOneofCaseOffset + 4, 2, (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, }}, {{ - {::_pbi::TcParser::GetTable<::google::firestore::v1::StructuredAggregationQuery>()}, + {::_pbi::TcParser::GetTable<::google::firestore::v1::StructuredPipeline>()}, {::_pbi::TcParser::GetTable<::google::firestore::v1::TransactionOptions>()}, {::_pbi::TcParser::GetTable<::google::protobuf::Timestamp>()}, }}, {{ - "\56\6\0\0\0\0\0\0" - "google.firestore.v1.RunAggregationQueryRequest" - "parent" + "\52\10\0\0\0\0\0\0" + "google.firestore.v1.ExecutePipelineRequest" + "database" }}, }; -::uint8_t* RunAggregationQueryRequest::_InternalSerialize( +::uint8_t* ExecutePipelineRequest::_InternalSerialize( ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.RunAggregationQueryRequest) + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.ExecutePipelineRequest) ::uint32_t cached_has_bits = 0; (void)cached_has_bits; - // string parent = 1; - if (!this->_internal_parent().empty()) { - const std::string& _s = this->_internal_parent(); + // string database = 1 [(.google.api.field_behavior) = REQUIRED]; + if (!this->_internal_database().empty()) { + const std::string& _s = this->_internal_database(); ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( - _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.RunAggregationQueryRequest.parent"); + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.ExecutePipelineRequest.database"); target = stream->WriteStringMaybeAliased(1, _s, target); } - // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; - if (query_type_case() == kStructuredAggregationQuery) { + // .google.firestore.v1.StructuredPipeline structured_pipeline = 2; + if (pipeline_type_case() == kStructuredPipeline) { target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( - 2, _Internal::structured_aggregation_query(this), - _Internal::structured_aggregation_query(this).GetCachedSize(), target, stream); + 2, _Internal::structured_pipeline(this), + _Internal::structured_pipeline(this).GetCachedSize(), target, stream); } switch (consistency_selector_case()) { case kTransaction: { const std::string& _s = this->_internal_transaction(); - target = stream->WriteBytesMaybeAliased(4, _s, target); + target = stream->WriteBytesMaybeAliased(5, _s, target); break; } case kNewTransaction: { target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( - 5, _Internal::new_transaction(this), + 6, _Internal::new_transaction(this), _Internal::new_transaction(this).GetCachedSize(), target, stream); break; } case kReadTime: { target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( - 6, _Internal::read_time(this), + 7, _Internal::read_time(this), _Internal::read_time(this).GetCachedSize(), target, stream); break; } @@ -6625,49 +6731,49 @@ ::uint8_t* RunAggregationQueryRequest::_InternalSerialize( ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); } - // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.RunAggregationQueryRequest) + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.ExecutePipelineRequest) return target; } -::size_t RunAggregationQueryRequest::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.RunAggregationQueryRequest) +::size_t ExecutePipelineRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.ExecutePipelineRequest) ::size_t total_size = 0; ::uint32_t cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; - // string parent = 1; - if (!this->_internal_parent().empty()) { + // string database = 1 [(.google.api.field_behavior) = REQUIRED]; + if (!this->_internal_database().empty()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( - this->_internal_parent()); + this->_internal_database()); } - switch (query_type_case()) { - // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; - case kStructuredAggregationQuery: { + switch (pipeline_type_case()) { + // .google.firestore.v1.StructuredPipeline structured_pipeline = 2; + case kStructuredPipeline: { total_size += - 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.query_type_.structured_aggregation_query_); + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.pipeline_type_.structured_pipeline_); break; } - case QUERY_TYPE_NOT_SET: { + case PIPELINE_TYPE_NOT_SET: { break; } } switch (consistency_selector_case()) { - // bytes transaction = 4; + // bytes transaction = 5; case kTransaction: { total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( this->_internal_transaction()); break; } - // .google.firestore.v1.TransactionOptions new_transaction = 5; + // .google.firestore.v1.TransactionOptions new_transaction = 6; case kNewTransaction: { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.consistency_selector_.new_transaction_); break; } - // .google.protobuf.Timestamp read_time = 6; + // .google.protobuf.Timestamp read_time = 7; case kReadTime: { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.consistency_selector_.read_time_); @@ -6680,32 +6786,32 @@ ::size_t RunAggregationQueryRequest::ByteSizeLong() const { return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); } -const ::google::protobuf::Message::ClassData RunAggregationQueryRequest::_class_data_ = { - RunAggregationQueryRequest::MergeImpl, +const ::google::protobuf::Message::ClassData ExecutePipelineRequest::_class_data_ = { + ExecutePipelineRequest::MergeImpl, nullptr, // OnDemandRegisterArenaDtor }; -const ::google::protobuf::Message::ClassData* RunAggregationQueryRequest::GetClassData() const { +const ::google::protobuf::Message::ClassData* ExecutePipelineRequest::GetClassData() const { return &_class_data_; } -void RunAggregationQueryRequest::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.RunAggregationQueryRequest) +void ExecutePipelineRequest::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.ExecutePipelineRequest) ABSL_DCHECK_NE(&from, _this); ::uint32_t cached_has_bits = 0; (void) cached_has_bits; - if (!from._internal_parent().empty()) { - _this->_internal_set_parent(from._internal_parent()); + if (!from._internal_database().empty()) { + _this->_internal_set_database(from._internal_database()); } - switch (from.query_type_case()) { - case kStructuredAggregationQuery: { - _this->_internal_mutable_structured_aggregation_query()->::google::firestore::v1::StructuredAggregationQuery::MergeFrom( - from._internal_structured_aggregation_query()); + switch (from.pipeline_type_case()) { + case kStructuredPipeline: { + _this->_internal_mutable_structured_pipeline()->::google::firestore::v1::StructuredPipeline::MergeFrom( + from._internal_structured_pipeline()); break; } - case QUERY_TYPE_NOT_SET: { + case PIPELINE_TYPE_NOT_SET: { break; } } @@ -6731,153 +6837,160 @@ void RunAggregationQueryRequest::MergeImpl(::google::protobuf::Message& to_msg, _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); } -void RunAggregationQueryRequest::CopyFrom(const RunAggregationQueryRequest& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.RunAggregationQueryRequest) +void ExecutePipelineRequest::CopyFrom(const ExecutePipelineRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.ExecutePipelineRequest) if (&from == this) return; Clear(); MergeFrom(from); } -PROTOBUF_NOINLINE bool RunAggregationQueryRequest::IsInitialized() const { +PROTOBUF_NOINLINE bool ExecutePipelineRequest::IsInitialized() const { return true; } -::_pbi::CachedSize* RunAggregationQueryRequest::AccessCachedSize() const { +::_pbi::CachedSize* ExecutePipelineRequest::AccessCachedSize() const { return &_impl_._cached_size_; } -void RunAggregationQueryRequest::InternalSwap(RunAggregationQueryRequest* PROTOBUF_RESTRICT other) { +void ExecutePipelineRequest::InternalSwap(ExecutePipelineRequest* PROTOBUF_RESTRICT other) { using std::swap; auto* arena = GetArena(); ABSL_DCHECK_EQ(arena, other->GetArena()); _internal_metadata_.InternalSwap(&other->_internal_metadata_); - ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.parent_, &other->_impl_.parent_, arena); - swap(_impl_.query_type_, other->_impl_.query_type_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.database_, &other->_impl_.database_, arena); + swap(_impl_.pipeline_type_, other->_impl_.pipeline_type_); swap(_impl_.consistency_selector_, other->_impl_.consistency_selector_); swap(_impl_._oneof_case_[0], other->_impl_._oneof_case_[0]); swap(_impl_._oneof_case_[1], other->_impl_._oneof_case_[1]); } -::google::protobuf::Metadata RunAggregationQueryRequest::GetMetadata() const { +::google::protobuf::Metadata ExecutePipelineRequest::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[15]); } // =================================================================== -class RunAggregationQueryResponse::_Internal { +class ExecutePipelineResponse::_Internal { public: - using HasBits = decltype(std::declval()._impl_._has_bits_); + using HasBits = decltype(std::declval()._impl_._has_bits_); static constexpr ::int32_t kHasBitsOffset = - 8 * PROTOBUF_FIELD_OFFSET(RunAggregationQueryResponse, _impl_._has_bits_); - static const ::google::firestore::v1::AggregationResult& result(const RunAggregationQueryResponse* msg); - static void set_has_result(HasBits* has_bits) { + 8 * PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_._has_bits_); + static const ::google::protobuf::Timestamp& execution_time(const ExecutePipelineResponse* msg); + static void set_has_execution_time(HasBits* has_bits) { (*has_bits)[0] |= 1u; } - static const ::google::protobuf::Timestamp& read_time(const RunAggregationQueryResponse* msg); - static void set_has_read_time(HasBits* has_bits) { + static const ::google::firestore::v1::ExplainStats& explain_stats(const ExecutePipelineResponse* msg); + static void set_has_explain_stats(HasBits* has_bits) { (*has_bits)[0] |= 2u; } }; -const ::google::firestore::v1::AggregationResult& RunAggregationQueryResponse::_Internal::result(const RunAggregationQueryResponse* msg) { - return *msg->_impl_.result_; +const ::google::protobuf::Timestamp& ExecutePipelineResponse::_Internal::execution_time(const ExecutePipelineResponse* msg) { + return *msg->_impl_.execution_time_; } -const ::google::protobuf::Timestamp& RunAggregationQueryResponse::_Internal::read_time(const RunAggregationQueryResponse* msg) { - return *msg->_impl_.read_time_; +const ::google::firestore::v1::ExplainStats& ExecutePipelineResponse::_Internal::explain_stats(const ExecutePipelineResponse* msg) { + return *msg->_impl_.explain_stats_; } -void RunAggregationQueryResponse::clear_result() { +void ExecutePipelineResponse::clear_results() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (_impl_.result_ != nullptr) _impl_.result_->Clear(); + _impl_.results_.Clear(); +} +void ExecutePipelineResponse::clear_execution_time() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (_impl_.execution_time_ != nullptr) _impl_.execution_time_->Clear(); _impl_._has_bits_[0] &= ~0x00000001u; } -void RunAggregationQueryResponse::clear_read_time() { +void ExecutePipelineResponse::clear_explain_stats() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (_impl_.read_time_ != nullptr) _impl_.read_time_->Clear(); + if (_impl_.explain_stats_ != nullptr) _impl_.explain_stats_->Clear(); _impl_._has_bits_[0] &= ~0x00000002u; } -RunAggregationQueryResponse::RunAggregationQueryResponse(::google::protobuf::Arena* arena) +ExecutePipelineResponse::ExecutePipelineResponse(::google::protobuf::Arena* arena) : ::google::protobuf::Message(arena) { SharedCtor(arena); - // @@protoc_insertion_point(arena_constructor:google.firestore.v1.RunAggregationQueryResponse) + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.ExecutePipelineResponse) } -inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryResponse::Impl_::Impl_( +inline PROTOBUF_NDEBUG_INLINE ExecutePipelineResponse::Impl_::Impl_( ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from) : _has_bits_{from._has_bits_}, _cached_size_{0}, + results_{visibility, arena, from.results_}, transaction_(arena, from.transaction_) {} -RunAggregationQueryResponse::RunAggregationQueryResponse( +ExecutePipelineResponse::ExecutePipelineResponse( ::google::protobuf::Arena* arena, - const RunAggregationQueryResponse& from) + const ExecutePipelineResponse& from) : ::google::protobuf::Message(arena) { - RunAggregationQueryResponse* const _this = this; + ExecutePipelineResponse* const _this = this; (void)_this; _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( from._internal_metadata_); new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); ::uint32_t cached_has_bits = _impl_._has_bits_[0]; - _impl_.result_ = (cached_has_bits & 0x00000001u) - ? CreateMaybeMessage<::google::firestore::v1::AggregationResult>(arena, *from._impl_.result_) + _impl_.execution_time_ = (cached_has_bits & 0x00000001u) + ? CreateMaybeMessage<::google::protobuf::Timestamp>(arena, *from._impl_.execution_time_) : nullptr; - _impl_.read_time_ = (cached_has_bits & 0x00000002u) - ? CreateMaybeMessage<::google::protobuf::Timestamp>(arena, *from._impl_.read_time_) + _impl_.explain_stats_ = (cached_has_bits & 0x00000002u) + ? CreateMaybeMessage<::google::firestore::v1::ExplainStats>(arena, *from._impl_.explain_stats_) : nullptr; - // @@protoc_insertion_point(copy_constructor:google.firestore.v1.RunAggregationQueryResponse) + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.ExecutePipelineResponse) } -inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryResponse::Impl_::Impl_( +inline PROTOBUF_NDEBUG_INLINE ExecutePipelineResponse::Impl_::Impl_( ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena) : _cached_size_{0}, + results_{visibility, arena}, transaction_(arena) {} -inline void RunAggregationQueryResponse::SharedCtor(::_pb::Arena* arena) { +inline void ExecutePipelineResponse::SharedCtor(::_pb::Arena* arena) { new (&_impl_) Impl_(internal_visibility(), arena); ::memset(reinterpret_cast(&_impl_) + - offsetof(Impl_, result_), + offsetof(Impl_, execution_time_), 0, - offsetof(Impl_, read_time_) - - offsetof(Impl_, result_) + - sizeof(Impl_::read_time_)); + offsetof(Impl_, explain_stats_) - + offsetof(Impl_, execution_time_) + + sizeof(Impl_::explain_stats_)); } -RunAggregationQueryResponse::~RunAggregationQueryResponse() { - // @@protoc_insertion_point(destructor:google.firestore.v1.RunAggregationQueryResponse) +ExecutePipelineResponse::~ExecutePipelineResponse() { + // @@protoc_insertion_point(destructor:google.firestore.v1.ExecutePipelineResponse) _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); SharedDtor(); } -inline void RunAggregationQueryResponse::SharedDtor() { +inline void ExecutePipelineResponse::SharedDtor() { ABSL_DCHECK(GetArena() == nullptr); _impl_.transaction_.Destroy(); - delete _impl_.result_; - delete _impl_.read_time_; + delete _impl_.execution_time_; + delete _impl_.explain_stats_; _impl_.~Impl_(); } -PROTOBUF_NOINLINE void RunAggregationQueryResponse::Clear() { -// @@protoc_insertion_point(message_clear_start:google.firestore.v1.RunAggregationQueryResponse) +PROTOBUF_NOINLINE void ExecutePipelineResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.ExecutePipelineResponse) PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ::uint32_t cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; + _impl_.results_.Clear(); _impl_.transaction_.ClearToEmpty(); cached_has_bits = _impl_._has_bits_[0]; if (cached_has_bits & 0x00000003u) { if (cached_has_bits & 0x00000001u) { - ABSL_DCHECK(_impl_.result_ != nullptr); - _impl_.result_->Clear(); + ABSL_DCHECK(_impl_.execution_time_ != nullptr); + _impl_.execution_time_->Clear(); } if (cached_has_bits & 0x00000002u) { - ABSL_DCHECK(_impl_.read_time_ != nullptr); - _impl_.read_time_->Clear(); + ABSL_DCHECK(_impl_.explain_stats_ != nullptr); + _impl_.explain_stats_->Clear(); } } _impl_._has_bits_.Clear(); _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); } -const char* RunAggregationQueryResponse::_InternalParse( +const char* ExecutePipelineResponse::_InternalParse( const char* ptr, ::_pbi::ParseContext* ctx) { ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); return ptr; @@ -6885,11 +6998,794 @@ const char* RunAggregationQueryResponse::_InternalParse( PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 -const ::_pbi::TcParseTable<2, 3, 2, 0, 2> RunAggregationQueryResponse::_table_ = { +const ::_pbi::TcParseTable<2, 4, 3, 0, 2> ExecutePipelineResponse::_table_ = { { - PROTOBUF_FIELD_OFFSET(RunAggregationQueryResponse, _impl_._has_bits_), + PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_._has_bits_), 0, // no _extensions_ - 3, 24, // max_field_number, fast_idx_mask + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_ExecutePipelineResponse_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // .google.firestore.v1.ExplainStats explain_stats = 4; + {::_pbi::TcParser::FastMtS1, + {34, 1, 2, PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.explain_stats_)}}, + // bytes transaction = 1; + {::_pbi::TcParser::FastBS1, + {10, 63, 0, PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.transaction_)}}, + // repeated .google.firestore.v1.Document results = 2; + {::_pbi::TcParser::FastMtR1, + {18, 63, 0, PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.results_)}}, + // .google.protobuf.Timestamp execution_time = 3; + {::_pbi::TcParser::FastMtS1, + {26, 0, 1, PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.execution_time_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes transaction = 1; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.transaction_), -1, 0, + (0 | ::_fl::kFcSingular | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated .google.firestore.v1.Document results = 2; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.results_), -1, 0, + (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // .google.protobuf.Timestamp execution_time = 3; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.execution_time_), _Internal::kHasBitsOffset + 0, 1, + (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .google.firestore.v1.ExplainStats explain_stats = 4; + {PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.explain_stats_), _Internal::kHasBitsOffset + 1, 2, + (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::firestore::v1::Document>()}, + {::_pbi::TcParser::GetTable<::google::protobuf::Timestamp>()}, + {::_pbi::TcParser::GetTable<::google::firestore::v1::ExplainStats>()}, + }}, {{ + }}, +}; + +::uint8_t* ExecutePipelineResponse::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.ExecutePipelineResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + // bytes transaction = 1; + if (!this->_internal_transaction().empty()) { + const std::string& _s = this->_internal_transaction(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + + // repeated .google.firestore.v1.Document results = 2; + for (unsigned i = 0, + n = static_cast(this->_internal_results_size()); i < n; i++) { + const auto& repfield = this->_internal_results().Get(i); + target = ::google::protobuf::internal::WireFormatLite:: + InternalWriteMessage(2, repfield, repfield.GetCachedSize(), target, stream); + } + + cached_has_bits = _impl_._has_bits_[0]; + // .google.protobuf.Timestamp execution_time = 3; + if (cached_has_bits & 0x00000001u) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, _Internal::execution_time(this), + _Internal::execution_time(this).GetCachedSize(), target, stream); + } + + // .google.firestore.v1.ExplainStats explain_stats = 4; + if (cached_has_bits & 0x00000002u) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, _Internal::explain_stats(this), + _Internal::explain_stats(this).GetCachedSize(), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.ExecutePipelineResponse) + return target; +} + +::size_t ExecutePipelineResponse::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.ExecutePipelineResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .google.firestore.v1.Document results = 2; + total_size += 1UL * this->_internal_results_size(); + for (const auto& msg : this->_internal_results()) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + // bytes transaction = 1; + if (!this->_internal_transaction().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->_internal_transaction()); + } + + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000003u) { + // .google.protobuf.Timestamp execution_time = 3; + if (cached_has_bits & 0x00000001u) { + total_size += + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.execution_time_); + } + + // .google.firestore.v1.ExplainStats explain_stats = 4; + if (cached_has_bits & 0x00000002u) { + total_size += + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.explain_stats_); + } + + } + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData ExecutePipelineResponse::_class_data_ = { + ExecutePipelineResponse::MergeImpl, + nullptr, // OnDemandRegisterArenaDtor +}; +const ::google::protobuf::Message::ClassData* ExecutePipelineResponse::GetClassData() const { + return &_class_data_; +} + +void ExecutePipelineResponse::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.ExecutePipelineResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + _this->_internal_mutable_results()->MergeFrom( + from._internal_results()); + if (!from._internal_transaction().empty()) { + _this->_internal_set_transaction(from._internal_transaction()); + } + cached_has_bits = from._impl_._has_bits_[0]; + if (cached_has_bits & 0x00000003u) { + if (cached_has_bits & 0x00000001u) { + _this->_internal_mutable_execution_time()->::google::protobuf::Timestamp::MergeFrom( + from._internal_execution_time()); + } + if (cached_has_bits & 0x00000002u) { + _this->_internal_mutable_explain_stats()->::google::firestore::v1::ExplainStats::MergeFrom( + from._internal_explain_stats()); + } + } + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void ExecutePipelineResponse::CopyFrom(const ExecutePipelineResponse& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.ExecutePipelineResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool ExecutePipelineResponse::IsInitialized() const { + return true; +} + +::_pbi::CachedSize* ExecutePipelineResponse::AccessCachedSize() const { + return &_impl_._cached_size_; +} +void ExecutePipelineResponse::InternalSwap(ExecutePipelineResponse* PROTOBUF_RESTRICT other) { + using std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.results_.InternalSwap(&other->_impl_.results_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.transaction_, &other->_impl_.transaction_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.explain_stats_) + + sizeof(ExecutePipelineResponse::_impl_.explain_stats_) + - PROTOBUF_FIELD_OFFSET(ExecutePipelineResponse, _impl_.execution_time_)>( + reinterpret_cast(&_impl_.execution_time_), + reinterpret_cast(&other->_impl_.execution_time_)); +} + +::google::protobuf::Metadata ExecutePipelineResponse::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[16]); +} +// =================================================================== + +class RunAggregationQueryRequest::_Internal { + public: + static constexpr ::int32_t kOneofCaseOffset = + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::RunAggregationQueryRequest, _impl_._oneof_case_); + static const ::google::firestore::v1::StructuredAggregationQuery& structured_aggregation_query(const RunAggregationQueryRequest* msg); + static const ::google::firestore::v1::TransactionOptions& new_transaction(const RunAggregationQueryRequest* msg); + static const ::google::protobuf::Timestamp& read_time(const RunAggregationQueryRequest* msg); +}; + +const ::google::firestore::v1::StructuredAggregationQuery& RunAggregationQueryRequest::_Internal::structured_aggregation_query(const RunAggregationQueryRequest* msg) { + return *msg->_impl_.query_type_.structured_aggregation_query_; +} +const ::google::firestore::v1::TransactionOptions& RunAggregationQueryRequest::_Internal::new_transaction(const RunAggregationQueryRequest* msg) { + return *msg->_impl_.consistency_selector_.new_transaction_; +} +const ::google::protobuf::Timestamp& RunAggregationQueryRequest::_Internal::read_time(const RunAggregationQueryRequest* msg) { + return *msg->_impl_.consistency_selector_.read_time_; +} +void RunAggregationQueryRequest::set_allocated_structured_aggregation_query(::google::firestore::v1::StructuredAggregationQuery* structured_aggregation_query) { + ::google::protobuf::Arena* message_arena = GetArena(); + clear_query_type(); + if (structured_aggregation_query) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(structured_aggregation_query)->GetArena(); + if (message_arena != submessage_arena) { + structured_aggregation_query = ::google::protobuf::internal::GetOwnedMessage(message_arena, structured_aggregation_query, submessage_arena); + } + set_has_structured_aggregation_query(); + _impl_.query_type_.structured_aggregation_query_ = structured_aggregation_query; + } + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunAggregationQueryRequest.structured_aggregation_query) +} +void RunAggregationQueryRequest::clear_structured_aggregation_query() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (query_type_case() == kStructuredAggregationQuery) { + if (GetArena() == nullptr) { + delete _impl_.query_type_.structured_aggregation_query_; + } + clear_has_query_type(); + } +} +void RunAggregationQueryRequest::set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* new_transaction) { + ::google::protobuf::Arena* message_arena = GetArena(); + clear_consistency_selector(); + if (new_transaction) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(new_transaction)->GetArena(); + if (message_arena != submessage_arena) { + new_transaction = ::google::protobuf::internal::GetOwnedMessage(message_arena, new_transaction, submessage_arena); + } + set_has_new_transaction(); + _impl_.consistency_selector_.new_transaction_ = new_transaction; + } + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunAggregationQueryRequest.new_transaction) +} +void RunAggregationQueryRequest::clear_new_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (consistency_selector_case() == kNewTransaction) { + if (GetArena() == nullptr) { + delete _impl_.consistency_selector_.new_transaction_; + } + clear_has_consistency_selector(); + } +} +void RunAggregationQueryRequest::set_allocated_read_time(::google::protobuf::Timestamp* read_time) { + ::google::protobuf::Arena* message_arena = GetArena(); + clear_consistency_selector(); + if (read_time) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(read_time)->GetArena(); + if (message_arena != submessage_arena) { + read_time = ::google::protobuf::internal::GetOwnedMessage(message_arena, read_time, submessage_arena); + } + set_has_read_time(); + _impl_.consistency_selector_.read_time_ = read_time; + } + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunAggregationQueryRequest.read_time) +} +void RunAggregationQueryRequest::clear_read_time() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (consistency_selector_case() == kReadTime) { + if (GetArena() == nullptr) { + delete _impl_.consistency_selector_.read_time_; + } + clear_has_consistency_selector(); + } +} +RunAggregationQueryRequest::RunAggregationQueryRequest(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.RunAggregationQueryRequest) +} +inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryRequest::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, + const Impl_& from) + : parent_(arena, from.parent_), + query_type_{}, + consistency_selector_{}, + _cached_size_{0}, + _oneof_case_{from._oneof_case_[0], from._oneof_case_[1]} {} + +RunAggregationQueryRequest::RunAggregationQueryRequest( + ::google::protobuf::Arena* arena, + const RunAggregationQueryRequest& from) + : ::google::protobuf::Message(arena) { + RunAggregationQueryRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); + switch (query_type_case()) { + case QUERY_TYPE_NOT_SET: + break; + case kStructuredAggregationQuery: + _impl_.query_type_.structured_aggregation_query_ = CreateMaybeMessage<::google::firestore::v1::StructuredAggregationQuery>(arena, *from._impl_.query_type_.structured_aggregation_query_); + break; + } + switch (consistency_selector_case()) { + case CONSISTENCY_SELECTOR_NOT_SET: + break; + case kTransaction: + new (&_impl_.consistency_selector_.transaction_) decltype(_impl_.consistency_selector_.transaction_){arena, from._impl_.consistency_selector_.transaction_}; + break; + case kNewTransaction: + _impl_.consistency_selector_.new_transaction_ = CreateMaybeMessage<::google::firestore::v1::TransactionOptions>(arena, *from._impl_.consistency_selector_.new_transaction_); + break; + case kReadTime: + _impl_.consistency_selector_.read_time_ = CreateMaybeMessage<::google::protobuf::Timestamp>(arena, *from._impl_.consistency_selector_.read_time_); + break; + } + + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.RunAggregationQueryRequest) +} +inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryRequest::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena) + : parent_(arena), + query_type_{}, + consistency_selector_{}, + _cached_size_{0}, + _oneof_case_{} {} + +inline void RunAggregationQueryRequest::SharedCtor(::_pb::Arena* arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +RunAggregationQueryRequest::~RunAggregationQueryRequest() { + // @@protoc_insertion_point(destructor:google.firestore.v1.RunAggregationQueryRequest) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void RunAggregationQueryRequest::SharedDtor() { + ABSL_DCHECK(GetArena() == nullptr); + _impl_.parent_.Destroy(); + if (has_query_type()) { + clear_query_type(); + } + if (has_consistency_selector()) { + clear_consistency_selector(); + } + _impl_.~Impl_(); +} + +void RunAggregationQueryRequest::clear_query_type() { +// @@protoc_insertion_point(one_of_clear_start:google.firestore.v1.RunAggregationQueryRequest) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + switch (query_type_case()) { + case kStructuredAggregationQuery: { + if (GetArena() == nullptr) { + delete _impl_.query_type_.structured_aggregation_query_; + } + break; + } + case QUERY_TYPE_NOT_SET: { + break; + } + } + _impl_._oneof_case_[0] = QUERY_TYPE_NOT_SET; +} + +void RunAggregationQueryRequest::clear_consistency_selector() { +// @@protoc_insertion_point(one_of_clear_start:google.firestore.v1.RunAggregationQueryRequest) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + switch (consistency_selector_case()) { + case kTransaction: { + _impl_.consistency_selector_.transaction_.Destroy(); + break; + } + case kNewTransaction: { + if (GetArena() == nullptr) { + delete _impl_.consistency_selector_.new_transaction_; + } + break; + } + case kReadTime: { + if (GetArena() == nullptr) { + delete _impl_.consistency_selector_.read_time_; + } + break; + } + case CONSISTENCY_SELECTOR_NOT_SET: { + break; + } + } + _impl_._oneof_case_[1] = CONSISTENCY_SELECTOR_NOT_SET; +} + + +PROTOBUF_NOINLINE void RunAggregationQueryRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.RunAggregationQueryRequest) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.parent_.ClearToEmpty(); + clear_query_type(); + clear_consistency_selector(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* RunAggregationQueryRequest::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 5, 3, 61, 2> RunAggregationQueryRequest::_table_ = { + { + 0, // no _has_bits_ + 0, // no _extensions_ + 6, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967236, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_RunAggregationQueryRequest_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // string parent = 1; + {::_pbi::TcParser::FastUS1, + {10, 63, 0, PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.parent_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string parent = 1; + {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.parent_), 0, 0, + (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; + {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.query_type_.structured_aggregation_query_), _Internal::kOneofCaseOffset + 0, 0, + (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, + // bytes transaction = 4; + {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.consistency_selector_.transaction_), _Internal::kOneofCaseOffset + 4, 0, + (0 | ::_fl::kFcOneof | ::_fl::kBytes | ::_fl::kRepAString)}, + // .google.firestore.v1.TransactionOptions new_transaction = 5; + {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.consistency_selector_.new_transaction_), _Internal::kOneofCaseOffset + 4, 1, + (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, + // .google.protobuf.Timestamp read_time = 6; + {PROTOBUF_FIELD_OFFSET(RunAggregationQueryRequest, _impl_.consistency_selector_.read_time_), _Internal::kOneofCaseOffset + 4, 2, + (0 | ::_fl::kFcOneof | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::firestore::v1::StructuredAggregationQuery>()}, + {::_pbi::TcParser::GetTable<::google::firestore::v1::TransactionOptions>()}, + {::_pbi::TcParser::GetTable<::google::protobuf::Timestamp>()}, + }}, {{ + "\56\6\0\0\0\0\0\0" + "google.firestore.v1.RunAggregationQueryRequest" + "parent" + }}, +}; + +::uint8_t* RunAggregationQueryRequest::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.RunAggregationQueryRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + // string parent = 1; + if (!this->_internal_parent().empty()) { + const std::string& _s = this->_internal_parent(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.RunAggregationQueryRequest.parent"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + + // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; + if (query_type_case() == kStructuredAggregationQuery) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, _Internal::structured_aggregation_query(this), + _Internal::structured_aggregation_query(this).GetCachedSize(), target, stream); + } + + switch (consistency_selector_case()) { + case kTransaction: { + const std::string& _s = this->_internal_transaction(); + target = stream->WriteBytesMaybeAliased(4, _s, target); + break; + } + case kNewTransaction: { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, _Internal::new_transaction(this), + _Internal::new_transaction(this).GetCachedSize(), target, stream); + break; + } + case kReadTime: { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 6, _Internal::read_time(this), + _Internal::read_time(this).GetCachedSize(), target, stream); + break; + } + default: + break; + } + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.RunAggregationQueryRequest) + return target; +} + +::size_t RunAggregationQueryRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.RunAggregationQueryRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string parent = 1; + if (!this->_internal_parent().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this->_internal_parent()); + } + + switch (query_type_case()) { + // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; + case kStructuredAggregationQuery: { + total_size += + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.query_type_.structured_aggregation_query_); + break; + } + case QUERY_TYPE_NOT_SET: { + break; + } + } + switch (consistency_selector_case()) { + // bytes transaction = 4; + case kTransaction: { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->_internal_transaction()); + break; + } + // .google.firestore.v1.TransactionOptions new_transaction = 5; + case kNewTransaction: { + total_size += + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.consistency_selector_.new_transaction_); + break; + } + // .google.protobuf.Timestamp read_time = 6; + case kReadTime: { + total_size += + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.consistency_selector_.read_time_); + break; + } + case CONSISTENCY_SELECTOR_NOT_SET: { + break; + } + } + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData RunAggregationQueryRequest::_class_data_ = { + RunAggregationQueryRequest::MergeImpl, + nullptr, // OnDemandRegisterArenaDtor +}; +const ::google::protobuf::Message::ClassData* RunAggregationQueryRequest::GetClassData() const { + return &_class_data_; +} + +void RunAggregationQueryRequest::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.RunAggregationQueryRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + if (!from._internal_parent().empty()) { + _this->_internal_set_parent(from._internal_parent()); + } + switch (from.query_type_case()) { + case kStructuredAggregationQuery: { + _this->_internal_mutable_structured_aggregation_query()->::google::firestore::v1::StructuredAggregationQuery::MergeFrom( + from._internal_structured_aggregation_query()); + break; + } + case QUERY_TYPE_NOT_SET: { + break; + } + } + switch (from.consistency_selector_case()) { + case kTransaction: { + _this->_internal_set_transaction(from._internal_transaction()); + break; + } + case kNewTransaction: { + _this->_internal_mutable_new_transaction()->::google::firestore::v1::TransactionOptions::MergeFrom( + from._internal_new_transaction()); + break; + } + case kReadTime: { + _this->_internal_mutable_read_time()->::google::protobuf::Timestamp::MergeFrom( + from._internal_read_time()); + break; + } + case CONSISTENCY_SELECTOR_NOT_SET: { + break; + } + } + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void RunAggregationQueryRequest::CopyFrom(const RunAggregationQueryRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.RunAggregationQueryRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool RunAggregationQueryRequest::IsInitialized() const { + return true; +} + +::_pbi::CachedSize* RunAggregationQueryRequest::AccessCachedSize() const { + return &_impl_._cached_size_; +} +void RunAggregationQueryRequest::InternalSwap(RunAggregationQueryRequest* PROTOBUF_RESTRICT other) { + using std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.parent_, &other->_impl_.parent_, arena); + swap(_impl_.query_type_, other->_impl_.query_type_); + swap(_impl_.consistency_selector_, other->_impl_.consistency_selector_); + swap(_impl_._oneof_case_[0], other->_impl_._oneof_case_[0]); + swap(_impl_._oneof_case_[1], other->_impl_._oneof_case_[1]); +} + +::google::protobuf::Metadata RunAggregationQueryRequest::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[17]); +} +// =================================================================== + +class RunAggregationQueryResponse::_Internal { + public: + using HasBits = decltype(std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RunAggregationQueryResponse, _impl_._has_bits_); + static const ::google::firestore::v1::AggregationResult& result(const RunAggregationQueryResponse* msg); + static void set_has_result(HasBits* has_bits) { + (*has_bits)[0] |= 1u; + } + static const ::google::protobuf::Timestamp& read_time(const RunAggregationQueryResponse* msg); + static void set_has_read_time(HasBits* has_bits) { + (*has_bits)[0] |= 2u; + } +}; + +const ::google::firestore::v1::AggregationResult& RunAggregationQueryResponse::_Internal::result(const RunAggregationQueryResponse* msg) { + return *msg->_impl_.result_; +} +const ::google::protobuf::Timestamp& RunAggregationQueryResponse::_Internal::read_time(const RunAggregationQueryResponse* msg) { + return *msg->_impl_.read_time_; +} +void RunAggregationQueryResponse::clear_result() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (_impl_.result_ != nullptr) _impl_.result_->Clear(); + _impl_._has_bits_[0] &= ~0x00000001u; +} +void RunAggregationQueryResponse::clear_read_time() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (_impl_.read_time_ != nullptr) _impl_.read_time_->Clear(); + _impl_._has_bits_[0] &= ~0x00000002u; +} +RunAggregationQueryResponse::RunAggregationQueryResponse(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.RunAggregationQueryResponse) +} +inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryResponse::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, + const Impl_& from) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + transaction_(arena, from.transaction_) {} + +RunAggregationQueryResponse::RunAggregationQueryResponse( + ::google::protobuf::Arena* arena, + const RunAggregationQueryResponse& from) + : ::google::protobuf::Message(arena) { + RunAggregationQueryResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.result_ = (cached_has_bits & 0x00000001u) + ? CreateMaybeMessage<::google::firestore::v1::AggregationResult>(arena, *from._impl_.result_) + : nullptr; + _impl_.read_time_ = (cached_has_bits & 0x00000002u) + ? CreateMaybeMessage<::google::protobuf::Timestamp>(arena, *from._impl_.read_time_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.RunAggregationQueryResponse) +} +inline PROTOBUF_NDEBUG_INLINE RunAggregationQueryResponse::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena) + : _cached_size_{0}, + transaction_(arena) {} + +inline void RunAggregationQueryResponse::SharedCtor(::_pb::Arena* arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, result_), + 0, + offsetof(Impl_, read_time_) - + offsetof(Impl_, result_) + + sizeof(Impl_::read_time_)); +} +RunAggregationQueryResponse::~RunAggregationQueryResponse() { + // @@protoc_insertion_point(destructor:google.firestore.v1.RunAggregationQueryResponse) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void RunAggregationQueryResponse::SharedDtor() { + ABSL_DCHECK(GetArena() == nullptr); + _impl_.transaction_.Destroy(); + delete _impl_.result_; + delete _impl_.read_time_; + _impl_.~Impl_(); +} + +PROTOBUF_NOINLINE void RunAggregationQueryResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.RunAggregationQueryResponse) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.transaction_.ClearToEmpty(); + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000003u) { + if (cached_has_bits & 0x00000001u) { + ABSL_DCHECK(_impl_.result_ != nullptr); + _impl_.result_->Clear(); + } + if (cached_has_bits & 0x00000002u) { + ABSL_DCHECK(_impl_.read_time_ != nullptr); + _impl_.read_time_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* RunAggregationQueryResponse::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 2, 0, 2> RunAggregationQueryResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RunAggregationQueryResponse, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask offsetof(decltype(_table_), field_lookup_table), 4294967288, // skipmap offsetof(decltype(_table_), field_entries), @@ -7062,7 +7958,7 @@ void RunAggregationQueryResponse::InternalSwap(RunAggregationQueryResponse* PROT ::google::protobuf::Metadata RunAggregationQueryResponse::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[16]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[18]); } // =================================================================== @@ -7072,7 +7968,7 @@ WriteRequest_LabelsEntry_DoNotUse::WriteRequest_LabelsEntry_DoNotUse(::google::p ::google::protobuf::Metadata WriteRequest_LabelsEntry_DoNotUse::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[17]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[19]); } // =================================================================== @@ -7400,7 +8296,7 @@ void WriteRequest::InternalSwap(WriteRequest* PROTOBUF_RESTRICT other) { ::google::protobuf::Metadata WriteRequest::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[18]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[20]); } // =================================================================== @@ -7702,7 +8598,7 @@ void WriteResponse::InternalSwap(WriteResponse* PROTOBUF_RESTRICT other) { ::google::protobuf::Metadata WriteResponse::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[19]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[21]); } // =================================================================== @@ -7712,7 +8608,7 @@ ListenRequest_LabelsEntry_DoNotUse::ListenRequest_LabelsEntry_DoNotUse(::google: ::google::protobuf::Metadata ListenRequest_LabelsEntry_DoNotUse::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[20]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[22]); } // =================================================================== @@ -8069,7 +8965,7 @@ void ListenRequest::InternalSwap(ListenRequest* PROTOBUF_RESTRICT other) { ::google::protobuf::Metadata ListenRequest::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[21]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[23]); } // =================================================================== @@ -8539,7 +9435,7 @@ void ListenResponse::InternalSwap(ListenResponse* PROTOBUF_RESTRICT other) { ::google::protobuf::Metadata ListenResponse::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[22]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[24]); } // =================================================================== @@ -8724,7 +9620,7 @@ void Target_DocumentsTarget::InternalSwap(Target_DocumentsTarget* PROTOBUF_RESTR ::google::protobuf::Metadata Target_DocumentsTarget::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[23]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[25]); } // =================================================================== @@ -9008,7 +9904,7 @@ void Target_QueryTarget::InternalSwap(Target_QueryTarget* PROTOBUF_RESTRICT othe ::google::protobuf::Metadata Target_QueryTarget::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[24]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[26]); } // =================================================================== @@ -9536,7 +10432,7 @@ void Target::InternalSwap(Target* PROTOBUF_RESTRICT other) { ::google::protobuf::Metadata Target::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[25]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[27]); } // =================================================================== @@ -9899,7 +10795,7 @@ void TargetChange::InternalSwap(TargetChange* PROTOBUF_RESTRICT other) { ::google::protobuf::Metadata TargetChange::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[26]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[28]); } // =================================================================== @@ -10145,7 +11041,7 @@ void ListCollectionIdsRequest::InternalSwap(ListCollectionIdsRequest* PROTOBUF_R ::google::protobuf::Metadata ListCollectionIdsRequest::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[27]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[29]); } // =================================================================== @@ -10361,7 +11257,7 @@ void ListCollectionIdsResponse::InternalSwap(ListCollectionIdsResponse* PROTOBUF ::google::protobuf::Metadata ListCollectionIdsResponse::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2ffirestore_2eproto_once, - file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[28]); + file_level_metadata_google_2ffirestore_2fv1_2ffirestore_2eproto[30]); } // @@protoc_insertion_point(namespace_scope) } // namespace v1 diff --git a/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.h b/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.h index 65e0c8bc1b1..d0678e25d8a 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.h +++ b/Firestore/Protos/cpp/google/firestore/v1/firestore.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,9 +55,12 @@ #include "google/protobuf/generated_enum_reflection.h" #include "google/protobuf/unknown_field_set.h" #include "google/api/annotations.pb.h" +#include "google/api/field_behavior.pb.h" #include "google/firestore/v1/aggregation_result.pb.h" #include "google/firestore/v1/common.pb.h" #include "google/firestore/v1/document.pb.h" +#include "google/firestore/v1/explain_stats.pb.h" +#include "google/firestore/v1/pipeline.pb.h" #include "google/firestore/v1/query.pb.h" #include "google/firestore/v1/write.pb.h" #include "google/protobuf/empty.pb.h" @@ -112,6 +115,12 @@ extern CreateDocumentRequestDefaultTypeInternal _CreateDocumentRequest_default_i class DeleteDocumentRequest; struct DeleteDocumentRequestDefaultTypeInternal; extern DeleteDocumentRequestDefaultTypeInternal _DeleteDocumentRequest_default_instance_; +class ExecutePipelineRequest; +struct ExecutePipelineRequestDefaultTypeInternal; +extern ExecutePipelineRequestDefaultTypeInternal _ExecutePipelineRequest_default_instance_; +class ExecutePipelineResponse; +struct ExecutePipelineResponseDefaultTypeInternal; +extern ExecutePipelineResponseDefaultTypeInternal _ExecutePipelineResponse_default_instance_; class GetDocumentRequest; struct GetDocumentRequestDefaultTypeInternal; extern GetDocumentRequestDefaultTypeInternal _GetDocumentRequest_default_instance_; @@ -315,7 +324,7 @@ class Target_DocumentsTarget final : &_Target_DocumentsTarget_default_instance_); } static constexpr int kIndexInFileMessages = - 23; + 25; friend void swap(Target_DocumentsTarget& a, Target_DocumentsTarget& b) { a.Swap(&b); @@ -737,7 +746,7 @@ class ListCollectionIdsResponse final : &_ListCollectionIdsResponse_default_instance_); } static constexpr int kIndexInFileMessages = - 28; + 30; friend void swap(ListCollectionIdsResponse& a, ListCollectionIdsResponse& b) { a.Swap(&b); @@ -948,7 +957,7 @@ class ListCollectionIdsRequest final : &_ListCollectionIdsRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 27; + 29; friend void swap(ListCollectionIdsRequest& a, ListCollectionIdsRequest& b) { a.Swap(&b); @@ -1934,7 +1943,7 @@ class TargetChange final : &_TargetChange_default_instance_); } static constexpr int kIndexInFileMessages = - 26; + 28; friend void swap(TargetChange& a, TargetChange& b) { a.Swap(&b); @@ -2405,7 +2414,7 @@ class WriteResponse final : &_WriteResponse_default_instance_); } static constexpr int kIndexInFileMessages = - 19; + 21; friend void swap(WriteResponse& a, WriteResponse& b) { a.Swap(&b); @@ -3813,7 +3822,7 @@ class RunAggregationQueryResponse final : &_RunAggregationQueryResponse_default_instance_); } static constexpr int kIndexInFileMessages = - 16; + 18; friend void swap(RunAggregationQueryResponse& a, RunAggregationQueryResponse& b) { a.Swap(&b); @@ -4171,26 +4180,26 @@ class ListDocumentsResponse final : friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class CreateDocumentRequest final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.CreateDocumentRequest) */ { +class ExecutePipelineResponse final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.ExecutePipelineResponse) */ { public: - inline CreateDocumentRequest() : CreateDocumentRequest(nullptr) {} - ~CreateDocumentRequest() override; + inline ExecutePipelineResponse() : ExecutePipelineResponse(nullptr) {} + ~ExecutePipelineResponse() override; template - explicit PROTOBUF_CONSTEXPR CreateDocumentRequest(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR ExecutePipelineResponse(::google::protobuf::internal::ConstantInitialized); - inline CreateDocumentRequest(const CreateDocumentRequest& from) - : CreateDocumentRequest(nullptr, from) {} - CreateDocumentRequest(CreateDocumentRequest&& from) noexcept - : CreateDocumentRequest() { + inline ExecutePipelineResponse(const ExecutePipelineResponse& from) + : ExecutePipelineResponse(nullptr, from) {} + ExecutePipelineResponse(ExecutePipelineResponse&& from) noexcept + : ExecutePipelineResponse() { *this = ::std::move(from); } - inline CreateDocumentRequest& operator=(const CreateDocumentRequest& from) { + inline ExecutePipelineResponse& operator=(const ExecutePipelineResponse& from) { CopyFrom(from); return *this; } - inline CreateDocumentRequest& operator=(CreateDocumentRequest&& from) noexcept { + inline ExecutePipelineResponse& operator=(ExecutePipelineResponse&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -4222,20 +4231,20 @@ class CreateDocumentRequest final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const CreateDocumentRequest& default_instance() { + static const ExecutePipelineResponse& default_instance() { return *internal_default_instance(); } - static inline const CreateDocumentRequest* internal_default_instance() { - return reinterpret_cast( - &_CreateDocumentRequest_default_instance_); + static inline const ExecutePipelineResponse* internal_default_instance() { + return reinterpret_cast( + &_ExecutePipelineResponse_default_instance_); } static constexpr int kIndexInFileMessages = - 3; + 16; - friend void swap(CreateDocumentRequest& a, CreateDocumentRequest& b) { + friend void swap(ExecutePipelineResponse& a, ExecutePipelineResponse& b) { a.Swap(&b); } - inline void Swap(CreateDocumentRequest* other) { + inline void Swap(ExecutePipelineResponse* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -4248,7 +4257,7 @@ class CreateDocumentRequest final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(CreateDocumentRequest* other) { + void UnsafeArenaSwap(ExecutePipelineResponse* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -4256,14 +4265,14 @@ class CreateDocumentRequest final : // implements Message ---------------------------------------------- - CreateDocumentRequest* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + ExecutePipelineResponse* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const CreateDocumentRequest& from); + void CopyFrom(const ExecutePipelineResponse& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const CreateDocumentRequest& from) { - CreateDocumentRequest::MergeImpl(*this, from); + void MergeFrom( const ExecutePipelineResponse& from) { + ExecutePipelineResponse::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -4281,16 +4290,16 @@ class CreateDocumentRequest final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(CreateDocumentRequest* other); + void InternalSwap(ExecutePipelineResponse* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.CreateDocumentRequest"; + return "google.firestore.v1.ExecutePipelineResponse"; } protected: - explicit CreateDocumentRequest(::google::protobuf::Arena* arena); - CreateDocumentRequest(::google::protobuf::Arena* arena, const CreateDocumentRequest& from); + explicit ExecutePipelineResponse(::google::protobuf::Arena* arena); + ExecutePipelineResponse(::google::protobuf::Arena* arena, const ExecutePipelineResponse& from); public: static const ClassData _class_data_; @@ -4303,98 +4312,83 @@ class CreateDocumentRequest final : // accessors ------------------------------------------------------- enum : int { - kParentFieldNumber = 1, - kCollectionIdFieldNumber = 2, - kDocumentIdFieldNumber = 3, - kDocumentFieldNumber = 4, - kMaskFieldNumber = 5, + kResultsFieldNumber = 2, + kTransactionFieldNumber = 1, + kExecutionTimeFieldNumber = 3, + kExplainStatsFieldNumber = 4, }; - // string parent = 1; - void clear_parent() ; - const std::string& parent() const; - template - void set_parent(Arg_&& arg, Args_... args); - std::string* mutable_parent(); - PROTOBUF_NODISCARD std::string* release_parent(); - void set_allocated_parent(std::string* value); - + // repeated .google.firestore.v1.Document results = 2; + int results_size() const; private: - const std::string& _internal_parent() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( - const std::string& value); - std::string* _internal_mutable_parent(); + int _internal_results_size() const; public: - // string collection_id = 2; - void clear_collection_id() ; - const std::string& collection_id() const; - template - void set_collection_id(Arg_&& arg, Args_... args); - std::string* mutable_collection_id(); - PROTOBUF_NODISCARD std::string* release_collection_id(); - void set_allocated_collection_id(std::string* value); - + void clear_results() ; + ::google::firestore::v1::Document* mutable_results(int index); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Document >* + mutable_results(); private: - const std::string& _internal_collection_id() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_collection_id( - const std::string& value); - std::string* _internal_mutable_collection_id(); - + const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>& _internal_results() const; + ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>* _internal_mutable_results(); public: - // string document_id = 3; - void clear_document_id() ; - const std::string& document_id() const; + const ::google::firestore::v1::Document& results(int index) const; + ::google::firestore::v1::Document* add_results(); + const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Document >& + results() const; + // bytes transaction = 1; + void clear_transaction() ; + const std::string& transaction() const; template - void set_document_id(Arg_&& arg, Args_... args); - std::string* mutable_document_id(); - PROTOBUF_NODISCARD std::string* release_document_id(); - void set_allocated_document_id(std::string* value); + void set_transaction(Arg_&& arg, Args_... args); + std::string* mutable_transaction(); + PROTOBUF_NODISCARD std::string* release_transaction(); + void set_allocated_transaction(std::string* value); private: - const std::string& _internal_document_id() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_document_id( + const std::string& _internal_transaction() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_transaction( const std::string& value); - std::string* _internal_mutable_document_id(); + std::string* _internal_mutable_transaction(); public: - // .google.firestore.v1.Document document = 4; - bool has_document() const; - void clear_document() ; - const ::google::firestore::v1::Document& document() const; - PROTOBUF_NODISCARD ::google::firestore::v1::Document* release_document(); - ::google::firestore::v1::Document* mutable_document(); - void set_allocated_document(::google::firestore::v1::Document* value); - void unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value); - ::google::firestore::v1::Document* unsafe_arena_release_document(); + // .google.protobuf.Timestamp execution_time = 3; + bool has_execution_time() const; + void clear_execution_time() ; + const ::google::protobuf::Timestamp& execution_time() const; + PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_execution_time(); + ::google::protobuf::Timestamp* mutable_execution_time(); + void set_allocated_execution_time(::google::protobuf::Timestamp* value); + void unsafe_arena_set_allocated_execution_time(::google::protobuf::Timestamp* value); + ::google::protobuf::Timestamp* unsafe_arena_release_execution_time(); private: - const ::google::firestore::v1::Document& _internal_document() const; - ::google::firestore::v1::Document* _internal_mutable_document(); + const ::google::protobuf::Timestamp& _internal_execution_time() const; + ::google::protobuf::Timestamp* _internal_mutable_execution_time(); public: - // .google.firestore.v1.DocumentMask mask = 5; - bool has_mask() const; - void clear_mask() ; - const ::google::firestore::v1::DocumentMask& mask() const; - PROTOBUF_NODISCARD ::google::firestore::v1::DocumentMask* release_mask(); - ::google::firestore::v1::DocumentMask* mutable_mask(); - void set_allocated_mask(::google::firestore::v1::DocumentMask* value); - void unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value); - ::google::firestore::v1::DocumentMask* unsafe_arena_release_mask(); + // .google.firestore.v1.ExplainStats explain_stats = 4; + bool has_explain_stats() const; + void clear_explain_stats() ; + const ::google::firestore::v1::ExplainStats& explain_stats() const; + PROTOBUF_NODISCARD ::google::firestore::v1::ExplainStats* release_explain_stats(); + ::google::firestore::v1::ExplainStats* mutable_explain_stats(); + void set_allocated_explain_stats(::google::firestore::v1::ExplainStats* value); + void unsafe_arena_set_allocated_explain_stats(::google::firestore::v1::ExplainStats* value); + ::google::firestore::v1::ExplainStats* unsafe_arena_release_explain_stats(); private: - const ::google::firestore::v1::DocumentMask& _internal_mask() const; - ::google::firestore::v1::DocumentMask* _internal_mutable_mask(); + const ::google::firestore::v1::ExplainStats& _internal_explain_stats() const; + ::google::firestore::v1::ExplainStats* _internal_mutable_explain_stats(); public: - // @@protoc_insertion_point(class_scope:google.firestore.v1.CreateDocumentRequest) + // @@protoc_insertion_point(class_scope:google.firestore.v1.ExecutePipelineResponse) private: class _Internal; friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 3, 5, 2, - 80, 2> + 2, 4, 3, + 0, 2> _table_; friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; @@ -4412,37 +4406,36 @@ class CreateDocumentRequest final : ::google::protobuf::Arena* arena, const Impl_& from); ::google::protobuf::internal::HasBits<1> _has_bits_; mutable ::google::protobuf::internal::CachedSize _cached_size_; - ::google::protobuf::internal::ArenaStringPtr parent_; - ::google::protobuf::internal::ArenaStringPtr collection_id_; - ::google::protobuf::internal::ArenaStringPtr document_id_; - ::google::firestore::v1::Document* document_; - ::google::firestore::v1::DocumentMask* mask_; + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Document > results_; + ::google::protobuf::internal::ArenaStringPtr transaction_; + ::google::protobuf::Timestamp* execution_time_; + ::google::firestore::v1::ExplainStats* explain_stats_; PROTOBUF_TSAN_DECLARE_MEMBER }; union { Impl_ _impl_; }; friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class BatchGetDocumentsResponse final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.BatchGetDocumentsResponse) */ { +class ExecutePipelineRequest final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.ExecutePipelineRequest) */ { public: - inline BatchGetDocumentsResponse() : BatchGetDocumentsResponse(nullptr) {} - ~BatchGetDocumentsResponse() override; + inline ExecutePipelineRequest() : ExecutePipelineRequest(nullptr) {} + ~ExecutePipelineRequest() override; template - explicit PROTOBUF_CONSTEXPR BatchGetDocumentsResponse(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR ExecutePipelineRequest(::google::protobuf::internal::ConstantInitialized); - inline BatchGetDocumentsResponse(const BatchGetDocumentsResponse& from) - : BatchGetDocumentsResponse(nullptr, from) {} - BatchGetDocumentsResponse(BatchGetDocumentsResponse&& from) noexcept - : BatchGetDocumentsResponse() { + inline ExecutePipelineRequest(const ExecutePipelineRequest& from) + : ExecutePipelineRequest(nullptr, from) {} + ExecutePipelineRequest(ExecutePipelineRequest&& from) noexcept + : ExecutePipelineRequest() { *this = ::std::move(from); } - inline BatchGetDocumentsResponse& operator=(const BatchGetDocumentsResponse& from) { + inline ExecutePipelineRequest& operator=(const ExecutePipelineRequest& from) { CopyFrom(from); return *this; } - inline BatchGetDocumentsResponse& operator=(BatchGetDocumentsResponse&& from) noexcept { + inline ExecutePipelineRequest& operator=(ExecutePipelineRequest&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -4474,26 +4467,32 @@ class BatchGetDocumentsResponse final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const BatchGetDocumentsResponse& default_instance() { + static const ExecutePipelineRequest& default_instance() { return *internal_default_instance(); } - enum ResultCase { - kFound = 1, - kMissing = 2, - RESULT_NOT_SET = 0, + enum PipelineTypeCase { + kStructuredPipeline = 2, + PIPELINE_TYPE_NOT_SET = 0, }; - static inline const BatchGetDocumentsResponse* internal_default_instance() { - return reinterpret_cast( - &_BatchGetDocumentsResponse_default_instance_); + enum ConsistencySelectorCase { + kTransaction = 5, + kNewTransaction = 6, + kReadTime = 7, + CONSISTENCY_SELECTOR_NOT_SET = 0, + }; + + static inline const ExecutePipelineRequest* internal_default_instance() { + return reinterpret_cast( + &_ExecutePipelineRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 7; + 15; - friend void swap(BatchGetDocumentsResponse& a, BatchGetDocumentsResponse& b) { + friend void swap(ExecutePipelineRequest& a, ExecutePipelineRequest& b) { a.Swap(&b); } - inline void Swap(BatchGetDocumentsResponse* other) { + inline void Swap(ExecutePipelineRequest* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -4506,7 +4505,7 @@ class BatchGetDocumentsResponse final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(BatchGetDocumentsResponse* other) { + void UnsafeArenaSwap(ExecutePipelineRequest* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -4514,14 +4513,14 @@ class BatchGetDocumentsResponse final : // implements Message ---------------------------------------------- - BatchGetDocumentsResponse* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + ExecutePipelineRequest* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const BatchGetDocumentsResponse& from); + void CopyFrom(const ExecutePipelineRequest& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const BatchGetDocumentsResponse& from) { - BatchGetDocumentsResponse::MergeImpl(*this, from); + void MergeFrom( const ExecutePipelineRequest& from) { + ExecutePipelineRequest::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -4539,16 +4538,16 @@ class BatchGetDocumentsResponse final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(BatchGetDocumentsResponse* other); + void InternalSwap(ExecutePipelineRequest* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.BatchGetDocumentsResponse"; + return "google.firestore.v1.ExecutePipelineRequest"; } protected: - explicit BatchGetDocumentsResponse(::google::protobuf::Arena* arena); - BatchGetDocumentsResponse(::google::protobuf::Arena* arena, const BatchGetDocumentsResponse& from); + explicit ExecutePipelineRequest(::google::protobuf::Arena* arena); + ExecutePipelineRequest(::google::protobuf::Arena* arena, const ExecutePipelineRequest& from); public: static const ClassData _class_data_; @@ -4561,12 +4560,49 @@ class BatchGetDocumentsResponse final : // accessors ------------------------------------------------------- enum : int { - kTransactionFieldNumber = 3, - kReadTimeFieldNumber = 4, - kFoundFieldNumber = 1, - kMissingFieldNumber = 2, + kDatabaseFieldNumber = 1, + kStructuredPipelineFieldNumber = 2, + kTransactionFieldNumber = 5, + kNewTransactionFieldNumber = 6, + kReadTimeFieldNumber = 7, }; - // bytes transaction = 3; + // string database = 1 [(.google.api.field_behavior) = REQUIRED]; + void clear_database() ; + const std::string& database() const; + template + void set_database(Arg_&& arg, Args_... args); + std::string* mutable_database(); + PROTOBUF_NODISCARD std::string* release_database(); + void set_allocated_database(std::string* value); + + private: + const std::string& _internal_database() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_database( + const std::string& value); + std::string* _internal_mutable_database(); + + public: + // .google.firestore.v1.StructuredPipeline structured_pipeline = 2; + bool has_structured_pipeline() const; + private: + bool _internal_has_structured_pipeline() const; + + public: + void clear_structured_pipeline() ; + const ::google::firestore::v1::StructuredPipeline& structured_pipeline() const; + PROTOBUF_NODISCARD ::google::firestore::v1::StructuredPipeline* release_structured_pipeline(); + ::google::firestore::v1::StructuredPipeline* mutable_structured_pipeline(); + void set_allocated_structured_pipeline(::google::firestore::v1::StructuredPipeline* value); + void unsafe_arena_set_allocated_structured_pipeline(::google::firestore::v1::StructuredPipeline* value); + ::google::firestore::v1::StructuredPipeline* unsafe_arena_release_structured_pipeline(); + + private: + const ::google::firestore::v1::StructuredPipeline& _internal_structured_pipeline() const; + ::google::firestore::v1::StructuredPipeline* _internal_mutable_structured_pipeline(); + + public: + // bytes transaction = 5; + bool has_transaction() const; void clear_transaction() ; const std::string& transaction() const; template @@ -4582,8 +4618,31 @@ class BatchGetDocumentsResponse final : std::string* _internal_mutable_transaction(); public: - // .google.protobuf.Timestamp read_time = 4; + // .google.firestore.v1.TransactionOptions new_transaction = 6; + bool has_new_transaction() const; + private: + bool _internal_has_new_transaction() const; + + public: + void clear_new_transaction() ; + const ::google::firestore::v1::TransactionOptions& new_transaction() const; + PROTOBUF_NODISCARD ::google::firestore::v1::TransactionOptions* release_new_transaction(); + ::google::firestore::v1::TransactionOptions* mutable_new_transaction(); + void set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); + void unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); + ::google::firestore::v1::TransactionOptions* unsafe_arena_release_new_transaction(); + + private: + const ::google::firestore::v1::TransactionOptions& _internal_new_transaction() const; + ::google::firestore::v1::TransactionOptions* _internal_mutable_new_transaction(); + + public: + // .google.protobuf.Timestamp read_time = 7; bool has_read_time() const; + private: + bool _internal_has_read_time() const; + + public: void clear_read_time() ; const ::google::protobuf::Timestamp& read_time() const; PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); @@ -4597,57 +4656,28 @@ class BatchGetDocumentsResponse final : ::google::protobuf::Timestamp* _internal_mutable_read_time(); public: - // .google.firestore.v1.Document found = 1; - bool has_found() const; - private: - bool _internal_has_found() const; + void clear_pipeline_type(); + PipelineTypeCase pipeline_type_case() const; + void clear_consistency_selector(); + ConsistencySelectorCase consistency_selector_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.ExecutePipelineRequest) + private: + class _Internal; + void set_has_structured_pipeline(); + void set_has_transaction(); + void set_has_new_transaction(); + void set_has_read_time(); - public: - void clear_found() ; - const ::google::firestore::v1::Document& found() const; - PROTOBUF_NODISCARD ::google::firestore::v1::Document* release_found(); - ::google::firestore::v1::Document* mutable_found(); - void set_allocated_found(::google::firestore::v1::Document* value); - void unsafe_arena_set_allocated_found(::google::firestore::v1::Document* value); - ::google::firestore::v1::Document* unsafe_arena_release_found(); + inline bool has_pipeline_type() const; + inline void clear_has_pipeline_type(); - private: - const ::google::firestore::v1::Document& _internal_found() const; - ::google::firestore::v1::Document* _internal_mutable_found(); - - public: - // string missing = 2; - bool has_missing() const; - void clear_missing() ; - const std::string& missing() const; - template - void set_missing(Arg_&& arg, Args_... args); - std::string* mutable_missing(); - PROTOBUF_NODISCARD std::string* release_missing(); - void set_allocated_missing(std::string* value); - - private: - const std::string& _internal_missing() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_missing( - const std::string& value); - std::string* _internal_mutable_missing(); - - public: - void clear_result(); - ResultCase result_case() const; - // @@protoc_insertion_point(class_scope:google.firestore.v1.BatchGetDocumentsResponse) - private: - class _Internal; - void set_has_found(); - void set_has_missing(); - - inline bool has_result() const; - inline void clear_has_result(); + inline bool has_consistency_selector() const; + inline void clear_has_consistency_selector(); friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 1, 4, 2, - 61, 2> + 0, 5, 3, + 59, 2> _table_; friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; @@ -4663,17 +4693,21 @@ class BatchGetDocumentsResponse final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - ::google::protobuf::internal::HasBits<1> _has_bits_; - mutable ::google::protobuf::internal::CachedSize _cached_size_; - ::google::protobuf::internal::ArenaStringPtr transaction_; - ::google::protobuf::Timestamp* read_time_; - union ResultUnion { - constexpr ResultUnion() : _constinit_{} {} + ::google::protobuf::internal::ArenaStringPtr database_; + union PipelineTypeUnion { + constexpr PipelineTypeUnion() : _constinit_{} {} ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::firestore::v1::Document* found_; - ::google::protobuf::internal::ArenaStringPtr missing_; - } result_; - ::uint32_t _oneof_case_[1]; + ::google::firestore::v1::StructuredPipeline* structured_pipeline_; + } pipeline_type_; + union ConsistencySelectorUnion { + constexpr ConsistencySelectorUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::protobuf::internal::ArenaStringPtr transaction_; + ::google::firestore::v1::TransactionOptions* new_transaction_; + ::google::protobuf::Timestamp* read_time_; + } consistency_selector_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t _oneof_case_[2]; PROTOBUF_TSAN_DECLARE_MEMBER }; @@ -4681,26 +4715,26 @@ class BatchGetDocumentsResponse final : friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class WriteRequest final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.WriteRequest) */ { +class CreateDocumentRequest final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.CreateDocumentRequest) */ { public: - inline WriteRequest() : WriteRequest(nullptr) {} - ~WriteRequest() override; + inline CreateDocumentRequest() : CreateDocumentRequest(nullptr) {} + ~CreateDocumentRequest() override; template - explicit PROTOBUF_CONSTEXPR WriteRequest(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR CreateDocumentRequest(::google::protobuf::internal::ConstantInitialized); - inline WriteRequest(const WriteRequest& from) - : WriteRequest(nullptr, from) {} - WriteRequest(WriteRequest&& from) noexcept - : WriteRequest() { + inline CreateDocumentRequest(const CreateDocumentRequest& from) + : CreateDocumentRequest(nullptr, from) {} + CreateDocumentRequest(CreateDocumentRequest&& from) noexcept + : CreateDocumentRequest() { *this = ::std::move(from); } - inline WriteRequest& operator=(const WriteRequest& from) { + inline CreateDocumentRequest& operator=(const CreateDocumentRequest& from) { CopyFrom(from); return *this; } - inline WriteRequest& operator=(WriteRequest&& from) noexcept { + inline CreateDocumentRequest& operator=(CreateDocumentRequest&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -4732,20 +4766,20 @@ class WriteRequest final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const WriteRequest& default_instance() { + static const CreateDocumentRequest& default_instance() { return *internal_default_instance(); } - static inline const WriteRequest* internal_default_instance() { - return reinterpret_cast( - &_WriteRequest_default_instance_); + static inline const CreateDocumentRequest* internal_default_instance() { + return reinterpret_cast( + &_CreateDocumentRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 18; + 3; - friend void swap(WriteRequest& a, WriteRequest& b) { + friend void swap(CreateDocumentRequest& a, CreateDocumentRequest& b) { a.Swap(&b); } - inline void Swap(WriteRequest* other) { + inline void Swap(CreateDocumentRequest* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -4758,7 +4792,7 @@ class WriteRequest final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(WriteRequest* other) { + void UnsafeArenaSwap(CreateDocumentRequest* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -4766,14 +4800,14 @@ class WriteRequest final : // implements Message ---------------------------------------------- - WriteRequest* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + CreateDocumentRequest* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const WriteRequest& from); + void CopyFrom(const CreateDocumentRequest& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const WriteRequest& from) { - WriteRequest::MergeImpl(*this, from); + void MergeFrom( const CreateDocumentRequest& from) { + CreateDocumentRequest::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -4791,16 +4825,16 @@ class WriteRequest final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(WriteRequest* other); + void InternalSwap(CreateDocumentRequest* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.WriteRequest"; + return "google.firestore.v1.CreateDocumentRequest"; } protected: - explicit WriteRequest(::google::protobuf::Arena* arena); - WriteRequest(::google::protobuf::Arena* arena, const WriteRequest& from); + explicit CreateDocumentRequest(::google::protobuf::Arena* arena); + CreateDocumentRequest(::google::protobuf::Arena* arena, const CreateDocumentRequest& from); public: static const ClassData _class_data_; @@ -4810,105 +4844,101 @@ class WriteRequest final : // nested types ---------------------------------------------------- - // accessors ------------------------------------------------------- enum : int { - kWritesFieldNumber = 3, - kLabelsFieldNumber = 5, - kDatabaseFieldNumber = 1, - kStreamIdFieldNumber = 2, - kStreamTokenFieldNumber = 4, + kParentFieldNumber = 1, + kCollectionIdFieldNumber = 2, + kDocumentIdFieldNumber = 3, + kDocumentFieldNumber = 4, + kMaskFieldNumber = 5, }; - // repeated .google.firestore.v1.Write writes = 3; - int writes_size() const; - private: - int _internal_writes_size() const; + // string parent = 1; + void clear_parent() ; + const std::string& parent() const; + template + void set_parent(Arg_&& arg, Args_... args); + std::string* mutable_parent(); + PROTOBUF_NODISCARD std::string* release_parent(); + void set_allocated_parent(std::string* value); - public: - void clear_writes() ; - ::google::firestore::v1::Write* mutable_writes(int index); - ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >* - mutable_writes(); - private: - const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& _internal_writes() const; - ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* _internal_mutable_writes(); - public: - const ::google::firestore::v1::Write& writes(int index) const; - ::google::firestore::v1::Write* add_writes(); - const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >& - writes() const; - // map labels = 5; - int labels_size() const; private: - int _internal_labels_size() const; + const std::string& _internal_parent() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( + const std::string& value); + std::string* _internal_mutable_parent(); public: - void clear_labels() ; - const ::google::protobuf::Map& labels() const; - ::google::protobuf::Map* mutable_labels(); + // string collection_id = 2; + void clear_collection_id() ; + const std::string& collection_id() const; + template + void set_collection_id(Arg_&& arg, Args_... args); + std::string* mutable_collection_id(); + PROTOBUF_NODISCARD std::string* release_collection_id(); + void set_allocated_collection_id(std::string* value); private: - const ::google::protobuf::Map& _internal_labels() const; - ::google::protobuf::Map* _internal_mutable_labels(); + const std::string& _internal_collection_id() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_collection_id( + const std::string& value); + std::string* _internal_mutable_collection_id(); public: - // string database = 1; - void clear_database() ; - const std::string& database() const; + // string document_id = 3; + void clear_document_id() ; + const std::string& document_id() const; template - void set_database(Arg_&& arg, Args_... args); - std::string* mutable_database(); - PROTOBUF_NODISCARD std::string* release_database(); - void set_allocated_database(std::string* value); + void set_document_id(Arg_&& arg, Args_... args); + std::string* mutable_document_id(); + PROTOBUF_NODISCARD std::string* release_document_id(); + void set_allocated_document_id(std::string* value); private: - const std::string& _internal_database() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_database( + const std::string& _internal_document_id() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_document_id( const std::string& value); - std::string* _internal_mutable_database(); + std::string* _internal_mutable_document_id(); public: - // string stream_id = 2; - void clear_stream_id() ; - const std::string& stream_id() const; - template - void set_stream_id(Arg_&& arg, Args_... args); - std::string* mutable_stream_id(); - PROTOBUF_NODISCARD std::string* release_stream_id(); - void set_allocated_stream_id(std::string* value); + // .google.firestore.v1.Document document = 4; + bool has_document() const; + void clear_document() ; + const ::google::firestore::v1::Document& document() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Document* release_document(); + ::google::firestore::v1::Document* mutable_document(); + void set_allocated_document(::google::firestore::v1::Document* value); + void unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value); + ::google::firestore::v1::Document* unsafe_arena_release_document(); private: - const std::string& _internal_stream_id() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_stream_id( - const std::string& value); - std::string* _internal_mutable_stream_id(); + const ::google::firestore::v1::Document& _internal_document() const; + ::google::firestore::v1::Document* _internal_mutable_document(); public: - // bytes stream_token = 4; - void clear_stream_token() ; - const std::string& stream_token() const; - template - void set_stream_token(Arg_&& arg, Args_... args); - std::string* mutable_stream_token(); - PROTOBUF_NODISCARD std::string* release_stream_token(); - void set_allocated_stream_token(std::string* value); + // .google.firestore.v1.DocumentMask mask = 5; + bool has_mask() const; + void clear_mask() ; + const ::google::firestore::v1::DocumentMask& mask() const; + PROTOBUF_NODISCARD ::google::firestore::v1::DocumentMask* release_mask(); + ::google::firestore::v1::DocumentMask* mutable_mask(); + void set_allocated_mask(::google::firestore::v1::DocumentMask* value); + void unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value); + ::google::firestore::v1::DocumentMask* unsafe_arena_release_mask(); private: - const std::string& _internal_stream_token() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_stream_token( - const std::string& value); - std::string* _internal_mutable_stream_token(); + const ::google::firestore::v1::DocumentMask& _internal_mask() const; + ::google::firestore::v1::DocumentMask* _internal_mutable_mask(); public: - // @@protoc_insertion_point(class_scope:google.firestore.v1.WriteRequest) + // @@protoc_insertion_point(class_scope:google.firestore.v1.CreateDocumentRequest) private: class _Internal; friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 2, 5, 2, - 64, 2> + 3, 5, 2, + 80, 2> _table_; friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; @@ -4924,41 +4954,39 @@ class WriteRequest final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write > writes_; - ::google::protobuf::internal::MapField - labels_; - ::google::protobuf::internal::ArenaStringPtr database_; - ::google::protobuf::internal::ArenaStringPtr stream_id_; - ::google::protobuf::internal::ArenaStringPtr stream_token_; + ::google::protobuf::internal::HasBits<1> _has_bits_; mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr parent_; + ::google::protobuf::internal::ArenaStringPtr collection_id_; + ::google::protobuf::internal::ArenaStringPtr document_id_; + ::google::firestore::v1::Document* document_; + ::google::firestore::v1::DocumentMask* mask_; PROTOBUF_TSAN_DECLARE_MEMBER }; union { Impl_ _impl_; }; friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class Target_QueryTarget final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Target.QueryTarget) */ { +class BatchGetDocumentsResponse final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.BatchGetDocumentsResponse) */ { public: - inline Target_QueryTarget() : Target_QueryTarget(nullptr) {} - ~Target_QueryTarget() override; + inline BatchGetDocumentsResponse() : BatchGetDocumentsResponse(nullptr) {} + ~BatchGetDocumentsResponse() override; template - explicit PROTOBUF_CONSTEXPR Target_QueryTarget(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR BatchGetDocumentsResponse(::google::protobuf::internal::ConstantInitialized); - inline Target_QueryTarget(const Target_QueryTarget& from) - : Target_QueryTarget(nullptr, from) {} - Target_QueryTarget(Target_QueryTarget&& from) noexcept - : Target_QueryTarget() { + inline BatchGetDocumentsResponse(const BatchGetDocumentsResponse& from) + : BatchGetDocumentsResponse(nullptr, from) {} + BatchGetDocumentsResponse(BatchGetDocumentsResponse&& from) noexcept + : BatchGetDocumentsResponse() { *this = ::std::move(from); } - inline Target_QueryTarget& operator=(const Target_QueryTarget& from) { + inline BatchGetDocumentsResponse& operator=(const BatchGetDocumentsResponse& from) { CopyFrom(from); return *this; } - inline Target_QueryTarget& operator=(Target_QueryTarget&& from) noexcept { + inline BatchGetDocumentsResponse& operator=(BatchGetDocumentsResponse&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -4990,25 +5018,26 @@ class Target_QueryTarget final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const Target_QueryTarget& default_instance() { + static const BatchGetDocumentsResponse& default_instance() { return *internal_default_instance(); } - enum QueryTypeCase { - kStructuredQuery = 2, - QUERY_TYPE_NOT_SET = 0, + enum ResultCase { + kFound = 1, + kMissing = 2, + RESULT_NOT_SET = 0, }; - static inline const Target_QueryTarget* internal_default_instance() { - return reinterpret_cast( - &_Target_QueryTarget_default_instance_); + static inline const BatchGetDocumentsResponse* internal_default_instance() { + return reinterpret_cast( + &_BatchGetDocumentsResponse_default_instance_); } static constexpr int kIndexInFileMessages = - 24; + 7; - friend void swap(Target_QueryTarget& a, Target_QueryTarget& b) { + friend void swap(BatchGetDocumentsResponse& a, BatchGetDocumentsResponse& b) { a.Swap(&b); } - inline void Swap(Target_QueryTarget* other) { + inline void Swap(BatchGetDocumentsResponse* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -5021,7 +5050,7 @@ class Target_QueryTarget final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(Target_QueryTarget* other) { + void UnsafeArenaSwap(BatchGetDocumentsResponse* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -5029,14 +5058,14 @@ class Target_QueryTarget final : // implements Message ---------------------------------------------- - Target_QueryTarget* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + BatchGetDocumentsResponse* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const Target_QueryTarget& from); + void CopyFrom(const BatchGetDocumentsResponse& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const Target_QueryTarget& from) { - Target_QueryTarget::MergeImpl(*this, from); + void MergeFrom( const BatchGetDocumentsResponse& from) { + BatchGetDocumentsResponse::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -5054,16 +5083,16 @@ class Target_QueryTarget final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(Target_QueryTarget* other); + void InternalSwap(BatchGetDocumentsResponse* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.Target.QueryTarget"; + return "google.firestore.v1.BatchGetDocumentsResponse"; } protected: - explicit Target_QueryTarget(::google::protobuf::Arena* arena); - Target_QueryTarget(::google::protobuf::Arena* arena, const Target_QueryTarget& from); + explicit BatchGetDocumentsResponse(::google::protobuf::Arena* arena); + BatchGetDocumentsResponse(::google::protobuf::Arena* arena, const BatchGetDocumentsResponse& from); public: static const ClassData _class_data_; @@ -5076,58 +5105,93 @@ class Target_QueryTarget final : // accessors ------------------------------------------------------- enum : int { - kParentFieldNumber = 1, - kStructuredQueryFieldNumber = 2, + kTransactionFieldNumber = 3, + kReadTimeFieldNumber = 4, + kFoundFieldNumber = 1, + kMissingFieldNumber = 2, }; - // string parent = 1; - void clear_parent() ; - const std::string& parent() const; + // bytes transaction = 3; + void clear_transaction() ; + const std::string& transaction() const; template - void set_parent(Arg_&& arg, Args_... args); - std::string* mutable_parent(); - PROTOBUF_NODISCARD std::string* release_parent(); - void set_allocated_parent(std::string* value); + void set_transaction(Arg_&& arg, Args_... args); + std::string* mutable_transaction(); + PROTOBUF_NODISCARD std::string* release_transaction(); + void set_allocated_transaction(std::string* value); private: - const std::string& _internal_parent() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( + const std::string& _internal_transaction() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_transaction( const std::string& value); - std::string* _internal_mutable_parent(); + std::string* _internal_mutable_transaction(); public: - // .google.firestore.v1.StructuredQuery structured_query = 2; - bool has_structured_query() const; + // .google.protobuf.Timestamp read_time = 4; + bool has_read_time() const; + void clear_read_time() ; + const ::google::protobuf::Timestamp& read_time() const; + PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); + ::google::protobuf::Timestamp* mutable_read_time(); + void set_allocated_read_time(::google::protobuf::Timestamp* value); + void unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value); + ::google::protobuf::Timestamp* unsafe_arena_release_read_time(); + private: - bool _internal_has_structured_query() const; + const ::google::protobuf::Timestamp& _internal_read_time() const; + ::google::protobuf::Timestamp* _internal_mutable_read_time(); public: - void clear_structured_query() ; - const ::google::firestore::v1::StructuredQuery& structured_query() const; - PROTOBUF_NODISCARD ::google::firestore::v1::StructuredQuery* release_structured_query(); - ::google::firestore::v1::StructuredQuery* mutable_structured_query(); - void set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); - void unsafe_arena_set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); - ::google::firestore::v1::StructuredQuery* unsafe_arena_release_structured_query(); + // .google.firestore.v1.Document found = 1; + bool has_found() const; + private: + bool _internal_has_found() const; + + public: + void clear_found() ; + const ::google::firestore::v1::Document& found() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Document* release_found(); + ::google::firestore::v1::Document* mutable_found(); + void set_allocated_found(::google::firestore::v1::Document* value); + void unsafe_arena_set_allocated_found(::google::firestore::v1::Document* value); + ::google::firestore::v1::Document* unsafe_arena_release_found(); private: - const ::google::firestore::v1::StructuredQuery& _internal_structured_query() const; - ::google::firestore::v1::StructuredQuery* _internal_mutable_structured_query(); + const ::google::firestore::v1::Document& _internal_found() const; + ::google::firestore::v1::Document* _internal_mutable_found(); public: - void clear_query_type(); - QueryTypeCase query_type_case() const; - // @@protoc_insertion_point(class_scope:google.firestore.v1.Target.QueryTarget) + // string missing = 2; + bool has_missing() const; + void clear_missing() ; + const std::string& missing() const; + template + void set_missing(Arg_&& arg, Args_... args); + std::string* mutable_missing(); + PROTOBUF_NODISCARD std::string* release_missing(); + void set_allocated_missing(std::string* value); + + private: + const std::string& _internal_missing() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_missing( + const std::string& value); + std::string* _internal_mutable_missing(); + + public: + void clear_result(); + ResultCase result_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.BatchGetDocumentsResponse) private: class _Internal; - void set_has_structured_query(); + void set_has_found(); + void set_has_missing(); - inline bool has_query_type() const; - inline void clear_has_query_type(); + inline bool has_result() const; + inline void clear_has_result(); friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 0, 2, 1, - 53, 2> + 1, 4, 2, + 61, 2> _table_; friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; @@ -5143,13 +5207,16 @@ class Target_QueryTarget final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - ::google::protobuf::internal::ArenaStringPtr parent_; - union QueryTypeUnion { - constexpr QueryTypeUnion() : _constinit_{} {} - ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::firestore::v1::StructuredQuery* structured_query_; - } query_type_; + ::google::protobuf::internal::HasBits<1> _has_bits_; mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr transaction_; + ::google::protobuf::Timestamp* read_time_; + union ResultUnion { + constexpr ResultUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::firestore::v1::Document* found_; + ::google::protobuf::internal::ArenaStringPtr missing_; + } result_; ::uint32_t _oneof_case_[1]; PROTOBUF_TSAN_DECLARE_MEMBER @@ -5158,26 +5225,26 @@ class Target_QueryTarget final : friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class RunQueryRequest final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.RunQueryRequest) */ { +class WriteRequest final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.WriteRequest) */ { public: - inline RunQueryRequest() : RunQueryRequest(nullptr) {} - ~RunQueryRequest() override; + inline WriteRequest() : WriteRequest(nullptr) {} + ~WriteRequest() override; template - explicit PROTOBUF_CONSTEXPR RunQueryRequest(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR WriteRequest(::google::protobuf::internal::ConstantInitialized); - inline RunQueryRequest(const RunQueryRequest& from) - : RunQueryRequest(nullptr, from) {} - RunQueryRequest(RunQueryRequest&& from) noexcept - : RunQueryRequest() { + inline WriteRequest(const WriteRequest& from) + : WriteRequest(nullptr, from) {} + WriteRequest(WriteRequest&& from) noexcept + : WriteRequest() { *this = ::std::move(from); } - inline RunQueryRequest& operator=(const RunQueryRequest& from) { + inline WriteRequest& operator=(const WriteRequest& from) { CopyFrom(from); return *this; } - inline RunQueryRequest& operator=(RunQueryRequest&& from) noexcept { + inline WriteRequest& operator=(WriteRequest&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -5209,32 +5276,20 @@ class RunQueryRequest final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const RunQueryRequest& default_instance() { + static const WriteRequest& default_instance() { return *internal_default_instance(); } - enum QueryTypeCase { - kStructuredQuery = 2, - QUERY_TYPE_NOT_SET = 0, - }; - - enum ConsistencySelectorCase { - kTransaction = 5, - kNewTransaction = 6, - kReadTime = 7, - CONSISTENCY_SELECTOR_NOT_SET = 0, - }; - - static inline const RunQueryRequest* internal_default_instance() { - return reinterpret_cast( - &_RunQueryRequest_default_instance_); + static inline const WriteRequest* internal_default_instance() { + return reinterpret_cast( + &_WriteRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 13; + 20; - friend void swap(RunQueryRequest& a, RunQueryRequest& b) { + friend void swap(WriteRequest& a, WriteRequest& b) { a.Swap(&b); } - inline void Swap(RunQueryRequest* other) { + inline void Swap(WriteRequest* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -5247,7 +5302,7 @@ class RunQueryRequest final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(RunQueryRequest* other) { + void UnsafeArenaSwap(WriteRequest* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -5255,14 +5310,14 @@ class RunQueryRequest final : // implements Message ---------------------------------------------- - RunQueryRequest* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + WriteRequest* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const RunQueryRequest& from); + void CopyFrom(const WriteRequest& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const RunQueryRequest& from) { - RunQueryRequest::MergeImpl(*this, from); + void MergeFrom( const WriteRequest& from) { + WriteRequest::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -5280,16 +5335,16 @@ class RunQueryRequest final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(RunQueryRequest* other); + void InternalSwap(WriteRequest* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.RunQueryRequest"; + return "google.firestore.v1.WriteRequest"; } protected: - explicit RunQueryRequest(::google::protobuf::Arena* arena); - RunQueryRequest(::google::protobuf::Arena* arena, const RunQueryRequest& from); + explicit WriteRequest(::google::protobuf::Arena* arena); + WriteRequest(::google::protobuf::Arena* arena, const WriteRequest& from); public: static const ClassData _class_data_; @@ -5299,127 +5354,105 @@ class RunQueryRequest final : // nested types ---------------------------------------------------- + // accessors ------------------------------------------------------- enum : int { - kParentFieldNumber = 1, - kStructuredQueryFieldNumber = 2, - kTransactionFieldNumber = 5, - kNewTransactionFieldNumber = 6, - kReadTimeFieldNumber = 7, + kWritesFieldNumber = 3, + kLabelsFieldNumber = 5, + kDatabaseFieldNumber = 1, + kStreamIdFieldNumber = 2, + kStreamTokenFieldNumber = 4, }; - // string parent = 1; - void clear_parent() ; - const std::string& parent() const; - template - void set_parent(Arg_&& arg, Args_... args); - std::string* mutable_parent(); - PROTOBUF_NODISCARD std::string* release_parent(); - void set_allocated_parent(std::string* value); - + // repeated .google.firestore.v1.Write writes = 3; + int writes_size() const; private: - const std::string& _internal_parent() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( - const std::string& value); - std::string* _internal_mutable_parent(); + int _internal_writes_size() const; public: - // .google.firestore.v1.StructuredQuery structured_query = 2; - bool has_structured_query() const; + void clear_writes() ; + ::google::firestore::v1::Write* mutable_writes(int index); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >* + mutable_writes(); private: - bool _internal_has_structured_query() const; + const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& _internal_writes() const; + ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* _internal_mutable_writes(); + public: + const ::google::firestore::v1::Write& writes(int index) const; + ::google::firestore::v1::Write* add_writes(); + const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >& + writes() const; + // map labels = 5; + int labels_size() const; + private: + int _internal_labels_size() const; public: - void clear_structured_query() ; - const ::google::firestore::v1::StructuredQuery& structured_query() const; - PROTOBUF_NODISCARD ::google::firestore::v1::StructuredQuery* release_structured_query(); - ::google::firestore::v1::StructuredQuery* mutable_structured_query(); - void set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); - void unsafe_arena_set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); - ::google::firestore::v1::StructuredQuery* unsafe_arena_release_structured_query(); + void clear_labels() ; + const ::google::protobuf::Map& labels() const; + ::google::protobuf::Map* mutable_labels(); private: - const ::google::firestore::v1::StructuredQuery& _internal_structured_query() const; - ::google::firestore::v1::StructuredQuery* _internal_mutable_structured_query(); + const ::google::protobuf::Map& _internal_labels() const; + ::google::protobuf::Map* _internal_mutable_labels(); public: - // bytes transaction = 5; - bool has_transaction() const; - void clear_transaction() ; - const std::string& transaction() const; + // string database = 1; + void clear_database() ; + const std::string& database() const; template - void set_transaction(Arg_&& arg, Args_... args); - std::string* mutable_transaction(); - PROTOBUF_NODISCARD std::string* release_transaction(); - void set_allocated_transaction(std::string* value); + void set_database(Arg_&& arg, Args_... args); + std::string* mutable_database(); + PROTOBUF_NODISCARD std::string* release_database(); + void set_allocated_database(std::string* value); private: - const std::string& _internal_transaction() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_transaction( + const std::string& _internal_database() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_database( const std::string& value); - std::string* _internal_mutable_transaction(); - - public: - // .google.firestore.v1.TransactionOptions new_transaction = 6; - bool has_new_transaction() const; - private: - bool _internal_has_new_transaction() const; + std::string* _internal_mutable_database(); public: - void clear_new_transaction() ; - const ::google::firestore::v1::TransactionOptions& new_transaction() const; - PROTOBUF_NODISCARD ::google::firestore::v1::TransactionOptions* release_new_transaction(); - ::google::firestore::v1::TransactionOptions* mutable_new_transaction(); - void set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); - void unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); - ::google::firestore::v1::TransactionOptions* unsafe_arena_release_new_transaction(); - - private: - const ::google::firestore::v1::TransactionOptions& _internal_new_transaction() const; - ::google::firestore::v1::TransactionOptions* _internal_mutable_new_transaction(); + // string stream_id = 2; + void clear_stream_id() ; + const std::string& stream_id() const; + template + void set_stream_id(Arg_&& arg, Args_... args); + std::string* mutable_stream_id(); + PROTOBUF_NODISCARD std::string* release_stream_id(); + void set_allocated_stream_id(std::string* value); - public: - // .google.protobuf.Timestamp read_time = 7; - bool has_read_time() const; private: - bool _internal_has_read_time() const; + const std::string& _internal_stream_id() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_stream_id( + const std::string& value); + std::string* _internal_mutable_stream_id(); public: - void clear_read_time() ; - const ::google::protobuf::Timestamp& read_time() const; - PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); - ::google::protobuf::Timestamp* mutable_read_time(); - void set_allocated_read_time(::google::protobuf::Timestamp* value); - void unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value); - ::google::protobuf::Timestamp* unsafe_arena_release_read_time(); + // bytes stream_token = 4; + void clear_stream_token() ; + const std::string& stream_token() const; + template + void set_stream_token(Arg_&& arg, Args_... args); + std::string* mutable_stream_token(); + PROTOBUF_NODISCARD std::string* release_stream_token(); + void set_allocated_stream_token(std::string* value); private: - const ::google::protobuf::Timestamp& _internal_read_time() const; - ::google::protobuf::Timestamp* _internal_mutable_read_time(); + const std::string& _internal_stream_token() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_stream_token( + const std::string& value); + std::string* _internal_mutable_stream_token(); public: - void clear_query_type(); - QueryTypeCase query_type_case() const; - void clear_consistency_selector(); - ConsistencySelectorCase consistency_selector_case() const; - // @@protoc_insertion_point(class_scope:google.firestore.v1.RunQueryRequest) + // @@protoc_insertion_point(class_scope:google.firestore.v1.WriteRequest) private: class _Internal; - void set_has_structured_query(); - void set_has_transaction(); - void set_has_new_transaction(); - void set_has_read_time(); - - inline bool has_query_type() const; - inline void clear_has_query_type(); - - inline bool has_consistency_selector() const; - inline void clear_has_consistency_selector(); friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 0, 5, 3, - 50, 2> + 2, 5, 2, + 64, 2> _table_; friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; @@ -5435,48 +5468,41 @@ class RunQueryRequest final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - ::google::protobuf::internal::ArenaStringPtr parent_; - union QueryTypeUnion { - constexpr QueryTypeUnion() : _constinit_{} {} - ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::firestore::v1::StructuredQuery* structured_query_; - } query_type_; - union ConsistencySelectorUnion { - constexpr ConsistencySelectorUnion() : _constinit_{} {} - ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::protobuf::internal::ArenaStringPtr transaction_; - ::google::firestore::v1::TransactionOptions* new_transaction_; - ::google::protobuf::Timestamp* read_time_; - } consistency_selector_; + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write > writes_; + ::google::protobuf::internal::MapField + labels_; + ::google::protobuf::internal::ArenaStringPtr database_; + ::google::protobuf::internal::ArenaStringPtr stream_id_; + ::google::protobuf::internal::ArenaStringPtr stream_token_; mutable ::google::protobuf::internal::CachedSize _cached_size_; - ::uint32_t _oneof_case_[2]; - PROTOBUF_TSAN_DECLARE_MEMBER }; union { Impl_ _impl_; }; friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class ListenResponse final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.ListenResponse) */ { +class Target_QueryTarget final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Target.QueryTarget) */ { public: - inline ListenResponse() : ListenResponse(nullptr) {} - ~ListenResponse() override; + inline Target_QueryTarget() : Target_QueryTarget(nullptr) {} + ~Target_QueryTarget() override; template - explicit PROTOBUF_CONSTEXPR ListenResponse(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR Target_QueryTarget(::google::protobuf::internal::ConstantInitialized); - inline ListenResponse(const ListenResponse& from) - : ListenResponse(nullptr, from) {} - ListenResponse(ListenResponse&& from) noexcept - : ListenResponse() { + inline Target_QueryTarget(const Target_QueryTarget& from) + : Target_QueryTarget(nullptr, from) {} + Target_QueryTarget(Target_QueryTarget&& from) noexcept + : Target_QueryTarget() { *this = ::std::move(from); } - inline ListenResponse& operator=(const ListenResponse& from) { + inline Target_QueryTarget& operator=(const Target_QueryTarget& from) { CopyFrom(from); return *this; } - inline ListenResponse& operator=(ListenResponse&& from) noexcept { + inline Target_QueryTarget& operator=(Target_QueryTarget&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -5508,29 +5534,25 @@ class ListenResponse final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const ListenResponse& default_instance() { + static const Target_QueryTarget& default_instance() { return *internal_default_instance(); } - enum ResponseTypeCase { - kTargetChange = 2, - kDocumentChange = 3, - kDocumentDelete = 4, - kDocumentRemove = 6, - kFilter = 5, - RESPONSE_TYPE_NOT_SET = 0, + enum QueryTypeCase { + kStructuredQuery = 2, + QUERY_TYPE_NOT_SET = 0, }; - static inline const ListenResponse* internal_default_instance() { - return reinterpret_cast( - &_ListenResponse_default_instance_); + static inline const Target_QueryTarget* internal_default_instance() { + return reinterpret_cast( + &_Target_QueryTarget_default_instance_); } static constexpr int kIndexInFileMessages = - 22; + 26; - friend void swap(ListenResponse& a, ListenResponse& b) { + friend void swap(Target_QueryTarget& a, Target_QueryTarget& b) { a.Swap(&b); } - inline void Swap(ListenResponse* other) { + inline void Swap(Target_QueryTarget* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -5543,7 +5565,7 @@ class ListenResponse final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(ListenResponse* other) { + void UnsafeArenaSwap(Target_QueryTarget* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -5551,14 +5573,14 @@ class ListenResponse final : // implements Message ---------------------------------------------- - ListenResponse* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + Target_QueryTarget* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const ListenResponse& from); + void CopyFrom(const Target_QueryTarget& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const ListenResponse& from) { - ListenResponse::MergeImpl(*this, from); + void MergeFrom( const Target_QueryTarget& from) { + Target_QueryTarget::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -5576,16 +5598,16 @@ class ListenResponse final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(ListenResponse* other); + void InternalSwap(Target_QueryTarget* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.ListenResponse"; + return "google.firestore.v1.Target.QueryTarget"; } protected: - explicit ListenResponse(::google::protobuf::Arena* arena); - ListenResponse(::google::protobuf::Arena* arena, const ListenResponse& from); + explicit Target_QueryTarget(::google::protobuf::Arena* arena); + Target_QueryTarget(::google::protobuf::Arena* arena, const Target_QueryTarget& from); public: static const ClassData _class_data_; @@ -5598,125 +5620,58 @@ class ListenResponse final : // accessors ------------------------------------------------------- enum : int { - kTargetChangeFieldNumber = 2, - kDocumentChangeFieldNumber = 3, - kDocumentDeleteFieldNumber = 4, - kDocumentRemoveFieldNumber = 6, - kFilterFieldNumber = 5, + kParentFieldNumber = 1, + kStructuredQueryFieldNumber = 2, }; - // .google.firestore.v1.TargetChange target_change = 2; - bool has_target_change() const; + // string parent = 1; + void clear_parent() ; + const std::string& parent() const; + template + void set_parent(Arg_&& arg, Args_... args); + std::string* mutable_parent(); + PROTOBUF_NODISCARD std::string* release_parent(); + void set_allocated_parent(std::string* value); + private: - bool _internal_has_target_change() const; + const std::string& _internal_parent() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( + const std::string& value); + std::string* _internal_mutable_parent(); public: - void clear_target_change() ; - const ::google::firestore::v1::TargetChange& target_change() const; - PROTOBUF_NODISCARD ::google::firestore::v1::TargetChange* release_target_change(); - ::google::firestore::v1::TargetChange* mutable_target_change(); - void set_allocated_target_change(::google::firestore::v1::TargetChange* value); - void unsafe_arena_set_allocated_target_change(::google::firestore::v1::TargetChange* value); - ::google::firestore::v1::TargetChange* unsafe_arena_release_target_change(); - + // .google.firestore.v1.StructuredQuery structured_query = 2; + bool has_structured_query() const; private: - const ::google::firestore::v1::TargetChange& _internal_target_change() const; - ::google::firestore::v1::TargetChange* _internal_mutable_target_change(); + bool _internal_has_structured_query() const; public: - // .google.firestore.v1.DocumentChange document_change = 3; - bool has_document_change() const; - private: - bool _internal_has_document_change() const; - - public: - void clear_document_change() ; - const ::google::firestore::v1::DocumentChange& document_change() const; - PROTOBUF_NODISCARD ::google::firestore::v1::DocumentChange* release_document_change(); - ::google::firestore::v1::DocumentChange* mutable_document_change(); - void set_allocated_document_change(::google::firestore::v1::DocumentChange* value); - void unsafe_arena_set_allocated_document_change(::google::firestore::v1::DocumentChange* value); - ::google::firestore::v1::DocumentChange* unsafe_arena_release_document_change(); - - private: - const ::google::firestore::v1::DocumentChange& _internal_document_change() const; - ::google::firestore::v1::DocumentChange* _internal_mutable_document_change(); - - public: - // .google.firestore.v1.DocumentDelete document_delete = 4; - bool has_document_delete() const; - private: - bool _internal_has_document_delete() const; - - public: - void clear_document_delete() ; - const ::google::firestore::v1::DocumentDelete& document_delete() const; - PROTOBUF_NODISCARD ::google::firestore::v1::DocumentDelete* release_document_delete(); - ::google::firestore::v1::DocumentDelete* mutable_document_delete(); - void set_allocated_document_delete(::google::firestore::v1::DocumentDelete* value); - void unsafe_arena_set_allocated_document_delete(::google::firestore::v1::DocumentDelete* value); - ::google::firestore::v1::DocumentDelete* unsafe_arena_release_document_delete(); - - private: - const ::google::firestore::v1::DocumentDelete& _internal_document_delete() const; - ::google::firestore::v1::DocumentDelete* _internal_mutable_document_delete(); - - public: - // .google.firestore.v1.DocumentRemove document_remove = 6; - bool has_document_remove() const; - private: - bool _internal_has_document_remove() const; - - public: - void clear_document_remove() ; - const ::google::firestore::v1::DocumentRemove& document_remove() const; - PROTOBUF_NODISCARD ::google::firestore::v1::DocumentRemove* release_document_remove(); - ::google::firestore::v1::DocumentRemove* mutable_document_remove(); - void set_allocated_document_remove(::google::firestore::v1::DocumentRemove* value); - void unsafe_arena_set_allocated_document_remove(::google::firestore::v1::DocumentRemove* value); - ::google::firestore::v1::DocumentRemove* unsafe_arena_release_document_remove(); - - private: - const ::google::firestore::v1::DocumentRemove& _internal_document_remove() const; - ::google::firestore::v1::DocumentRemove* _internal_mutable_document_remove(); - - public: - // .google.firestore.v1.ExistenceFilter filter = 5; - bool has_filter() const; - private: - bool _internal_has_filter() const; - - public: - void clear_filter() ; - const ::google::firestore::v1::ExistenceFilter& filter() const; - PROTOBUF_NODISCARD ::google::firestore::v1::ExistenceFilter* release_filter(); - ::google::firestore::v1::ExistenceFilter* mutable_filter(); - void set_allocated_filter(::google::firestore::v1::ExistenceFilter* value); - void unsafe_arena_set_allocated_filter(::google::firestore::v1::ExistenceFilter* value); - ::google::firestore::v1::ExistenceFilter* unsafe_arena_release_filter(); + void clear_structured_query() ; + const ::google::firestore::v1::StructuredQuery& structured_query() const; + PROTOBUF_NODISCARD ::google::firestore::v1::StructuredQuery* release_structured_query(); + ::google::firestore::v1::StructuredQuery* mutable_structured_query(); + void set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); + void unsafe_arena_set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); + ::google::firestore::v1::StructuredQuery* unsafe_arena_release_structured_query(); private: - const ::google::firestore::v1::ExistenceFilter& _internal_filter() const; - ::google::firestore::v1::ExistenceFilter* _internal_mutable_filter(); + const ::google::firestore::v1::StructuredQuery& _internal_structured_query() const; + ::google::firestore::v1::StructuredQuery* _internal_mutable_structured_query(); public: - void clear_response_type(); - ResponseTypeCase response_type_case() const; - // @@protoc_insertion_point(class_scope:google.firestore.v1.ListenResponse) + void clear_query_type(); + QueryTypeCase query_type_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.Target.QueryTarget) private: class _Internal; - void set_has_target_change(); - void set_has_document_change(); - void set_has_document_delete(); - void set_has_document_remove(); - void set_has_filter(); + void set_has_structured_query(); - inline bool has_response_type() const; - inline void clear_has_response_type(); + inline bool has_query_type() const; + inline void clear_has_query_type(); friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 0, 5, 5, - 0, 2> + 0, 2, 1, + 53, 2> _table_; friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; @@ -5732,15 +5687,12 @@ class ListenResponse final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - union ResponseTypeUnion { - constexpr ResponseTypeUnion() : _constinit_{} {} + ::google::protobuf::internal::ArenaStringPtr parent_; + union QueryTypeUnion { + constexpr QueryTypeUnion() : _constinit_{} {} ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::firestore::v1::TargetChange* target_change_; - ::google::firestore::v1::DocumentChange* document_change_; - ::google::firestore::v1::DocumentDelete* document_delete_; - ::google::firestore::v1::DocumentRemove* document_remove_; - ::google::firestore::v1::ExistenceFilter* filter_; - } response_type_; + ::google::firestore::v1::StructuredQuery* structured_query_; + } query_type_; mutable ::google::protobuf::internal::CachedSize _cached_size_; ::uint32_t _oneof_case_[1]; @@ -5750,26 +5702,26 @@ class ListenResponse final : friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class CommitRequest final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.CommitRequest) */ { +class RunQueryRequest final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.RunQueryRequest) */ { public: - inline CommitRequest() : CommitRequest(nullptr) {} - ~CommitRequest() override; + inline RunQueryRequest() : RunQueryRequest(nullptr) {} + ~RunQueryRequest() override; template - explicit PROTOBUF_CONSTEXPR CommitRequest(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR RunQueryRequest(::google::protobuf::internal::ConstantInitialized); - inline CommitRequest(const CommitRequest& from) - : CommitRequest(nullptr, from) {} - CommitRequest(CommitRequest&& from) noexcept - : CommitRequest() { + inline RunQueryRequest(const RunQueryRequest& from) + : RunQueryRequest(nullptr, from) {} + RunQueryRequest(RunQueryRequest&& from) noexcept + : RunQueryRequest() { *this = ::std::move(from); } - inline CommitRequest& operator=(const CommitRequest& from) { + inline RunQueryRequest& operator=(const RunQueryRequest& from) { CopyFrom(from); return *this; } - inline CommitRequest& operator=(CommitRequest&& from) noexcept { + inline RunQueryRequest& operator=(RunQueryRequest&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -5801,20 +5753,32 @@ class CommitRequest final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const CommitRequest& default_instance() { + static const RunQueryRequest& default_instance() { return *internal_default_instance(); } - static inline const CommitRequest* internal_default_instance() { - return reinterpret_cast( - &_CommitRequest_default_instance_); + enum QueryTypeCase { + kStructuredQuery = 2, + QUERY_TYPE_NOT_SET = 0, + }; + + enum ConsistencySelectorCase { + kTransaction = 5, + kNewTransaction = 6, + kReadTime = 7, + CONSISTENCY_SELECTOR_NOT_SET = 0, + }; + + static inline const RunQueryRequest* internal_default_instance() { + return reinterpret_cast( + &_RunQueryRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 10; + 13; - friend void swap(CommitRequest& a, CommitRequest& b) { + friend void swap(RunQueryRequest& a, RunQueryRequest& b) { a.Swap(&b); } - inline void Swap(CommitRequest* other) { + inline void Swap(RunQueryRequest* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -5827,7 +5791,7 @@ class CommitRequest final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(CommitRequest* other) { + void UnsafeArenaSwap(RunQueryRequest* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -5835,14 +5799,14 @@ class CommitRequest final : // implements Message ---------------------------------------------- - CommitRequest* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + RunQueryRequest* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const CommitRequest& from); + void CopyFrom(const RunQueryRequest& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const CommitRequest& from) { - CommitRequest::MergeImpl(*this, from); + void MergeFrom( const RunQueryRequest& from) { + RunQueryRequest::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -5860,16 +5824,16 @@ class CommitRequest final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(CommitRequest* other); + void InternalSwap(RunQueryRequest* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.CommitRequest"; + return "google.firestore.v1.RunQueryRequest"; } protected: - explicit CommitRequest(::google::protobuf::Arena* arena); - CommitRequest(::google::protobuf::Arena* arena, const CommitRequest& from); + explicit RunQueryRequest(::google::protobuf::Arena* arena); + RunQueryRequest(::google::protobuf::Arena* arena, const RunQueryRequest& from); public: static const ClassData _class_data_; @@ -5882,45 +5846,49 @@ class CommitRequest final : // accessors ------------------------------------------------------- enum : int { - kWritesFieldNumber = 2, - kDatabaseFieldNumber = 1, - kTransactionFieldNumber = 3, + kParentFieldNumber = 1, + kStructuredQueryFieldNumber = 2, + kTransactionFieldNumber = 5, + kNewTransactionFieldNumber = 6, + kReadTimeFieldNumber = 7, }; - // repeated .google.firestore.v1.Write writes = 2; - int writes_size() const; + // string parent = 1; + void clear_parent() ; + const std::string& parent() const; + template + void set_parent(Arg_&& arg, Args_... args); + std::string* mutable_parent(); + PROTOBUF_NODISCARD std::string* release_parent(); + void set_allocated_parent(std::string* value); + private: - int _internal_writes_size() const; + const std::string& _internal_parent() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( + const std::string& value); + std::string* _internal_mutable_parent(); public: - void clear_writes() ; - ::google::firestore::v1::Write* mutable_writes(int index); - ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >* - mutable_writes(); + // .google.firestore.v1.StructuredQuery structured_query = 2; + bool has_structured_query() const; private: - const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& _internal_writes() const; - ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* _internal_mutable_writes(); + bool _internal_has_structured_query() const; + public: - const ::google::firestore::v1::Write& writes(int index) const; - ::google::firestore::v1::Write* add_writes(); - const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >& - writes() const; - // string database = 1; - void clear_database() ; - const std::string& database() const; - template - void set_database(Arg_&& arg, Args_... args); - std::string* mutable_database(); - PROTOBUF_NODISCARD std::string* release_database(); - void set_allocated_database(std::string* value); + void clear_structured_query() ; + const ::google::firestore::v1::StructuredQuery& structured_query() const; + PROTOBUF_NODISCARD ::google::firestore::v1::StructuredQuery* release_structured_query(); + ::google::firestore::v1::StructuredQuery* mutable_structured_query(); + void set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); + void unsafe_arena_set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value); + ::google::firestore::v1::StructuredQuery* unsafe_arena_release_structured_query(); private: - const std::string& _internal_database() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_database( - const std::string& value); - std::string* _internal_mutable_database(); + const ::google::firestore::v1::StructuredQuery& _internal_structured_query() const; + ::google::firestore::v1::StructuredQuery* _internal_mutable_structured_query(); public: - // bytes transaction = 3; + // bytes transaction = 5; + bool has_transaction() const; void clear_transaction() ; const std::string& transaction() const; template @@ -5936,16 +5904,68 @@ class CommitRequest final : std::string* _internal_mutable_transaction(); public: - // @@protoc_insertion_point(class_scope:google.firestore.v1.CommitRequest) - private: - class _Internal; + // .google.firestore.v1.TransactionOptions new_transaction = 6; + bool has_new_transaction() const; + private: + bool _internal_has_new_transaction() const; - friend class ::google::protobuf::internal::TcParser; - static const ::google::protobuf::internal::TcParseTable< - 2, 3, 1, - 50, 2> - _table_; - friend class ::google::protobuf::MessageLite; + public: + void clear_new_transaction() ; + const ::google::firestore::v1::TransactionOptions& new_transaction() const; + PROTOBUF_NODISCARD ::google::firestore::v1::TransactionOptions* release_new_transaction(); + ::google::firestore::v1::TransactionOptions* mutable_new_transaction(); + void set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); + void unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); + ::google::firestore::v1::TransactionOptions* unsafe_arena_release_new_transaction(); + + private: + const ::google::firestore::v1::TransactionOptions& _internal_new_transaction() const; + ::google::firestore::v1::TransactionOptions* _internal_mutable_new_transaction(); + + public: + // .google.protobuf.Timestamp read_time = 7; + bool has_read_time() const; + private: + bool _internal_has_read_time() const; + + public: + void clear_read_time() ; + const ::google::protobuf::Timestamp& read_time() const; + PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); + ::google::protobuf::Timestamp* mutable_read_time(); + void set_allocated_read_time(::google::protobuf::Timestamp* value); + void unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value); + ::google::protobuf::Timestamp* unsafe_arena_release_read_time(); + + private: + const ::google::protobuf::Timestamp& _internal_read_time() const; + ::google::protobuf::Timestamp* _internal_mutable_read_time(); + + public: + void clear_query_type(); + QueryTypeCase query_type_case() const; + void clear_consistency_selector(); + ConsistencySelectorCase consistency_selector_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.RunQueryRequest) + private: + class _Internal; + void set_has_structured_query(); + void set_has_transaction(); + void set_has_new_transaction(); + void set_has_read_time(); + + inline bool has_query_type() const; + inline void clear_has_query_type(); + + inline bool has_consistency_selector() const; + inline void clear_has_consistency_selector(); + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 0, 5, 3, + 50, 2> + _table_; + friend class ::google::protobuf::MessageLite; friend class ::google::protobuf::Arena; template friend class ::google::protobuf::Arena::InternalHelper; @@ -5959,36 +5979,48 @@ class CommitRequest final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write > writes_; - ::google::protobuf::internal::ArenaStringPtr database_; - ::google::protobuf::internal::ArenaStringPtr transaction_; + ::google::protobuf::internal::ArenaStringPtr parent_; + union QueryTypeUnion { + constexpr QueryTypeUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::firestore::v1::StructuredQuery* structured_query_; + } query_type_; + union ConsistencySelectorUnion { + constexpr ConsistencySelectorUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::protobuf::internal::ArenaStringPtr transaction_; + ::google::firestore::v1::TransactionOptions* new_transaction_; + ::google::protobuf::Timestamp* read_time_; + } consistency_selector_; mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t _oneof_case_[2]; + PROTOBUF_TSAN_DECLARE_MEMBER }; union { Impl_ _impl_; }; friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class Target final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Target) */ { +class ListenResponse final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.ListenResponse) */ { public: - inline Target() : Target(nullptr) {} - ~Target() override; + inline ListenResponse() : ListenResponse(nullptr) {} + ~ListenResponse() override; template - explicit PROTOBUF_CONSTEXPR Target(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR ListenResponse(::google::protobuf::internal::ConstantInitialized); - inline Target(const Target& from) - : Target(nullptr, from) {} - Target(Target&& from) noexcept - : Target() { + inline ListenResponse(const ListenResponse& from) + : ListenResponse(nullptr, from) {} + ListenResponse(ListenResponse&& from) noexcept + : ListenResponse() { *this = ::std::move(from); } - inline Target& operator=(const Target& from) { + inline ListenResponse& operator=(const ListenResponse& from) { CopyFrom(from); return *this; } - inline Target& operator=(Target&& from) noexcept { + inline ListenResponse& operator=(ListenResponse&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -6020,32 +6052,29 @@ class Target final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const Target& default_instance() { + static const ListenResponse& default_instance() { return *internal_default_instance(); } - enum TargetTypeCase { - kQuery = 2, - kDocuments = 3, - TARGET_TYPE_NOT_SET = 0, - }; - - enum ResumeTypeCase { - kResumeToken = 4, - kReadTime = 11, - RESUME_TYPE_NOT_SET = 0, + enum ResponseTypeCase { + kTargetChange = 2, + kDocumentChange = 3, + kDocumentDelete = 4, + kDocumentRemove = 6, + kFilter = 5, + RESPONSE_TYPE_NOT_SET = 0, }; - static inline const Target* internal_default_instance() { - return reinterpret_cast( - &_Target_default_instance_); + static inline const ListenResponse* internal_default_instance() { + return reinterpret_cast( + &_ListenResponse_default_instance_); } static constexpr int kIndexInFileMessages = - 25; + 24; - friend void swap(Target& a, Target& b) { + friend void swap(ListenResponse& a, ListenResponse& b) { a.Swap(&b); } - inline void Swap(Target* other) { + inline void Swap(ListenResponse* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -6058,7 +6087,7 @@ class Target final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(Target* other) { + void UnsafeArenaSwap(ListenResponse* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -6066,14 +6095,14 @@ class Target final : // implements Message ---------------------------------------------- - Target* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + ListenResponse* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const Target& from); + void CopyFrom(const ListenResponse& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const Target& from) { - Target::MergeImpl(*this, from); + void MergeFrom( const ListenResponse& from) { + ListenResponse::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -6091,16 +6120,16 @@ class Target final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(Target* other); + void InternalSwap(ListenResponse* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.Target"; + return "google.firestore.v1.ListenResponse"; } protected: - explicit Target(::google::protobuf::Arena* arena); - Target(::google::protobuf::Arena* arena, const Target& from); + explicit ListenResponse(::google::protobuf::Arena* arena); + ListenResponse(::google::protobuf::Arena* arena, const ListenResponse& from); public: static const ClassData _class_data_; @@ -6110,150 +6139,127 @@ class Target final : // nested types ---------------------------------------------------- - using DocumentsTarget = Target_DocumentsTarget; - using QueryTarget = Target_QueryTarget; - // accessors ------------------------------------------------------- enum : int { - kExpectedCountFieldNumber = 12, - kTargetIdFieldNumber = 5, - kOnceFieldNumber = 6, - kQueryFieldNumber = 2, - kDocumentsFieldNumber = 3, - kResumeTokenFieldNumber = 4, - kReadTimeFieldNumber = 11, + kTargetChangeFieldNumber = 2, + kDocumentChangeFieldNumber = 3, + kDocumentDeleteFieldNumber = 4, + kDocumentRemoveFieldNumber = 6, + kFilterFieldNumber = 5, }; - // .google.protobuf.Int32Value expected_count = 12; - bool has_expected_count() const; - void clear_expected_count() ; - const ::google::protobuf::Int32Value& expected_count() const; - PROTOBUF_NODISCARD ::google::protobuf::Int32Value* release_expected_count(); - ::google::protobuf::Int32Value* mutable_expected_count(); - void set_allocated_expected_count(::google::protobuf::Int32Value* value); - void unsafe_arena_set_allocated_expected_count(::google::protobuf::Int32Value* value); - ::google::protobuf::Int32Value* unsafe_arena_release_expected_count(); - + // .google.firestore.v1.TargetChange target_change = 2; + bool has_target_change() const; private: - const ::google::protobuf::Int32Value& _internal_expected_count() const; - ::google::protobuf::Int32Value* _internal_mutable_expected_count(); + bool _internal_has_target_change() const; public: - // int32 target_id = 5; - void clear_target_id() ; - ::int32_t target_id() const; - void set_target_id(::int32_t value); + void clear_target_change() ; + const ::google::firestore::v1::TargetChange& target_change() const; + PROTOBUF_NODISCARD ::google::firestore::v1::TargetChange* release_target_change(); + ::google::firestore::v1::TargetChange* mutable_target_change(); + void set_allocated_target_change(::google::firestore::v1::TargetChange* value); + void unsafe_arena_set_allocated_target_change(::google::firestore::v1::TargetChange* value); + ::google::firestore::v1::TargetChange* unsafe_arena_release_target_change(); private: - ::int32_t _internal_target_id() const; - void _internal_set_target_id(::int32_t value); + const ::google::firestore::v1::TargetChange& _internal_target_change() const; + ::google::firestore::v1::TargetChange* _internal_mutable_target_change(); public: - // bool once = 6; - void clear_once() ; - bool once() const; - void set_once(bool value); - + // .google.firestore.v1.DocumentChange document_change = 3; + bool has_document_change() const; private: - bool _internal_once() const; - void _internal_set_once(bool value); + bool _internal_has_document_change() const; public: - // .google.firestore.v1.Target.QueryTarget query = 2; - bool has_query() const; + void clear_document_change() ; + const ::google::firestore::v1::DocumentChange& document_change() const; + PROTOBUF_NODISCARD ::google::firestore::v1::DocumentChange* release_document_change(); + ::google::firestore::v1::DocumentChange* mutable_document_change(); + void set_allocated_document_change(::google::firestore::v1::DocumentChange* value); + void unsafe_arena_set_allocated_document_change(::google::firestore::v1::DocumentChange* value); + ::google::firestore::v1::DocumentChange* unsafe_arena_release_document_change(); + private: - bool _internal_has_query() const; + const ::google::firestore::v1::DocumentChange& _internal_document_change() const; + ::google::firestore::v1::DocumentChange* _internal_mutable_document_change(); public: - void clear_query() ; - const ::google::firestore::v1::Target_QueryTarget& query() const; - PROTOBUF_NODISCARD ::google::firestore::v1::Target_QueryTarget* release_query(); - ::google::firestore::v1::Target_QueryTarget* mutable_query(); - void set_allocated_query(::google::firestore::v1::Target_QueryTarget* value); - void unsafe_arena_set_allocated_query(::google::firestore::v1::Target_QueryTarget* value); - ::google::firestore::v1::Target_QueryTarget* unsafe_arena_release_query(); - + // .google.firestore.v1.DocumentDelete document_delete = 4; + bool has_document_delete() const; private: - const ::google::firestore::v1::Target_QueryTarget& _internal_query() const; - ::google::firestore::v1::Target_QueryTarget* _internal_mutable_query(); + bool _internal_has_document_delete() const; public: - // .google.firestore.v1.Target.DocumentsTarget documents = 3; - bool has_documents() const; + void clear_document_delete() ; + const ::google::firestore::v1::DocumentDelete& document_delete() const; + PROTOBUF_NODISCARD ::google::firestore::v1::DocumentDelete* release_document_delete(); + ::google::firestore::v1::DocumentDelete* mutable_document_delete(); + void set_allocated_document_delete(::google::firestore::v1::DocumentDelete* value); + void unsafe_arena_set_allocated_document_delete(::google::firestore::v1::DocumentDelete* value); + ::google::firestore::v1::DocumentDelete* unsafe_arena_release_document_delete(); + private: - bool _internal_has_documents() const; + const ::google::firestore::v1::DocumentDelete& _internal_document_delete() const; + ::google::firestore::v1::DocumentDelete* _internal_mutable_document_delete(); public: - void clear_documents() ; - const ::google::firestore::v1::Target_DocumentsTarget& documents() const; - PROTOBUF_NODISCARD ::google::firestore::v1::Target_DocumentsTarget* release_documents(); - ::google::firestore::v1::Target_DocumentsTarget* mutable_documents(); - void set_allocated_documents(::google::firestore::v1::Target_DocumentsTarget* value); - void unsafe_arena_set_allocated_documents(::google::firestore::v1::Target_DocumentsTarget* value); - ::google::firestore::v1::Target_DocumentsTarget* unsafe_arena_release_documents(); - + // .google.firestore.v1.DocumentRemove document_remove = 6; + bool has_document_remove() const; private: - const ::google::firestore::v1::Target_DocumentsTarget& _internal_documents() const; - ::google::firestore::v1::Target_DocumentsTarget* _internal_mutable_documents(); + bool _internal_has_document_remove() const; public: - // bytes resume_token = 4; - bool has_resume_token() const; - void clear_resume_token() ; - const std::string& resume_token() const; - template - void set_resume_token(Arg_&& arg, Args_... args); - std::string* mutable_resume_token(); - PROTOBUF_NODISCARD std::string* release_resume_token(); - void set_allocated_resume_token(std::string* value); + void clear_document_remove() ; + const ::google::firestore::v1::DocumentRemove& document_remove() const; + PROTOBUF_NODISCARD ::google::firestore::v1::DocumentRemove* release_document_remove(); + ::google::firestore::v1::DocumentRemove* mutable_document_remove(); + void set_allocated_document_remove(::google::firestore::v1::DocumentRemove* value); + void unsafe_arena_set_allocated_document_remove(::google::firestore::v1::DocumentRemove* value); + ::google::firestore::v1::DocumentRemove* unsafe_arena_release_document_remove(); private: - const std::string& _internal_resume_token() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_resume_token( - const std::string& value); - std::string* _internal_mutable_resume_token(); + const ::google::firestore::v1::DocumentRemove& _internal_document_remove() const; + ::google::firestore::v1::DocumentRemove* _internal_mutable_document_remove(); public: - // .google.protobuf.Timestamp read_time = 11; - bool has_read_time() const; + // .google.firestore.v1.ExistenceFilter filter = 5; + bool has_filter() const; private: - bool _internal_has_read_time() const; + bool _internal_has_filter() const; public: - void clear_read_time() ; - const ::google::protobuf::Timestamp& read_time() const; - PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); - ::google::protobuf::Timestamp* mutable_read_time(); - void set_allocated_read_time(::google::protobuf::Timestamp* value); - void unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value); - ::google::protobuf::Timestamp* unsafe_arena_release_read_time(); + void clear_filter() ; + const ::google::firestore::v1::ExistenceFilter& filter() const; + PROTOBUF_NODISCARD ::google::firestore::v1::ExistenceFilter* release_filter(); + ::google::firestore::v1::ExistenceFilter* mutable_filter(); + void set_allocated_filter(::google::firestore::v1::ExistenceFilter* value); + void unsafe_arena_set_allocated_filter(::google::firestore::v1::ExistenceFilter* value); + ::google::firestore::v1::ExistenceFilter* unsafe_arena_release_filter(); private: - const ::google::protobuf::Timestamp& _internal_read_time() const; - ::google::protobuf::Timestamp* _internal_mutable_read_time(); + const ::google::firestore::v1::ExistenceFilter& _internal_filter() const; + ::google::firestore::v1::ExistenceFilter* _internal_mutable_filter(); public: - void clear_target_type(); - TargetTypeCase target_type_case() const; - void clear_resume_type(); - ResumeTypeCase resume_type_case() const; - // @@protoc_insertion_point(class_scope:google.firestore.v1.Target) + void clear_response_type(); + ResponseTypeCase response_type_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.ListenResponse) private: class _Internal; - void set_has_query(); - void set_has_documents(); - void set_has_resume_token(); - void set_has_read_time(); - - inline bool has_target_type() const; - inline void clear_has_target_type(); + void set_has_target_change(); + void set_has_document_change(); + void set_has_document_delete(); + void set_has_document_remove(); + void set_has_filter(); - inline bool has_resume_type() const; - inline void clear_has_resume_type(); + inline bool has_response_type() const; + inline void clear_has_response_type(); friend class ::google::protobuf::internal::TcParser; static const ::google::protobuf::internal::TcParseTable< - 2, 7, 4, + 0, 5, 5, 0, 2> _table_; friend class ::google::protobuf::MessageLite; @@ -6270,24 +6276,17 @@ class Target final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - ::google::protobuf::internal::HasBits<1> _has_bits_; - mutable ::google::protobuf::internal::CachedSize _cached_size_; - ::google::protobuf::Int32Value* expected_count_; - ::int32_t target_id_; - bool once_; - union TargetTypeUnion { - constexpr TargetTypeUnion() : _constinit_{} {} - ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::firestore::v1::Target_QueryTarget* query_; - ::google::firestore::v1::Target_DocumentsTarget* documents_; - } target_type_; - union ResumeTypeUnion { - constexpr ResumeTypeUnion() : _constinit_{} {} + union ResponseTypeUnion { + constexpr ResponseTypeUnion() : _constinit_{} {} ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::protobuf::internal::ArenaStringPtr resume_token_; - ::google::protobuf::Timestamp* read_time_; - } resume_type_; - ::uint32_t _oneof_case_[2]; + ::google::firestore::v1::TargetChange* target_change_; + ::google::firestore::v1::DocumentChange* document_change_; + ::google::firestore::v1::DocumentDelete* document_delete_; + ::google::firestore::v1::DocumentRemove* document_remove_; + ::google::firestore::v1::ExistenceFilter* filter_; + } response_type_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t _oneof_case_[1]; PROTOBUF_TSAN_DECLARE_MEMBER }; @@ -6295,26 +6294,26 @@ class Target final : friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class RunAggregationQueryRequest final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.RunAggregationQueryRequest) */ { +class CommitRequest final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.CommitRequest) */ { public: - inline RunAggregationQueryRequest() : RunAggregationQueryRequest(nullptr) {} - ~RunAggregationQueryRequest() override; + inline CommitRequest() : CommitRequest(nullptr) {} + ~CommitRequest() override; template - explicit PROTOBUF_CONSTEXPR RunAggregationQueryRequest(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR CommitRequest(::google::protobuf::internal::ConstantInitialized); - inline RunAggregationQueryRequest(const RunAggregationQueryRequest& from) - : RunAggregationQueryRequest(nullptr, from) {} - RunAggregationQueryRequest(RunAggregationQueryRequest&& from) noexcept - : RunAggregationQueryRequest() { + inline CommitRequest(const CommitRequest& from) + : CommitRequest(nullptr, from) {} + CommitRequest(CommitRequest&& from) noexcept + : CommitRequest() { *this = ::std::move(from); } - inline RunAggregationQueryRequest& operator=(const RunAggregationQueryRequest& from) { + inline CommitRequest& operator=(const CommitRequest& from) { CopyFrom(from); return *this; } - inline RunAggregationQueryRequest& operator=(RunAggregationQueryRequest&& from) noexcept { + inline CommitRequest& operator=(CommitRequest&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -6346,32 +6345,20 @@ class RunAggregationQueryRequest final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const RunAggregationQueryRequest& default_instance() { + static const CommitRequest& default_instance() { return *internal_default_instance(); } - enum QueryTypeCase { - kStructuredAggregationQuery = 2, - QUERY_TYPE_NOT_SET = 0, - }; - - enum ConsistencySelectorCase { - kTransaction = 4, - kNewTransaction = 5, - kReadTime = 6, - CONSISTENCY_SELECTOR_NOT_SET = 0, - }; - - static inline const RunAggregationQueryRequest* internal_default_instance() { - return reinterpret_cast( - &_RunAggregationQueryRequest_default_instance_); + static inline const CommitRequest* internal_default_instance() { + return reinterpret_cast( + &_CommitRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 15; + 10; - friend void swap(RunAggregationQueryRequest& a, RunAggregationQueryRequest& b) { + friend void swap(CommitRequest& a, CommitRequest& b) { a.Swap(&b); } - inline void Swap(RunAggregationQueryRequest* other) { + inline void Swap(CommitRequest* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -6384,7 +6371,7 @@ class RunAggregationQueryRequest final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(RunAggregationQueryRequest* other) { + void UnsafeArenaSwap(CommitRequest* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -6392,14 +6379,14 @@ class RunAggregationQueryRequest final : // implements Message ---------------------------------------------- - RunAggregationQueryRequest* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + CommitRequest* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const RunAggregationQueryRequest& from); + void CopyFrom(const CommitRequest& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const RunAggregationQueryRequest& from) { - RunAggregationQueryRequest::MergeImpl(*this, from); + void MergeFrom( const CommitRequest& from) { + CommitRequest::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -6417,16 +6404,16 @@ class RunAggregationQueryRequest final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(RunAggregationQueryRequest* other); + void InternalSwap(CommitRequest* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.RunAggregationQueryRequest"; + return "google.firestore.v1.CommitRequest"; } protected: - explicit RunAggregationQueryRequest(::google::protobuf::Arena* arena); - RunAggregationQueryRequest(::google::protobuf::Arena* arena, const RunAggregationQueryRequest& from); + explicit CommitRequest(::google::protobuf::Arena* arena); + CommitRequest(::google::protobuf::Arena* arena, const CommitRequest& from); public: static const ClassData _class_data_; @@ -6439,49 +6426,45 @@ class RunAggregationQueryRequest final : // accessors ------------------------------------------------------- enum : int { - kParentFieldNumber = 1, - kStructuredAggregationQueryFieldNumber = 2, - kTransactionFieldNumber = 4, - kNewTransactionFieldNumber = 5, - kReadTimeFieldNumber = 6, + kWritesFieldNumber = 2, + kDatabaseFieldNumber = 1, + kTransactionFieldNumber = 3, }; - // string parent = 1; - void clear_parent() ; - const std::string& parent() const; - template - void set_parent(Arg_&& arg, Args_... args); - std::string* mutable_parent(); - PROTOBUF_NODISCARD std::string* release_parent(); - void set_allocated_parent(std::string* value); - + // repeated .google.firestore.v1.Write writes = 2; + int writes_size() const; private: - const std::string& _internal_parent() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( - const std::string& value); - std::string* _internal_mutable_parent(); + int _internal_writes_size() const; public: - // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; - bool has_structured_aggregation_query() const; + void clear_writes() ; + ::google::firestore::v1::Write* mutable_writes(int index); + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >* + mutable_writes(); private: - bool _internal_has_structured_aggregation_query() const; - + const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& _internal_writes() const; + ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* _internal_mutable_writes(); public: - void clear_structured_aggregation_query() ; - const ::google::firestore::v1::StructuredAggregationQuery& structured_aggregation_query() const; - PROTOBUF_NODISCARD ::google::firestore::v1::StructuredAggregationQuery* release_structured_aggregation_query(); - ::google::firestore::v1::StructuredAggregationQuery* mutable_structured_aggregation_query(); - void set_allocated_structured_aggregation_query(::google::firestore::v1::StructuredAggregationQuery* value); - void unsafe_arena_set_allocated_structured_aggregation_query(::google::firestore::v1::StructuredAggregationQuery* value); - ::google::firestore::v1::StructuredAggregationQuery* unsafe_arena_release_structured_aggregation_query(); + const ::google::firestore::v1::Write& writes(int index) const; + ::google::firestore::v1::Write* add_writes(); + const ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write >& + writes() const; + // string database = 1; + void clear_database() ; + const std::string& database() const; + template + void set_database(Arg_&& arg, Args_... args); + std::string* mutable_database(); + PROTOBUF_NODISCARD std::string* release_database(); + void set_allocated_database(std::string* value); private: - const ::google::firestore::v1::StructuredAggregationQuery& _internal_structured_aggregation_query() const; - ::google::firestore::v1::StructuredAggregationQuery* _internal_mutable_structured_aggregation_query(); + const std::string& _internal_database() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_database( + const std::string& value); + std::string* _internal_mutable_database(); public: - // bytes transaction = 4; - bool has_transaction() const; + // bytes transaction = 3; void clear_transaction() ; const std::string& transaction() const; template @@ -6497,74 +6480,22 @@ class RunAggregationQueryRequest final : std::string* _internal_mutable_transaction(); public: - // .google.firestore.v1.TransactionOptions new_transaction = 5; - bool has_new_transaction() const; - private: - bool _internal_has_new_transaction() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.CommitRequest) + private: + class _Internal; - public: - void clear_new_transaction() ; - const ::google::firestore::v1::TransactionOptions& new_transaction() const; - PROTOBUF_NODISCARD ::google::firestore::v1::TransactionOptions* release_new_transaction(); - ::google::firestore::v1::TransactionOptions* mutable_new_transaction(); - void set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); - void unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); - ::google::firestore::v1::TransactionOptions* unsafe_arena_release_new_transaction(); - - private: - const ::google::firestore::v1::TransactionOptions& _internal_new_transaction() const; - ::google::firestore::v1::TransactionOptions* _internal_mutable_new_transaction(); - - public: - // .google.protobuf.Timestamp read_time = 6; - bool has_read_time() const; - private: - bool _internal_has_read_time() const; - - public: - void clear_read_time() ; - const ::google::protobuf::Timestamp& read_time() const; - PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); - ::google::protobuf::Timestamp* mutable_read_time(); - void set_allocated_read_time(::google::protobuf::Timestamp* value); - void unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value); - ::google::protobuf::Timestamp* unsafe_arena_release_read_time(); - - private: - const ::google::protobuf::Timestamp& _internal_read_time() const; - ::google::protobuf::Timestamp* _internal_mutable_read_time(); - - public: - void clear_query_type(); - QueryTypeCase query_type_case() const; - void clear_consistency_selector(); - ConsistencySelectorCase consistency_selector_case() const; - // @@protoc_insertion_point(class_scope:google.firestore.v1.RunAggregationQueryRequest) - private: - class _Internal; - void set_has_structured_aggregation_query(); - void set_has_transaction(); - void set_has_new_transaction(); - void set_has_read_time(); - - inline bool has_query_type() const; - inline void clear_has_query_type(); - - inline bool has_consistency_selector() const; - inline void clear_has_consistency_selector(); - - friend class ::google::protobuf::internal::TcParser; - static const ::google::protobuf::internal::TcParseTable< - 0, 5, 3, - 61, 2> - _table_; - friend class ::google::protobuf::MessageLite; - friend class ::google::protobuf::Arena; - template - friend class ::google::protobuf::Arena::InternalHelper; - using InternalArenaConstructable_ = void; - using DestructorSkippable_ = void; - struct Impl_ { + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 2, 3, 1, + 50, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { inline explicit constexpr Impl_( ::google::protobuf::internal::ConstantInitialized) noexcept; @@ -6572,48 +6503,36 @@ class RunAggregationQueryRequest final : ::google::protobuf::Arena* arena); inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, const Impl_& from); - ::google::protobuf::internal::ArenaStringPtr parent_; - union QueryTypeUnion { - constexpr QueryTypeUnion() : _constinit_{} {} - ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::firestore::v1::StructuredAggregationQuery* structured_aggregation_query_; - } query_type_; - union ConsistencySelectorUnion { - constexpr ConsistencySelectorUnion() : _constinit_{} {} - ::google::protobuf::internal::ConstantInitialized _constinit_; - ::google::protobuf::internal::ArenaStringPtr transaction_; - ::google::firestore::v1::TransactionOptions* new_transaction_; - ::google::protobuf::Timestamp* read_time_; - } consistency_selector_; + ::google::protobuf::RepeatedPtrField< ::google::firestore::v1::Write > writes_; + ::google::protobuf::internal::ArenaStringPtr database_; + ::google::protobuf::internal::ArenaStringPtr transaction_; mutable ::google::protobuf::internal::CachedSize _cached_size_; - ::uint32_t _oneof_case_[2]; - PROTOBUF_TSAN_DECLARE_MEMBER }; union { Impl_ _impl_; }; friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; };// ------------------------------------------------------------------- -class ListenRequest final : - public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.ListenRequest) */ { +class Target final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.Target) */ { public: - inline ListenRequest() : ListenRequest(nullptr) {} - ~ListenRequest() override; + inline Target() : Target(nullptr) {} + ~Target() override; template - explicit PROTOBUF_CONSTEXPR ListenRequest(::google::protobuf::internal::ConstantInitialized); + explicit PROTOBUF_CONSTEXPR Target(::google::protobuf::internal::ConstantInitialized); - inline ListenRequest(const ListenRequest& from) - : ListenRequest(nullptr, from) {} - ListenRequest(ListenRequest&& from) noexcept - : ListenRequest() { + inline Target(const Target& from) + : Target(nullptr, from) {} + Target(Target&& from) noexcept + : Target() { *this = ::std::move(from); } - inline ListenRequest& operator=(const ListenRequest& from) { + inline Target& operator=(const Target& from) { CopyFrom(from); return *this; } - inline ListenRequest& operator=(ListenRequest&& from) noexcept { + inline Target& operator=(Target&& from) noexcept { if (this == &from) return *this; if (GetArena() == from.GetArena() #ifdef PROTOBUF_FORCE_COPY_IN_MOVE @@ -6645,26 +6564,32 @@ class ListenRequest final : static const ::google::protobuf::Reflection* GetReflection() { return default_instance().GetMetadata().reflection; } - static const ListenRequest& default_instance() { + static const Target& default_instance() { return *internal_default_instance(); } - enum TargetChangeCase { - kAddTarget = 2, - kRemoveTarget = 3, - TARGET_CHANGE_NOT_SET = 0, + enum TargetTypeCase { + kQuery = 2, + kDocuments = 3, + TARGET_TYPE_NOT_SET = 0, }; - static inline const ListenRequest* internal_default_instance() { - return reinterpret_cast( - &_ListenRequest_default_instance_); + enum ResumeTypeCase { + kResumeToken = 4, + kReadTime = 11, + RESUME_TYPE_NOT_SET = 0, + }; + + static inline const Target* internal_default_instance() { + return reinterpret_cast( + &_Target_default_instance_); } static constexpr int kIndexInFileMessages = - 21; + 27; - friend void swap(ListenRequest& a, ListenRequest& b) { + friend void swap(Target& a, Target& b) { a.Swap(&b); } - inline void Swap(ListenRequest* other) { + inline void Swap(Target* other) { if (other == this) return; #ifdef PROTOBUF_FORCE_COPY_IN_SWAP if (GetArena() != nullptr && @@ -6677,7 +6602,7 @@ class ListenRequest final : ::google::protobuf::internal::GenericSwap(this, other); } } - void UnsafeArenaSwap(ListenRequest* other) { + void UnsafeArenaSwap(Target* other) { if (other == this) return; ABSL_DCHECK(GetArena() == other->GetArena()); InternalSwap(other); @@ -6685,14 +6610,14 @@ class ListenRequest final : // implements Message ---------------------------------------------- - ListenRequest* New(::google::protobuf::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); + Target* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); } using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const ListenRequest& from); + void CopyFrom(const Target& from); using ::google::protobuf::Message::MergeFrom; - void MergeFrom( const ListenRequest& from) { - ListenRequest::MergeImpl(*this, from); + void MergeFrom( const Target& from) { + Target::MergeImpl(*this, from); } private: static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); @@ -6710,16 +6635,16 @@ class ListenRequest final : ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; void SharedCtor(::google::protobuf::Arena* arena); void SharedDtor(); - void InternalSwap(ListenRequest* other); + void InternalSwap(Target* other); private: friend class ::google::protobuf::internal::AnyMetadata; static ::absl::string_view FullMessageName() { - return "google.firestore.v1.ListenRequest"; + return "google.firestore.v1.Target"; } protected: - explicit ListenRequest(::google::protobuf::Arena* arena); - ListenRequest(::google::protobuf::Arena* arena, const ListenRequest& from); + explicit Target(::google::protobuf::Arena* arena); + Target(::google::protobuf::Arena* arena, const Target& from); public: static const ClassData _class_data_; @@ -6729,90 +6654,709 @@ class ListenRequest final : // nested types ---------------------------------------------------- + using DocumentsTarget = Target_DocumentsTarget; + using QueryTarget = Target_QueryTarget; // accessors ------------------------------------------------------- enum : int { - kLabelsFieldNumber = 4, - kDatabaseFieldNumber = 1, - kAddTargetFieldNumber = 2, - kRemoveTargetFieldNumber = 3, + kExpectedCountFieldNumber = 12, + kTargetIdFieldNumber = 5, + kOnceFieldNumber = 6, + kQueryFieldNumber = 2, + kDocumentsFieldNumber = 3, + kResumeTokenFieldNumber = 4, + kReadTimeFieldNumber = 11, }; - // map labels = 4; - int labels_size() const; + // .google.protobuf.Int32Value expected_count = 12; + bool has_expected_count() const; + void clear_expected_count() ; + const ::google::protobuf::Int32Value& expected_count() const; + PROTOBUF_NODISCARD ::google::protobuf::Int32Value* release_expected_count(); + ::google::protobuf::Int32Value* mutable_expected_count(); + void set_allocated_expected_count(::google::protobuf::Int32Value* value); + void unsafe_arena_set_allocated_expected_count(::google::protobuf::Int32Value* value); + ::google::protobuf::Int32Value* unsafe_arena_release_expected_count(); + private: - int _internal_labels_size() const; + const ::google::protobuf::Int32Value& _internal_expected_count() const; + ::google::protobuf::Int32Value* _internal_mutable_expected_count(); public: - void clear_labels() ; - const ::google::protobuf::Map& labels() const; - ::google::protobuf::Map* mutable_labels(); + // int32 target_id = 5; + void clear_target_id() ; + ::int32_t target_id() const; + void set_target_id(::int32_t value); private: - const ::google::protobuf::Map& _internal_labels() const; - ::google::protobuf::Map* _internal_mutable_labels(); + ::int32_t _internal_target_id() const; + void _internal_set_target_id(::int32_t value); public: - // string database = 1; - void clear_database() ; - const std::string& database() const; - template - void set_database(Arg_&& arg, Args_... args); - std::string* mutable_database(); - PROTOBUF_NODISCARD std::string* release_database(); - void set_allocated_database(std::string* value); + // bool once = 6; + void clear_once() ; + bool once() const; + void set_once(bool value); private: - const std::string& _internal_database() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_database( - const std::string& value); - std::string* _internal_mutable_database(); + bool _internal_once() const; + void _internal_set_once(bool value); public: - // .google.firestore.v1.Target add_target = 2; - bool has_add_target() const; + // .google.firestore.v1.Target.QueryTarget query = 2; + bool has_query() const; private: - bool _internal_has_add_target() const; + bool _internal_has_query() const; public: - void clear_add_target() ; - const ::google::firestore::v1::Target& add_target() const; - PROTOBUF_NODISCARD ::google::firestore::v1::Target* release_add_target(); - ::google::firestore::v1::Target* mutable_add_target(); - void set_allocated_add_target(::google::firestore::v1::Target* value); - void unsafe_arena_set_allocated_add_target(::google::firestore::v1::Target* value); - ::google::firestore::v1::Target* unsafe_arena_release_add_target(); + void clear_query() ; + const ::google::firestore::v1::Target_QueryTarget& query() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Target_QueryTarget* release_query(); + ::google::firestore::v1::Target_QueryTarget* mutable_query(); + void set_allocated_query(::google::firestore::v1::Target_QueryTarget* value); + void unsafe_arena_set_allocated_query(::google::firestore::v1::Target_QueryTarget* value); + ::google::firestore::v1::Target_QueryTarget* unsafe_arena_release_query(); private: - const ::google::firestore::v1::Target& _internal_add_target() const; - ::google::firestore::v1::Target* _internal_mutable_add_target(); + const ::google::firestore::v1::Target_QueryTarget& _internal_query() const; + ::google::firestore::v1::Target_QueryTarget* _internal_mutable_query(); public: - // int32 remove_target = 3; - bool has_remove_target() const; - void clear_remove_target() ; - ::int32_t remove_target() const; - void set_remove_target(::int32_t value); - + // .google.firestore.v1.Target.DocumentsTarget documents = 3; + bool has_documents() const; private: - ::int32_t _internal_remove_target() const; - void _internal_set_remove_target(::int32_t value); + bool _internal_has_documents() const; public: - void clear_target_change(); - TargetChangeCase target_change_case() const; - // @@protoc_insertion_point(class_scope:google.firestore.v1.ListenRequest) - private: - class _Internal; - void set_has_add_target(); - void set_has_remove_target(); + void clear_documents() ; + const ::google::firestore::v1::Target_DocumentsTarget& documents() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Target_DocumentsTarget* release_documents(); + ::google::firestore::v1::Target_DocumentsTarget* mutable_documents(); + void set_allocated_documents(::google::firestore::v1::Target_DocumentsTarget* value); + void unsafe_arena_set_allocated_documents(::google::firestore::v1::Target_DocumentsTarget* value); + ::google::firestore::v1::Target_DocumentsTarget* unsafe_arena_release_documents(); - inline bool has_target_change() const; - inline void clear_has_target_change(); + private: + const ::google::firestore::v1::Target_DocumentsTarget& _internal_documents() const; + ::google::firestore::v1::Target_DocumentsTarget* _internal_mutable_documents(); - friend class ::google::protobuf::internal::TcParser; - static const ::google::protobuf::internal::TcParseTable< - 0, 4, 2, + public: + // bytes resume_token = 4; + bool has_resume_token() const; + void clear_resume_token() ; + const std::string& resume_token() const; + template + void set_resume_token(Arg_&& arg, Args_... args); + std::string* mutable_resume_token(); + PROTOBUF_NODISCARD std::string* release_resume_token(); + void set_allocated_resume_token(std::string* value); + + private: + const std::string& _internal_resume_token() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_resume_token( + const std::string& value); + std::string* _internal_mutable_resume_token(); + + public: + // .google.protobuf.Timestamp read_time = 11; + bool has_read_time() const; + private: + bool _internal_has_read_time() const; + + public: + void clear_read_time() ; + const ::google::protobuf::Timestamp& read_time() const; + PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); + ::google::protobuf::Timestamp* mutable_read_time(); + void set_allocated_read_time(::google::protobuf::Timestamp* value); + void unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value); + ::google::protobuf::Timestamp* unsafe_arena_release_read_time(); + + private: + const ::google::protobuf::Timestamp& _internal_read_time() const; + ::google::protobuf::Timestamp* _internal_mutable_read_time(); + + public: + void clear_target_type(); + TargetTypeCase target_type_case() const; + void clear_resume_type(); + ResumeTypeCase resume_type_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.Target) + private: + class _Internal; + void set_has_query(); + void set_has_documents(); + void set_has_resume_token(); + void set_has_read_time(); + + inline bool has_target_type() const; + inline void clear_has_target_type(); + + inline bool has_resume_type() const; + inline void clear_has_resume_type(); + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 2, 7, 4, + 0, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + + inline explicit constexpr Impl_( + ::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena); + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena, const Impl_& from); + ::google::protobuf::internal::HasBits<1> _has_bits_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::Int32Value* expected_count_; + ::int32_t target_id_; + bool once_; + union TargetTypeUnion { + constexpr TargetTypeUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::firestore::v1::Target_QueryTarget* query_; + ::google::firestore::v1::Target_DocumentsTarget* documents_; + } target_type_; + union ResumeTypeUnion { + constexpr ResumeTypeUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::protobuf::internal::ArenaStringPtr resume_token_; + ::google::protobuf::Timestamp* read_time_; + } resume_type_; + ::uint32_t _oneof_case_[2]; + + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; +};// ------------------------------------------------------------------- + +class RunAggregationQueryRequest final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.RunAggregationQueryRequest) */ { + public: + inline RunAggregationQueryRequest() : RunAggregationQueryRequest(nullptr) {} + ~RunAggregationQueryRequest() override; + template + explicit PROTOBUF_CONSTEXPR RunAggregationQueryRequest(::google::protobuf::internal::ConstantInitialized); + + inline RunAggregationQueryRequest(const RunAggregationQueryRequest& from) + : RunAggregationQueryRequest(nullptr, from) {} + RunAggregationQueryRequest(RunAggregationQueryRequest&& from) noexcept + : RunAggregationQueryRequest() { + *this = ::std::move(from); + } + + inline RunAggregationQueryRequest& operator=(const RunAggregationQueryRequest& from) { + CopyFrom(from); + return *this; + } + inline RunAggregationQueryRequest& operator=(RunAggregationQueryRequest&& from) noexcept { + if (this == &from) return *this; + if (GetArena() == from.GetArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const RunAggregationQueryRequest& default_instance() { + return *internal_default_instance(); + } + enum QueryTypeCase { + kStructuredAggregationQuery = 2, + QUERY_TYPE_NOT_SET = 0, + }; + + enum ConsistencySelectorCase { + kTransaction = 4, + kNewTransaction = 5, + kReadTime = 6, + CONSISTENCY_SELECTOR_NOT_SET = 0, + }; + + static inline const RunAggregationQueryRequest* internal_default_instance() { + return reinterpret_cast( + &_RunAggregationQueryRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = + 17; + + friend void swap(RunAggregationQueryRequest& a, RunAggregationQueryRequest& b) { + a.Swap(&b); + } + inline void Swap(RunAggregationQueryRequest* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() != nullptr && + GetArena() == other->GetArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() == other->GetArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RunAggregationQueryRequest* other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RunAggregationQueryRequest* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const RunAggregationQueryRequest& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const RunAggregationQueryRequest& from) { + RunAggregationQueryRequest::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void InternalSwap(RunAggregationQueryRequest* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "google.firestore.v1.RunAggregationQueryRequest"; + } + protected: + explicit RunAggregationQueryRequest(::google::protobuf::Arena* arena); + RunAggregationQueryRequest(::google::protobuf::Arena* arena, const RunAggregationQueryRequest& from); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kParentFieldNumber = 1, + kStructuredAggregationQueryFieldNumber = 2, + kTransactionFieldNumber = 4, + kNewTransactionFieldNumber = 5, + kReadTimeFieldNumber = 6, + }; + // string parent = 1; + void clear_parent() ; + const std::string& parent() const; + template + void set_parent(Arg_&& arg, Args_... args); + std::string* mutable_parent(); + PROTOBUF_NODISCARD std::string* release_parent(); + void set_allocated_parent(std::string* value); + + private: + const std::string& _internal_parent() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_parent( + const std::string& value); + std::string* _internal_mutable_parent(); + + public: + // .google.firestore.v1.StructuredAggregationQuery structured_aggregation_query = 2; + bool has_structured_aggregation_query() const; + private: + bool _internal_has_structured_aggregation_query() const; + + public: + void clear_structured_aggregation_query() ; + const ::google::firestore::v1::StructuredAggregationQuery& structured_aggregation_query() const; + PROTOBUF_NODISCARD ::google::firestore::v1::StructuredAggregationQuery* release_structured_aggregation_query(); + ::google::firestore::v1::StructuredAggregationQuery* mutable_structured_aggregation_query(); + void set_allocated_structured_aggregation_query(::google::firestore::v1::StructuredAggregationQuery* value); + void unsafe_arena_set_allocated_structured_aggregation_query(::google::firestore::v1::StructuredAggregationQuery* value); + ::google::firestore::v1::StructuredAggregationQuery* unsafe_arena_release_structured_aggregation_query(); + + private: + const ::google::firestore::v1::StructuredAggregationQuery& _internal_structured_aggregation_query() const; + ::google::firestore::v1::StructuredAggregationQuery* _internal_mutable_structured_aggregation_query(); + + public: + // bytes transaction = 4; + bool has_transaction() const; + void clear_transaction() ; + const std::string& transaction() const; + template + void set_transaction(Arg_&& arg, Args_... args); + std::string* mutable_transaction(); + PROTOBUF_NODISCARD std::string* release_transaction(); + void set_allocated_transaction(std::string* value); + + private: + const std::string& _internal_transaction() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_transaction( + const std::string& value); + std::string* _internal_mutable_transaction(); + + public: + // .google.firestore.v1.TransactionOptions new_transaction = 5; + bool has_new_transaction() const; + private: + bool _internal_has_new_transaction() const; + + public: + void clear_new_transaction() ; + const ::google::firestore::v1::TransactionOptions& new_transaction() const; + PROTOBUF_NODISCARD ::google::firestore::v1::TransactionOptions* release_new_transaction(); + ::google::firestore::v1::TransactionOptions* mutable_new_transaction(); + void set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); + void unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value); + ::google::firestore::v1::TransactionOptions* unsafe_arena_release_new_transaction(); + + private: + const ::google::firestore::v1::TransactionOptions& _internal_new_transaction() const; + ::google::firestore::v1::TransactionOptions* _internal_mutable_new_transaction(); + + public: + // .google.protobuf.Timestamp read_time = 6; + bool has_read_time() const; + private: + bool _internal_has_read_time() const; + + public: + void clear_read_time() ; + const ::google::protobuf::Timestamp& read_time() const; + PROTOBUF_NODISCARD ::google::protobuf::Timestamp* release_read_time(); + ::google::protobuf::Timestamp* mutable_read_time(); + void set_allocated_read_time(::google::protobuf::Timestamp* value); + void unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value); + ::google::protobuf::Timestamp* unsafe_arena_release_read_time(); + + private: + const ::google::protobuf::Timestamp& _internal_read_time() const; + ::google::protobuf::Timestamp* _internal_mutable_read_time(); + + public: + void clear_query_type(); + QueryTypeCase query_type_case() const; + void clear_consistency_selector(); + ConsistencySelectorCase consistency_selector_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.RunAggregationQueryRequest) + private: + class _Internal; + void set_has_structured_aggregation_query(); + void set_has_transaction(); + void set_has_new_transaction(); + void set_has_read_time(); + + inline bool has_query_type() const; + inline void clear_has_query_type(); + + inline bool has_consistency_selector() const; + inline void clear_has_consistency_selector(); + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 0, 5, 3, + 61, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + + inline explicit constexpr Impl_( + ::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena); + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena, const Impl_& from); + ::google::protobuf::internal::ArenaStringPtr parent_; + union QueryTypeUnion { + constexpr QueryTypeUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::firestore::v1::StructuredAggregationQuery* structured_aggregation_query_; + } query_type_; + union ConsistencySelectorUnion { + constexpr ConsistencySelectorUnion() : _constinit_{} {} + ::google::protobuf::internal::ConstantInitialized _constinit_; + ::google::protobuf::internal::ArenaStringPtr transaction_; + ::google::firestore::v1::TransactionOptions* new_transaction_; + ::google::protobuf::Timestamp* read_time_; + } consistency_selector_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t _oneof_case_[2]; + + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_google_2ffirestore_2fv1_2ffirestore_2eproto; +};// ------------------------------------------------------------------- + +class ListenRequest final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.ListenRequest) */ { + public: + inline ListenRequest() : ListenRequest(nullptr) {} + ~ListenRequest() override; + template + explicit PROTOBUF_CONSTEXPR ListenRequest(::google::protobuf::internal::ConstantInitialized); + + inline ListenRequest(const ListenRequest& from) + : ListenRequest(nullptr, from) {} + ListenRequest(ListenRequest&& from) noexcept + : ListenRequest() { + *this = ::std::move(from); + } + + inline ListenRequest& operator=(const ListenRequest& from) { + CopyFrom(from); + return *this; + } + inline ListenRequest& operator=(ListenRequest&& from) noexcept { + if (this == &from) return *this; + if (GetArena() == from.GetArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const ListenRequest& default_instance() { + return *internal_default_instance(); + } + enum TargetChangeCase { + kAddTarget = 2, + kRemoveTarget = 3, + TARGET_CHANGE_NOT_SET = 0, + }; + + static inline const ListenRequest* internal_default_instance() { + return reinterpret_cast( + &_ListenRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = + 23; + + friend void swap(ListenRequest& a, ListenRequest& b) { + a.Swap(&b); + } + inline void Swap(ListenRequest* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() != nullptr && + GetArena() == other->GetArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() == other->GetArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ListenRequest* other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ListenRequest* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const ListenRequest& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const ListenRequest& from) { + ListenRequest::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void InternalSwap(ListenRequest* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "google.firestore.v1.ListenRequest"; + } + protected: + explicit ListenRequest(::google::protobuf::Arena* arena); + ListenRequest(::google::protobuf::Arena* arena, const ListenRequest& from); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + + // accessors ------------------------------------------------------- + + enum : int { + kLabelsFieldNumber = 4, + kDatabaseFieldNumber = 1, + kAddTargetFieldNumber = 2, + kRemoveTargetFieldNumber = 3, + }; + // map labels = 4; + int labels_size() const; + private: + int _internal_labels_size() const; + + public: + void clear_labels() ; + const ::google::protobuf::Map& labels() const; + ::google::protobuf::Map* mutable_labels(); + + private: + const ::google::protobuf::Map& _internal_labels() const; + ::google::protobuf::Map* _internal_mutable_labels(); + + public: + // string database = 1; + void clear_database() ; + const std::string& database() const; + template + void set_database(Arg_&& arg, Args_... args); + std::string* mutable_database(); + PROTOBUF_NODISCARD std::string* release_database(); + void set_allocated_database(std::string* value); + + private: + const std::string& _internal_database() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_database( + const std::string& value); + std::string* _internal_mutable_database(); + + public: + // .google.firestore.v1.Target add_target = 2; + bool has_add_target() const; + private: + bool _internal_has_add_target() const; + + public: + void clear_add_target() ; + const ::google::firestore::v1::Target& add_target() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Target* release_add_target(); + ::google::firestore::v1::Target* mutable_add_target(); + void set_allocated_add_target(::google::firestore::v1::Target* value); + void unsafe_arena_set_allocated_add_target(::google::firestore::v1::Target* value); + ::google::firestore::v1::Target* unsafe_arena_release_add_target(); + + private: + const ::google::firestore::v1::Target& _internal_add_target() const; + ::google::firestore::v1::Target* _internal_mutable_add_target(); + + public: + // int32 remove_target = 3; + bool has_remove_target() const; + void clear_remove_target() ; + ::int32_t remove_target() const; + void set_remove_target(::int32_t value); + + private: + ::int32_t _internal_remove_target() const; + void _internal_set_remove_target(::int32_t value); + + public: + void clear_target_change(); + TargetChangeCase target_change_case() const; + // @@protoc_insertion_point(class_scope:google.firestore.v1.ListenRequest) + private: + class _Internal; + void set_has_add_target(); + void set_has_remove_target(); + + inline bool has_target_change() const; + inline void clear_has_target_change(); + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 0, 4, 2, 56, 2> _table_; friend class ::google::protobuf::MessageLite; @@ -7669,320 +8213,779 @@ inline bool ListDocumentsRequest::_internal_show_missing() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); return _impl_.show_missing_; } -inline void ListDocumentsRequest::_internal_set_show_missing(bool value) { +inline void ListDocumentsRequest::_internal_set_show_missing(bool value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.show_missing_ = value; +} + +inline bool ListDocumentsRequest::has_consistency_selector() const { + return consistency_selector_case() != CONSISTENCY_SELECTOR_NOT_SET; +} +inline void ListDocumentsRequest::clear_has_consistency_selector() { + _impl_._oneof_case_[0] = CONSISTENCY_SELECTOR_NOT_SET; +} +inline ListDocumentsRequest::ConsistencySelectorCase ListDocumentsRequest::consistency_selector_case() const { + return ListDocumentsRequest::ConsistencySelectorCase(_impl_._oneof_case_[0]); +} +// ------------------------------------------------------------------- + +// ListDocumentsResponse + +// repeated .google.firestore.v1.Document documents = 1; +inline int ListDocumentsResponse::_internal_documents_size() const { + return _internal_documents().size(); +} +inline int ListDocumentsResponse::documents_size() const { + return _internal_documents_size(); +} +inline ::google::firestore::v1::Document* ListDocumentsResponse::mutable_documents(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ListDocumentsResponse.documents) + return _internal_mutable_documents()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>* ListDocumentsResponse::mutable_documents() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.ListDocumentsResponse.documents) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_documents(); +} +inline const ::google::firestore::v1::Document& ListDocumentsResponse::documents(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ListDocumentsResponse.documents) + return _internal_documents().Get(index); +} +inline ::google::firestore::v1::Document* ListDocumentsResponse::add_documents() ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::google::firestore::v1::Document* _add = _internal_mutable_documents()->Add(); + // @@protoc_insertion_point(field_add:google.firestore.v1.ListDocumentsResponse.documents) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>& ListDocumentsResponse::documents() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.ListDocumentsResponse.documents) + return _internal_documents(); +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>& +ListDocumentsResponse::_internal_documents() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.documents_; +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>* +ListDocumentsResponse::_internal_mutable_documents() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.documents_; +} + +// string next_page_token = 2; +inline void ListDocumentsResponse::clear_next_page_token() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.next_page_token_.ClearToEmpty(); +} +inline const std::string& ListDocumentsResponse::next_page_token() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ListDocumentsResponse.next_page_token) + return _internal_next_page_token(); +} +template +inline PROTOBUF_ALWAYS_INLINE void ListDocumentsResponse::set_next_page_token(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.next_page_token_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.ListDocumentsResponse.next_page_token) +} +inline std::string* ListDocumentsResponse::mutable_next_page_token() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_next_page_token(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ListDocumentsResponse.next_page_token) + return _s; +} +inline const std::string& ListDocumentsResponse::_internal_next_page_token() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.next_page_token_.Get(); +} +inline void ListDocumentsResponse::_internal_set_next_page_token(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.next_page_token_.Set(value, GetArena()); +} +inline std::string* ListDocumentsResponse::_internal_mutable_next_page_token() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.next_page_token_.Mutable( GetArena()); +} +inline std::string* ListDocumentsResponse::release_next_page_token() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.ListDocumentsResponse.next_page_token) + return _impl_.next_page_token_.Release(); +} +inline void ListDocumentsResponse::set_allocated_next_page_token(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.next_page_token_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.next_page_token_.IsDefault()) { + _impl_.next_page_token_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ListDocumentsResponse.next_page_token) +} + +// ------------------------------------------------------------------- + +// CreateDocumentRequest + +// string parent = 1; +inline void CreateDocumentRequest::clear_parent() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.parent_.ClearToEmpty(); +} +inline const std::string& CreateDocumentRequest::parent() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.parent) + return _internal_parent(); +} +template +inline PROTOBUF_ALWAYS_INLINE void CreateDocumentRequest::set_parent(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.parent_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.CreateDocumentRequest.parent) +} +inline std::string* CreateDocumentRequest::mutable_parent() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_parent(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.parent) + return _s; +} +inline const std::string& CreateDocumentRequest::_internal_parent() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.parent_.Get(); +} +inline void CreateDocumentRequest::_internal_set_parent(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.parent_.Set(value, GetArena()); +} +inline std::string* CreateDocumentRequest::_internal_mutable_parent() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.parent_.Mutable( GetArena()); +} +inline std::string* CreateDocumentRequest::release_parent() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.parent) + return _impl_.parent_.Release(); +} +inline void CreateDocumentRequest::set_allocated_parent(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.parent_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.parent_.IsDefault()) { + _impl_.parent_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.parent) +} + +// string collection_id = 2; +inline void CreateDocumentRequest::clear_collection_id() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.collection_id_.ClearToEmpty(); +} +inline const std::string& CreateDocumentRequest::collection_id() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.collection_id) + return _internal_collection_id(); +} +template +inline PROTOBUF_ALWAYS_INLINE void CreateDocumentRequest::set_collection_id(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.collection_id_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.CreateDocumentRequest.collection_id) +} +inline std::string* CreateDocumentRequest::mutable_collection_id() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_collection_id(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.collection_id) + return _s; +} +inline const std::string& CreateDocumentRequest::_internal_collection_id() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.collection_id_.Get(); +} +inline void CreateDocumentRequest::_internal_set_collection_id(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.collection_id_.Set(value, GetArena()); +} +inline std::string* CreateDocumentRequest::_internal_mutable_collection_id() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.collection_id_.Mutable( GetArena()); +} +inline std::string* CreateDocumentRequest::release_collection_id() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.collection_id) + return _impl_.collection_id_.Release(); +} +inline void CreateDocumentRequest::set_allocated_collection_id(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.collection_id_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.collection_id_.IsDefault()) { + _impl_.collection_id_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.collection_id) +} + +// string document_id = 3; +inline void CreateDocumentRequest::clear_document_id() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.document_id_.ClearToEmpty(); +} +inline const std::string& CreateDocumentRequest::document_id() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.document_id) + return _internal_document_id(); +} +template +inline PROTOBUF_ALWAYS_INLINE void CreateDocumentRequest::set_document_id(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.document_id_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.CreateDocumentRequest.document_id) +} +inline std::string* CreateDocumentRequest::mutable_document_id() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_document_id(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.document_id) + return _s; +} +inline const std::string& CreateDocumentRequest::_internal_document_id() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.document_id_.Get(); +} +inline void CreateDocumentRequest::_internal_set_document_id(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - _impl_.show_missing_ = value; + _impl_.document_id_.Set(value, GetArena()); } - -inline bool ListDocumentsRequest::has_consistency_selector() const { - return consistency_selector_case() != CONSISTENCY_SELECTOR_NOT_SET; +inline std::string* CreateDocumentRequest::_internal_mutable_document_id() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.document_id_.Mutable( GetArena()); } -inline void ListDocumentsRequest::clear_has_consistency_selector() { - _impl_._oneof_case_[0] = CONSISTENCY_SELECTOR_NOT_SET; +inline std::string* CreateDocumentRequest::release_document_id() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.document_id) + return _impl_.document_id_.Release(); } -inline ListDocumentsRequest::ConsistencySelectorCase ListDocumentsRequest::consistency_selector_case() const { - return ListDocumentsRequest::ConsistencySelectorCase(_impl_._oneof_case_[0]); +inline void CreateDocumentRequest::set_allocated_document_id(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.document_id_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.document_id_.IsDefault()) { + _impl_.document_id_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.document_id) } -// ------------------------------------------------------------------- - -// ListDocumentsResponse -// repeated .google.firestore.v1.Document documents = 1; -inline int ListDocumentsResponse::_internal_documents_size() const { - return _internal_documents().size(); +// .google.firestore.v1.Document document = 4; +inline bool CreateDocumentRequest::has_document() const { + bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; + PROTOBUF_ASSUME(!value || _impl_.document_ != nullptr); + return value; } -inline int ListDocumentsResponse::documents_size() const { - return _internal_documents_size(); +inline const ::google::firestore::v1::Document& CreateDocumentRequest::_internal_document() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + const ::google::firestore::v1::Document* p = _impl_.document_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Document_default_instance_); } -inline ::google::firestore::v1::Document* ListDocumentsResponse::mutable_documents(int index) - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable:google.firestore.v1.ListDocumentsResponse.documents) - return _internal_mutable_documents()->Mutable(index); +inline const ::google::firestore::v1::Document& CreateDocumentRequest::document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.document) + return _internal_document(); } -inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>* ListDocumentsResponse::mutable_documents() - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.ListDocumentsResponse.documents) +inline void CreateDocumentRequest::unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - return _internal_mutable_documents(); -} -inline const ::google::firestore::v1::Document& ListDocumentsResponse::documents(int index) const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.ListDocumentsResponse.documents) - return _internal_documents().Get(index); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + } + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.CreateDocumentRequest.document) } -inline ::google::firestore::v1::Document* ListDocumentsResponse::add_documents() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline ::google::firestore::v1::Document* CreateDocumentRequest::release_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ::google::firestore::v1::Document* _add = _internal_mutable_documents()->Add(); - // @@protoc_insertion_point(field_add:google.firestore.v1.ListDocumentsResponse.documents) - return _add; -} -inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>& ListDocumentsResponse::documents() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_list:google.firestore.v1.ListDocumentsResponse.documents) - return _internal_documents(); -} -inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>& -ListDocumentsResponse::_internal_documents() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.documents_; -} -inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>* -ListDocumentsResponse::_internal_mutable_documents() { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return &_impl_.documents_; + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Document* released = _impl_.document_; + _impl_.document_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; } +inline ::google::firestore::v1::Document* CreateDocumentRequest::unsafe_arena_release_document() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.document) -// string next_page_token = 2; -inline void ListDocumentsResponse::clear_next_page_token() { + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Document* temp = _impl_.document_; + _impl_.document_ = nullptr; + return temp; +} +inline ::google::firestore::v1::Document* CreateDocumentRequest::_internal_mutable_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.next_page_token_.ClearToEmpty(); + _impl_._has_bits_[0] |= 0x00000001u; + if (_impl_.document_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(p); + } + return _impl_.document_; } -inline const std::string& ListDocumentsResponse::next_page_token() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.ListDocumentsResponse.next_page_token) - return _internal_next_page_token(); +inline ::google::firestore::v1::Document* CreateDocumentRequest::mutable_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Document* _msg = _internal_mutable_document(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.document) + return _msg; } -template -inline PROTOBUF_ALWAYS_INLINE void ListDocumentsResponse::set_next_page_token(Arg_&& arg, - Args_... args) { +inline void CreateDocumentRequest::set_allocated_document(::google::firestore::v1::Document* value) { + ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.next_page_token_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.ListDocumentsResponse.next_page_token) + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.document) } -inline std::string* ListDocumentsResponse::mutable_next_page_token() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_next_page_token(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.ListDocumentsResponse.next_page_token) - return _s; + +// .google.firestore.v1.DocumentMask mask = 5; +inline bool CreateDocumentRequest::has_mask() const { + bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; + PROTOBUF_ASSUME(!value || _impl_.mask_ != nullptr); + return value; } -inline const std::string& ListDocumentsResponse::_internal_next_page_token() const { +inline const ::google::firestore::v1::DocumentMask& CreateDocumentRequest::_internal_mask() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.next_page_token_.Get(); + const ::google::firestore::v1::DocumentMask* p = _impl_.mask_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); } -inline void ListDocumentsResponse::_internal_set_next_page_token(const std::string& value) { +inline const ::google::firestore::v1::DocumentMask& CreateDocumentRequest::mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.mask) + return _internal_mask(); +} +inline void CreateDocumentRequest::unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.next_page_token_.Set(value, GetArena()); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + } + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000002u; + } else { + _impl_._has_bits_[0] &= ~0x00000002u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.CreateDocumentRequest.mask) } -inline std::string* ListDocumentsResponse::_internal_mutable_next_page_token() { +inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::release_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.next_page_token_.Mutable( GetArena()); + + _impl_._has_bits_[0] &= ~0x00000002u; + ::google::firestore::v1::DocumentMask* released = _impl_.mask_; + _impl_.mask_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; } -inline std::string* ListDocumentsResponse::release_next_page_token() { +inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::unsafe_arena_release_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.ListDocumentsResponse.next_page_token) - return _impl_.next_page_token_.Release(); + // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.mask) + + _impl_._has_bits_[0] &= ~0x00000002u; + ::google::firestore::v1::DocumentMask* temp = _impl_.mask_; + _impl_.mask_ = nullptr; + return temp; } -inline void ListDocumentsResponse::set_allocated_next_page_token(std::string* value) { +inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::_internal_mutable_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.next_page_token_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.next_page_token_.IsDefault()) { - _impl_.next_page_token_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ListDocumentsResponse.next_page_token) + _impl_._has_bits_[0] |= 0x00000002u; + if (_impl_.mask_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); + } + return _impl_.mask_; +} +inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::mutable_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_mask(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.mask) + return _msg; +} +inline void CreateDocumentRequest::set_allocated_mask(::google::firestore::v1::DocumentMask* value) { + ::google::protobuf::Arena* message_arena = GetArena(); + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000002u; + } else { + _impl_._has_bits_[0] &= ~0x00000002u; + } + + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.mask) } // ------------------------------------------------------------------- -// CreateDocumentRequest +// UpdateDocumentRequest -// string parent = 1; -inline void CreateDocumentRequest::clear_parent() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.parent_.ClearToEmpty(); -} -inline const std::string& CreateDocumentRequest::parent() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.parent) - return _internal_parent(); -} -template -inline PROTOBUF_ALWAYS_INLINE void CreateDocumentRequest::set_parent(Arg_&& arg, - Args_... args) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.parent_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.CreateDocumentRequest.parent) -} -inline std::string* CreateDocumentRequest::mutable_parent() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_parent(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.parent) - return _s; +// .google.firestore.v1.Document document = 1; +inline bool UpdateDocumentRequest::has_document() const { + bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; + PROTOBUF_ASSUME(!value || _impl_.document_ != nullptr); + return value; } -inline const std::string& CreateDocumentRequest::_internal_parent() const { +inline const ::google::firestore::v1::Document& UpdateDocumentRequest::_internal_document() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.parent_.Get(); + const ::google::firestore::v1::Document* p = _impl_.document_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Document_default_instance_); } -inline void CreateDocumentRequest::_internal_set_parent(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.parent_.Set(value, GetArena()); +inline const ::google::firestore::v1::Document& UpdateDocumentRequest::document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.document) + return _internal_document(); } -inline std::string* CreateDocumentRequest::_internal_mutable_parent() { +inline void UpdateDocumentRequest::unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.parent_.Mutable( GetArena()); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + } + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.document) } -inline std::string* CreateDocumentRequest::release_parent() { +inline ::google::firestore::v1::Document* UpdateDocumentRequest::release_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.parent) - return _impl_.parent_.Release(); + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Document* released = _impl_.document_; + _impl_.document_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; } -inline void CreateDocumentRequest::set_allocated_parent(std::string* value) { +inline ::google::firestore::v1::Document* UpdateDocumentRequest::unsafe_arena_release_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.parent_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.parent_.IsDefault()) { - _impl_.parent_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.parent) -} + // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.document) -// string collection_id = 2; -inline void CreateDocumentRequest::clear_collection_id() { + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Document* temp = _impl_.document_; + _impl_.document_ = nullptr; + return temp; +} +inline ::google::firestore::v1::Document* UpdateDocumentRequest::_internal_mutable_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.collection_id_.ClearToEmpty(); + _impl_._has_bits_[0] |= 0x00000001u; + if (_impl_.document_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(p); + } + return _impl_.document_; } -inline const std::string& CreateDocumentRequest::collection_id() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.collection_id) - return _internal_collection_id(); +inline ::google::firestore::v1::Document* UpdateDocumentRequest::mutable_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Document* _msg = _internal_mutable_document(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.document) + return _msg; } -template -inline PROTOBUF_ALWAYS_INLINE void CreateDocumentRequest::set_collection_id(Arg_&& arg, - Args_... args) { +inline void UpdateDocumentRequest::set_allocated_document(::google::firestore::v1::Document* value) { + ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.collection_id_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.CreateDocumentRequest.collection_id) + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.document) } -inline std::string* CreateDocumentRequest::mutable_collection_id() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_collection_id(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.collection_id) - return _s; + +// .google.firestore.v1.DocumentMask update_mask = 2; +inline bool UpdateDocumentRequest::has_update_mask() const { + bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; + PROTOBUF_ASSUME(!value || _impl_.update_mask_ != nullptr); + return value; } -inline const std::string& CreateDocumentRequest::_internal_collection_id() const { +inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::_internal_update_mask() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.collection_id_.Get(); + const ::google::firestore::v1::DocumentMask* p = _impl_.update_mask_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); } -inline void CreateDocumentRequest::_internal_set_collection_id(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.collection_id_.Set(value, GetArena()); +inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::update_mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.update_mask) + return _internal_update_mask(); } -inline std::string* CreateDocumentRequest::_internal_mutable_collection_id() { +inline void UpdateDocumentRequest::unsafe_arena_set_allocated_update_mask(::google::firestore::v1::DocumentMask* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.collection_id_.Mutable( GetArena()); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.update_mask_); + } + _impl_.update_mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000002u; + } else { + _impl_._has_bits_[0] &= ~0x00000002u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.update_mask) } -inline std::string* CreateDocumentRequest::release_collection_id() { +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::release_update_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.collection_id) - return _impl_.collection_id_.Release(); + + _impl_._has_bits_[0] &= ~0x00000002u; + ::google::firestore::v1::DocumentMask* released = _impl_.update_mask_; + _impl_.update_mask_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; } -inline void CreateDocumentRequest::set_allocated_collection_id(std::string* value) { +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::unsafe_arena_release_update_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.collection_id_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.collection_id_.IsDefault()) { - _impl_.collection_id_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.collection_id) -} + // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.update_mask) -// string document_id = 3; -inline void CreateDocumentRequest::clear_document_id() { + _impl_._has_bits_[0] &= ~0x00000002u; + ::google::firestore::v1::DocumentMask* temp = _impl_.update_mask_; + _impl_.update_mask_ = nullptr; + return temp; +} +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::_internal_mutable_update_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.document_id_.ClearToEmpty(); + _impl_._has_bits_[0] |= 0x00000002u; + if (_impl_.update_mask_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); + _impl_.update_mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); + } + return _impl_.update_mask_; } -inline const std::string& CreateDocumentRequest::document_id() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.document_id) - return _internal_document_id(); +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::mutable_update_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_update_mask(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.update_mask) + return _msg; } -template -inline PROTOBUF_ALWAYS_INLINE void CreateDocumentRequest::set_document_id(Arg_&& arg, - Args_... args) { +inline void UpdateDocumentRequest::set_allocated_update_mask(::google::firestore::v1::DocumentMask* value) { + ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.document_id_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.CreateDocumentRequest.document_id) -} -inline std::string* CreateDocumentRequest::mutable_document_id() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_document_id(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.document_id) - return _s; + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.update_mask_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000002u; + } else { + _impl_._has_bits_[0] &= ~0x00000002u; + } + + _impl_.update_mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.update_mask) } -inline const std::string& CreateDocumentRequest::_internal_document_id() const { + +// .google.firestore.v1.DocumentMask mask = 3; +inline bool UpdateDocumentRequest::has_mask() const { + bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; + PROTOBUF_ASSUME(!value || _impl_.mask_ != nullptr); + return value; +} +inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::_internal_mask() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.document_id_.Get(); + const ::google::firestore::v1::DocumentMask* p = _impl_.mask_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); } -inline void CreateDocumentRequest::_internal_set_document_id(const std::string& value) { +inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.mask) + return _internal_mask(); +} +inline void UpdateDocumentRequest::unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.document_id_.Set(value, GetArena()); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + } + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000004u; + } else { + _impl_._has_bits_[0] &= ~0x00000004u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.mask) } -inline std::string* CreateDocumentRequest::_internal_mutable_document_id() { +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::release_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.document_id_.Mutable( GetArena()); + + _impl_._has_bits_[0] &= ~0x00000004u; + ::google::firestore::v1::DocumentMask* released = _impl_.mask_; + _impl_.mask_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; } -inline std::string* CreateDocumentRequest::release_document_id() { +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::unsafe_arena_release_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.document_id) - return _impl_.document_id_.Release(); + // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.mask) + + _impl_._has_bits_[0] &= ~0x00000004u; + ::google::firestore::v1::DocumentMask* temp = _impl_.mask_; + _impl_.mask_ = nullptr; + return temp; } -inline void CreateDocumentRequest::set_allocated_document_id(std::string* value) { +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::_internal_mutable_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.document_id_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.document_id_.IsDefault()) { - _impl_.document_id_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.document_id) + _impl_._has_bits_[0] |= 0x00000004u; + if (_impl_.mask_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); + } + return _impl_.mask_; +} +inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::mutable_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_mask(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.mask) + return _msg; } +inline void UpdateDocumentRequest::set_allocated_mask(::google::firestore::v1::DocumentMask* value) { + ::google::protobuf::Arena* message_arena = GetArena(); + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + } -// .google.firestore.v1.Document document = 4; -inline bool CreateDocumentRequest::has_document() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.document_ != nullptr); + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000004u; + } else { + _impl_._has_bits_[0] &= ~0x00000004u; + } + + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.mask) +} + +// .google.firestore.v1.Precondition current_document = 4; +inline bool UpdateDocumentRequest::has_current_document() const { + bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; + PROTOBUF_ASSUME(!value || _impl_.current_document_ != nullptr); return value; } -inline const ::google::firestore::v1::Document& CreateDocumentRequest::_internal_document() const { +inline const ::google::firestore::v1::Precondition& UpdateDocumentRequest::_internal_current_document() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::Document* p = _impl_.document_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Document_default_instance_); + const ::google::firestore::v1::Precondition* p = _impl_.current_document_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Precondition_default_instance_); } -inline const ::google::firestore::v1::Document& CreateDocumentRequest::document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.document) - return _internal_document(); +inline const ::google::firestore::v1::Precondition& UpdateDocumentRequest::current_document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.current_document) + return _internal_current_document(); } -inline void CreateDocumentRequest::unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value) { +inline void UpdateDocumentRequest::unsafe_arena_set_allocated_current_document(::google::firestore::v1::Precondition* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); } - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000001u; + _impl_._has_bits_[0] |= 0x00000008u; } else { - _impl_._has_bits_[0] &= ~0x00000001u; + _impl_._has_bits_[0] &= ~0x00000008u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.CreateDocumentRequest.document) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.current_document) } -inline ::google::firestore::v1::Document* CreateDocumentRequest::release_document() { +inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::release_current_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Document* released = _impl_.document_; - _impl_.document_ = nullptr; + _impl_._has_bits_[0] &= ~0x00000008u; + ::google::firestore::v1::Precondition* released = _impl_.current_document_; + _impl_.current_document_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -7996,34 +8999,34 @@ inline ::google::firestore::v1::Document* CreateDocumentRequest::release_documen #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::firestore::v1::Document* CreateDocumentRequest::unsafe_arena_release_document() { +inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::unsafe_arena_release_current_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.document) + // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.current_document) - _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Document* temp = _impl_.document_; - _impl_.document_ = nullptr; + _impl_._has_bits_[0] &= ~0x00000008u; + ::google::firestore::v1::Precondition* temp = _impl_.current_document_; + _impl_.current_document_ = nullptr; return temp; } -inline ::google::firestore::v1::Document* CreateDocumentRequest::_internal_mutable_document() { +inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::_internal_mutable_current_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.document_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(p); + _impl_._has_bits_[0] |= 0x00000008u; + if (_impl_.current_document_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::Precondition>(GetArena()); + _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(p); } - return _impl_.document_; + return _impl_.current_document_; } -inline ::google::firestore::v1::Document* CreateDocumentRequest::mutable_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::Document* _msg = _internal_mutable_document(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.document) +inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::mutable_current_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Precondition* _msg = _internal_mutable_current_document(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.current_document) return _msg; } -inline void CreateDocumentRequest::set_allocated_document(::google::firestore::v1::Document* value) { +inline void UpdateDocumentRequest::set_allocated_current_document(::google::firestore::v1::Precondition* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); } if (value != nullptr) { @@ -8031,49 +9034,106 @@ inline void CreateDocumentRequest::set_allocated_document(::google::firestore::v if (message_arena != submessage_arena) { value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); } - _impl_._has_bits_[0] |= 0x00000001u; + _impl_._has_bits_[0] |= 0x00000008u; } else { - _impl_._has_bits_[0] &= ~0x00000001u; + _impl_._has_bits_[0] &= ~0x00000008u; } - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.document) + _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.current_document) } -// .google.firestore.v1.DocumentMask mask = 5; -inline bool CreateDocumentRequest::has_mask() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - PROTOBUF_ASSUME(!value || _impl_.mask_ != nullptr); - return value; +// ------------------------------------------------------------------- + +// DeleteDocumentRequest + +// string name = 1; +inline void DeleteDocumentRequest::clear_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.name_.ClearToEmpty(); } -inline const ::google::firestore::v1::DocumentMask& CreateDocumentRequest::_internal_mask() const { +inline const std::string& DeleteDocumentRequest::name() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.DeleteDocumentRequest.name) + return _internal_name(); +} +template +inline PROTOBUF_ALWAYS_INLINE void DeleteDocumentRequest::set_name(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.name_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.DeleteDocumentRequest.name) +} +inline std::string* DeleteDocumentRequest::mutable_name() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_name(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.DeleteDocumentRequest.name) + return _s; +} +inline const std::string& DeleteDocumentRequest::_internal_name() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::DocumentMask* p = _impl_.mask_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); + return _impl_.name_.Get(); } -inline const ::google::firestore::v1::DocumentMask& CreateDocumentRequest::mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CreateDocumentRequest.mask) - return _internal_mask(); +inline void DeleteDocumentRequest::_internal_set_name(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.name_.Set(value, GetArena()); +} +inline std::string* DeleteDocumentRequest::_internal_mutable_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.name_.Mutable( GetArena()); +} +inline std::string* DeleteDocumentRequest::release_name() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.DeleteDocumentRequest.name) + return _impl_.name_.Release(); +} +inline void DeleteDocumentRequest::set_allocated_name(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.name_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.name_.IsDefault()) { + _impl_.name_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.DeleteDocumentRequest.name) +} + +// .google.firestore.v1.Precondition current_document = 2; +inline bool DeleteDocumentRequest::has_current_document() const { + bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; + PROTOBUF_ASSUME(!value || _impl_.current_document_ != nullptr); + return value; +} +inline const ::google::firestore::v1::Precondition& DeleteDocumentRequest::_internal_current_document() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + const ::google::firestore::v1::Precondition* p = _impl_.current_document_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Precondition_default_instance_); } -inline void CreateDocumentRequest::unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value) { +inline const ::google::firestore::v1::Precondition& DeleteDocumentRequest::current_document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.DeleteDocumentRequest.current_document) + return _internal_current_document(); +} +inline void DeleteDocumentRequest::unsafe_arena_set_allocated_current_document(::google::firestore::v1::Precondition* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); } - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000002u; + _impl_._has_bits_[0] |= 0x00000001u; } else { - _impl_._has_bits_[0] &= ~0x00000002u; + _impl_._has_bits_[0] &= ~0x00000001u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.CreateDocumentRequest.mask) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.DeleteDocumentRequest.current_document) } -inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::release_mask() { +inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::release_current_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] &= ~0x00000002u; - ::google::firestore::v1::DocumentMask* released = _impl_.mask_; - _impl_.mask_ = nullptr; + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Precondition* released = _impl_.current_document_; + _impl_.current_document_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -8087,34 +9147,34 @@ inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::release_mas #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::unsafe_arena_release_mask() { +inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::unsafe_arena_release_current_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CreateDocumentRequest.mask) + // @@protoc_insertion_point(field_release:google.firestore.v1.DeleteDocumentRequest.current_document) - _impl_._has_bits_[0] &= ~0x00000002u; - ::google::firestore::v1::DocumentMask* temp = _impl_.mask_; - _impl_.mask_ = nullptr; + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Precondition* temp = _impl_.current_document_; + _impl_.current_document_ = nullptr; return temp; } -inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::_internal_mutable_mask() { +inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::_internal_mutable_current_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] |= 0x00000002u; - if (_impl_.mask_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); + _impl_._has_bits_[0] |= 0x00000001u; + if (_impl_.current_document_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::Precondition>(GetArena()); + _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(p); } - return _impl_.mask_; + return _impl_.current_document_; } -inline ::google::firestore::v1::DocumentMask* CreateDocumentRequest::mutable_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_mask(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CreateDocumentRequest.mask) +inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::mutable_current_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Precondition* _msg = _internal_mutable_current_document(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.DeleteDocumentRequest.current_document) return _msg; } -inline void CreateDocumentRequest::set_allocated_mask(::google::firestore::v1::DocumentMask* value) { +inline void DeleteDocumentRequest::set_allocated_current_document(::google::firestore::v1::Precondition* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); } if (value != nullptr) { @@ -8122,53 +9182,207 @@ inline void CreateDocumentRequest::set_allocated_mask(::google::firestore::v1::D if (message_arena != submessage_arena) { value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); } - _impl_._has_bits_[0] |= 0x00000002u; + _impl_._has_bits_[0] |= 0x00000001u; } else { - _impl_._has_bits_[0] &= ~0x00000002u; + _impl_._has_bits_[0] &= ~0x00000001u; } - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CreateDocumentRequest.mask) + _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.DeleteDocumentRequest.current_document) } // ------------------------------------------------------------------- -// UpdateDocumentRequest +// BatchGetDocumentsRequest -// .google.firestore.v1.Document document = 1; -inline bool UpdateDocumentRequest::has_document() const { +// string database = 1; +inline void BatchGetDocumentsRequest::clear_database() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.database_.ClearToEmpty(); +} +inline const std::string& BatchGetDocumentsRequest::database() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.database) + return _internal_database(); +} +template +inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsRequest::set_database(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.database_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.database) +} +inline std::string* BatchGetDocumentsRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_database(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.database) + return _s; +} +inline const std::string& BatchGetDocumentsRequest::_internal_database() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.database_.Get(); +} +inline void BatchGetDocumentsRequest::_internal_set_database(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.database_.Set(value, GetArena()); +} +inline std::string* BatchGetDocumentsRequest::_internal_mutable_database() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.database_.Mutable( GetArena()); +} +inline std::string* BatchGetDocumentsRequest::release_database() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.database) + return _impl_.database_.Release(); +} +inline void BatchGetDocumentsRequest::set_allocated_database(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.database_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.database_.IsDefault()) { + _impl_.database_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.database) +} + +// repeated string documents = 2; +inline int BatchGetDocumentsRequest::_internal_documents_size() const { + return _internal_documents().size(); +} +inline int BatchGetDocumentsRequest::documents_size() const { + return _internal_documents_size(); +} +inline void BatchGetDocumentsRequest::clear_documents() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.documents_.Clear(); +} +inline std::string* BatchGetDocumentsRequest::add_documents() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + std::string* _s = _internal_mutable_documents()->Add(); + // @@protoc_insertion_point(field_add_mutable:google.firestore.v1.BatchGetDocumentsRequest.documents) + return _s; +} +inline const std::string& BatchGetDocumentsRequest::documents(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.documents) + return _internal_documents().Get(index); +} +inline std::string* BatchGetDocumentsRequest::mutable_documents(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.documents) + return _internal_mutable_documents()->Mutable(index); +} +inline void BatchGetDocumentsRequest::set_documents(int index, const std::string& value) { + _internal_mutable_documents()->Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::set_documents(int index, std::string&& value) { + _internal_mutable_documents()->Mutable(index)->assign(std::move(value)); + // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::set_documents(int index, const char* value) { + ABSL_DCHECK(value != nullptr); + _internal_mutable_documents()->Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::set_documents(int index, const char* value, + std::size_t size) { + _internal_mutable_documents()->Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::set_documents(int index, absl::string_view value) { + _internal_mutable_documents()->Mutable(index)->assign(value.data(), + value.size()); + // @@protoc_insertion_point(field_set_string_piece:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::add_documents(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _internal_mutable_documents()->Add()->assign(value); + // @@protoc_insertion_point(field_add:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::add_documents(std::string&& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _internal_mutable_documents()->Add(std::move(value)); + // @@protoc_insertion_point(field_add:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::add_documents(const char* value) { + ABSL_DCHECK(value != nullptr); + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _internal_mutable_documents()->Add()->assign(value); + // @@protoc_insertion_point(field_add_char:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::add_documents(const char* value, std::size_t size) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _internal_mutable_documents()->Add()->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline void BatchGetDocumentsRequest::add_documents(absl::string_view value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _internal_mutable_documents()->Add()->assign(value.data(), value.size()); + // @@protoc_insertion_point(field_add_string_piece:google.firestore.v1.BatchGetDocumentsRequest.documents) +} +inline const ::google::protobuf::RepeatedPtrField& +BatchGetDocumentsRequest::documents() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.BatchGetDocumentsRequest.documents) + return _internal_documents(); +} +inline ::google::protobuf::RepeatedPtrField* +BatchGetDocumentsRequest::mutable_documents() ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.BatchGetDocumentsRequest.documents) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_documents(); +} +inline const ::google::protobuf::RepeatedPtrField& +BatchGetDocumentsRequest::_internal_documents() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.documents_; +} +inline ::google::protobuf::RepeatedPtrField* +BatchGetDocumentsRequest::_internal_mutable_documents() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.documents_; +} + +// .google.firestore.v1.DocumentMask mask = 3; +inline bool BatchGetDocumentsRequest::has_mask() const { bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.document_ != nullptr); + PROTOBUF_ASSUME(!value || _impl_.mask_ != nullptr); return value; } -inline const ::google::firestore::v1::Document& UpdateDocumentRequest::_internal_document() const { +inline const ::google::firestore::v1::DocumentMask& BatchGetDocumentsRequest::_internal_mask() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::Document* p = _impl_.document_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Document_default_instance_); + const ::google::firestore::v1::DocumentMask* p = _impl_.mask_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); } -inline const ::google::firestore::v1::Document& UpdateDocumentRequest::document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.document) - return _internal_document(); +inline const ::google::firestore::v1::DocumentMask& BatchGetDocumentsRequest::mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.mask) + return _internal_mask(); } -inline void UpdateDocumentRequest::unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value) { +inline void BatchGetDocumentsRequest::unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); } - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); if (value != nullptr) { _impl_._has_bits_[0] |= 0x00000001u; } else { _impl_._has_bits_[0] &= ~0x00000001u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.document) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.mask) } -inline ::google::firestore::v1::Document* UpdateDocumentRequest::release_document() { +inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::release_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Document* released = _impl_.document_; - _impl_.document_ = nullptr; + ::google::firestore::v1::DocumentMask* released = _impl_.mask_; + _impl_.mask_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -8182,34 +9396,34 @@ inline ::google::firestore::v1::Document* UpdateDocumentRequest::release_documen #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::firestore::v1::Document* UpdateDocumentRequest::unsafe_arena_release_document() { +inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::unsafe_arena_release_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.document) + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.mask) _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Document* temp = _impl_.document_; - _impl_.document_ = nullptr; + ::google::firestore::v1::DocumentMask* temp = _impl_.mask_; + _impl_.mask_ = nullptr; return temp; } -inline ::google::firestore::v1::Document* UpdateDocumentRequest::_internal_mutable_document() { +inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::_internal_mutable_mask() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.document_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(p); + if (_impl_.mask_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); } - return _impl_.document_; + return _impl_.mask_; } -inline ::google::firestore::v1::Document* UpdateDocumentRequest::mutable_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::Document* _msg = _internal_mutable_document(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.document) +inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::mutable_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_mask(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.mask) return _msg; } -inline void UpdateDocumentRequest::set_allocated_document(::google::firestore::v1::Document* value) { +inline void BatchGetDocumentsRequest::set_allocated_mask(::google::firestore::v1::DocumentMask* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); } if (value != nullptr) { @@ -8222,374 +9436,481 @@ inline void UpdateDocumentRequest::set_allocated_document(::google::firestore::v _impl_._has_bits_[0] &= ~0x00000001u; } - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.document) + _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.mask) } -// .google.firestore.v1.DocumentMask update_mask = 2; -inline bool UpdateDocumentRequest::has_update_mask() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - PROTOBUF_ASSUME(!value || _impl_.update_mask_ != nullptr); - return value; +// bytes transaction = 4; +inline bool BatchGetDocumentsRequest::has_transaction() const { + return consistency_selector_case() == kTransaction; } -inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::_internal_update_mask() const { +inline void BatchGetDocumentsRequest::set_has_transaction() { + _impl_._oneof_case_[0] = kTransaction; +} +inline void BatchGetDocumentsRequest::clear_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (consistency_selector_case() == kTransaction) { + _impl_.consistency_selector_.transaction_.Destroy(); + clear_has_consistency_selector(); + } +} +inline const std::string& BatchGetDocumentsRequest::transaction() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.transaction) + return _internal_transaction(); +} +template +inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsRequest::set_transaction(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (consistency_selector_case() != kTransaction) { + clear_consistency_selector(); + + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitDefault(); + } + _impl_.consistency_selector_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.transaction) +} +inline std::string* BatchGetDocumentsRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_transaction(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.transaction) + return _s; +} +inline const std::string& BatchGetDocumentsRequest::_internal_transaction() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::DocumentMask* p = _impl_.update_mask_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); + if (consistency_selector_case() != kTransaction) { + return ::google::protobuf::internal::GetEmptyStringAlreadyInited(); + } + return _impl_.consistency_selector_.transaction_.Get(); } -inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::update_mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.update_mask) - return _internal_update_mask(); +inline void BatchGetDocumentsRequest::_internal_set_transaction(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (consistency_selector_case() != kTransaction) { + clear_consistency_selector(); + + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitDefault(); + } + _impl_.consistency_selector_.transaction_.Set(value, GetArena()); } -inline void UpdateDocumentRequest::unsafe_arena_set_allocated_update_mask(::google::firestore::v1::DocumentMask* value) { +inline std::string* BatchGetDocumentsRequest::_internal_mutable_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.update_mask_); + if (consistency_selector_case() != kTransaction) { + clear_consistency_selector(); + + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitDefault(); + } + return _impl_.consistency_selector_.transaction_.Mutable( GetArena()); +} +inline std::string* BatchGetDocumentsRequest::release_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.transaction) + if (consistency_selector_case() != kTransaction) { + return nullptr; + } + clear_has_consistency_selector(); + return _impl_.consistency_selector_.transaction_.Release(); +} +inline void BatchGetDocumentsRequest::set_allocated_transaction(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (has_consistency_selector()) { + clear_consistency_selector(); } - _impl_.update_mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000002u; + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitAllocated(value, GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.transaction) +} + +// .google.firestore.v1.TransactionOptions new_transaction = 5; +inline bool BatchGetDocumentsRequest::has_new_transaction() const { + return consistency_selector_case() == kNewTransaction; +} +inline bool BatchGetDocumentsRequest::_internal_has_new_transaction() const { + return consistency_selector_case() == kNewTransaction; +} +inline void BatchGetDocumentsRequest::set_has_new_transaction() { + _impl_._oneof_case_[0] = kNewTransaction; +} +inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::release_new_transaction() { + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) + if (consistency_selector_case() == kNewTransaction) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.new_transaction_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); + } + _impl_.consistency_selector_.new_transaction_ = nullptr; + return temp; } else { - _impl_._has_bits_[0] &= ~0x00000002u; + return nullptr; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.update_mask) } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::release_update_mask() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); +inline const ::google::firestore::v1::TransactionOptions& BatchGetDocumentsRequest::_internal_new_transaction() const { + return consistency_selector_case() == kNewTransaction ? *_impl_.consistency_selector_.new_transaction_ : reinterpret_cast<::google::firestore::v1::TransactionOptions&>(::google::firestore::v1::_TransactionOptions_default_instance_); +} +inline const ::google::firestore::v1::TransactionOptions& BatchGetDocumentsRequest::new_transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) + return _internal_new_transaction(); +} +inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::unsafe_arena_release_new_transaction() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) + if (consistency_selector_case() == kNewTransaction) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.new_transaction_; + _impl_.consistency_selector_.new_transaction_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline void BatchGetDocumentsRequest::unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_consistency_selector(); + if (value) { + set_has_new_transaction(); + _impl_.consistency_selector_.new_transaction_ = value; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) +} +inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::_internal_mutable_new_transaction() { + if (consistency_selector_case() != kNewTransaction) { + clear_consistency_selector(); + set_has_new_transaction(); + _impl_.consistency_selector_.new_transaction_ = CreateMaybeMessage<::google::firestore::v1::TransactionOptions>(GetArena()); + } + return _impl_.consistency_selector_.new_transaction_; +} +inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::mutable_new_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::TransactionOptions* _msg = _internal_mutable_new_transaction(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) + return _msg; +} - _impl_._has_bits_[0] &= ~0x00000002u; - ::google::firestore::v1::DocumentMask* released = _impl_.update_mask_; - _impl_.update_mask_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; +// .google.protobuf.Timestamp read_time = 7; +inline bool BatchGetDocumentsRequest::has_read_time() const { + return consistency_selector_case() == kReadTime; +} +inline bool BatchGetDocumentsRequest::_internal_has_read_time() const { + return consistency_selector_case() == kReadTime; +} +inline void BatchGetDocumentsRequest::set_has_read_time() { + _impl_._oneof_case_[0] = kReadTime; +} +inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::release_read_time() { + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.read_time) + if (consistency_selector_case() == kReadTime) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.read_time_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); + } + _impl_.consistency_selector_.read_time_ = nullptr; + return temp; + } else { + return nullptr; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { - released = ::google::protobuf::internal::DuplicateIfNonNull(released); +} +inline const ::google::protobuf::Timestamp& BatchGetDocumentsRequest::_internal_read_time() const { + return consistency_selector_case() == kReadTime ? *_impl_.consistency_selector_.read_time_ : reinterpret_cast<::google::protobuf::Timestamp&>(::google::protobuf::_Timestamp_default_instance_); +} +inline const ::google::protobuf::Timestamp& BatchGetDocumentsRequest::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.read_time) + return _internal_read_time(); +} +inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::unsafe_arena_release_read_time() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.BatchGetDocumentsRequest.read_time) + if (consistency_selector_case() == kReadTime) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.read_time_; + _impl_.consistency_selector_.read_time_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline void BatchGetDocumentsRequest::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_consistency_selector(); + if (value) { + set_has_read_time(); + _impl_.consistency_selector_.read_time_ = value; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.read_time) +} +inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::_internal_mutable_read_time() { + if (consistency_selector_case() != kReadTime) { + clear_consistency_selector(); + set_has_read_time(); + _impl_.consistency_selector_.read_time_ = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return released; + return _impl_.consistency_selector_.read_time_; +} +inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.read_time) + return _msg; } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::unsafe_arena_release_update_mask() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.update_mask) - _impl_._has_bits_[0] &= ~0x00000002u; - ::google::firestore::v1::DocumentMask* temp = _impl_.update_mask_; - _impl_.update_mask_ = nullptr; - return temp; +inline bool BatchGetDocumentsRequest::has_consistency_selector() const { + return consistency_selector_case() != CONSISTENCY_SELECTOR_NOT_SET; } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::_internal_mutable_update_mask() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] |= 0x00000002u; - if (_impl_.update_mask_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); - _impl_.update_mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); - } - return _impl_.update_mask_; +inline void BatchGetDocumentsRequest::clear_has_consistency_selector() { + _impl_._oneof_case_[0] = CONSISTENCY_SELECTOR_NOT_SET; } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::mutable_update_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_update_mask(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.update_mask) - return _msg; +inline BatchGetDocumentsRequest::ConsistencySelectorCase BatchGetDocumentsRequest::consistency_selector_case() const { + return BatchGetDocumentsRequest::ConsistencySelectorCase(_impl_._oneof_case_[0]); } -inline void UpdateDocumentRequest::set_allocated_update_mask(::google::firestore::v1::DocumentMask* value) { - ::google::protobuf::Arena* message_arena = GetArena(); - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.update_mask_); - } +// ------------------------------------------------------------------- - if (value != nullptr) { - ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); - if (message_arena != submessage_arena) { - value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); +// BatchGetDocumentsResponse + +// .google.firestore.v1.Document found = 1; +inline bool BatchGetDocumentsResponse::has_found() const { + return result_case() == kFound; +} +inline bool BatchGetDocumentsResponse::_internal_has_found() const { + return result_case() == kFound; +} +inline void BatchGetDocumentsResponse::set_has_found() { + _impl_._oneof_case_[0] = kFound; +} +inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::release_found() { + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.found) + if (result_case() == kFound) { + clear_has_result(); + auto* temp = _impl_.result_.found_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); } - _impl_._has_bits_[0] |= 0x00000002u; + _impl_.result_.found_ = nullptr; + return temp; } else { - _impl_._has_bits_[0] &= ~0x00000002u; + return nullptr; } - - _impl_.update_mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.update_mask) } - -// .google.firestore.v1.DocumentMask mask = 3; -inline bool UpdateDocumentRequest::has_mask() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - PROTOBUF_ASSUME(!value || _impl_.mask_ != nullptr); - return value; -} -inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::_internal_mask() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::DocumentMask* p = _impl_.mask_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); +inline const ::google::firestore::v1::Document& BatchGetDocumentsResponse::_internal_found() const { + return result_case() == kFound ? *_impl_.result_.found_ : reinterpret_cast<::google::firestore::v1::Document&>(::google::firestore::v1::_Document_default_instance_); } -inline const ::google::firestore::v1::DocumentMask& UpdateDocumentRequest::mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.mask) - return _internal_mask(); +inline const ::google::firestore::v1::Document& BatchGetDocumentsResponse::found() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.found) + return _internal_found(); } -inline void UpdateDocumentRequest::unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); - } - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); - if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000004u; +inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::unsafe_arena_release_found() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.BatchGetDocumentsResponse.found) + if (result_case() == kFound) { + clear_has_result(); + auto* temp = _impl_.result_.found_; + _impl_.result_.found_ = nullptr; + return temp; } else { - _impl_._has_bits_[0] &= ~0x00000004u; + return nullptr; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.mask) } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::release_mask() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - - _impl_._has_bits_[0] &= ~0x00000004u; - ::google::firestore::v1::DocumentMask* released = _impl_.mask_; - _impl_.mask_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; +inline void BatchGetDocumentsResponse::unsafe_arena_set_allocated_found(::google::firestore::v1::Document* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_result(); + if (value) { + set_has_found(); + _impl_.result_.found_ = value; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { - released = ::google::protobuf::internal::DuplicateIfNonNull(released); + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.found) +} +inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::_internal_mutable_found() { + if (result_case() != kFound) { + clear_result(); + set_has_found(); + _impl_.result_.found_ = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return released; + return _impl_.result_.found_; +} +inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::mutable_found() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Document* _msg = _internal_mutable_found(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.found) + return _msg; } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::unsafe_arena_release_mask() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.mask) - _impl_._has_bits_[0] &= ~0x00000004u; - ::google::firestore::v1::DocumentMask* temp = _impl_.mask_; - _impl_.mask_ = nullptr; - return temp; +// string missing = 2; +inline bool BatchGetDocumentsResponse::has_missing() const { + return result_case() == kMissing; } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::_internal_mutable_mask() { +inline void BatchGetDocumentsResponse::set_has_missing() { + _impl_._oneof_case_[0] = kMissing; +} +inline void BatchGetDocumentsResponse::clear_missing() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] |= 0x00000004u; - if (_impl_.mask_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); + if (result_case() == kMissing) { + _impl_.result_.missing_.Destroy(); + clear_has_result(); } - return _impl_.mask_; } -inline ::google::firestore::v1::DocumentMask* UpdateDocumentRequest::mutable_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_mask(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.mask) - return _msg; +inline const std::string& BatchGetDocumentsResponse::missing() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.missing) + return _internal_missing(); } -inline void UpdateDocumentRequest::set_allocated_mask(::google::firestore::v1::DocumentMask* value) { - ::google::protobuf::Arena* message_arena = GetArena(); +template +inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsResponse::set_missing(Arg_&& arg, + Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); - } + if (result_case() != kMissing) { + clear_result(); - if (value != nullptr) { - ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); - if (message_arena != submessage_arena) { - value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000004u; - } else { - _impl_._has_bits_[0] &= ~0x00000004u; + set_has_missing(); + _impl_.result_.missing_.InitDefault(); } - - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.mask) + _impl_.result_.missing_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsResponse.missing) } - -// .google.firestore.v1.Precondition current_document = 4; -inline bool UpdateDocumentRequest::has_current_document() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - PROTOBUF_ASSUME(!value || _impl_.current_document_ != nullptr); - return value; +inline std::string* BatchGetDocumentsResponse::mutable_missing() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_missing(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.missing) + return _s; } -inline const ::google::firestore::v1::Precondition& UpdateDocumentRequest::_internal_current_document() const { +inline const std::string& BatchGetDocumentsResponse::_internal_missing() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::Precondition* p = _impl_.current_document_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Precondition_default_instance_); -} -inline const ::google::firestore::v1::Precondition& UpdateDocumentRequest::current_document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.UpdateDocumentRequest.current_document) - return _internal_current_document(); -} -inline void UpdateDocumentRequest::unsafe_arena_set_allocated_current_document(::google::firestore::v1::Precondition* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); - } - _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); - if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000008u; - } else { - _impl_._has_bits_[0] &= ~0x00000008u; + if (result_case() != kMissing) { + return ::google::protobuf::internal::GetEmptyStringAlreadyInited(); } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.UpdateDocumentRequest.current_document) + return _impl_.result_.missing_.Get(); } -inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::release_current_document() { +inline void BatchGetDocumentsResponse::_internal_set_missing(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (result_case() != kMissing) { + clear_result(); - _impl_._has_bits_[0] &= ~0x00000008u; - ::google::firestore::v1::Precondition* released = _impl_.current_document_; - _impl_.current_document_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { - released = ::google::protobuf::internal::DuplicateIfNonNull(released); + set_has_missing(); + _impl_.result_.missing_.InitDefault(); } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return released; + _impl_.result_.missing_.Set(value, GetArena()); } -inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::unsafe_arena_release_current_document() { +inline std::string* BatchGetDocumentsResponse::_internal_mutable_missing() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.UpdateDocumentRequest.current_document) + if (result_case() != kMissing) { + clear_result(); - _impl_._has_bits_[0] &= ~0x00000008u; - ::google::firestore::v1::Precondition* temp = _impl_.current_document_; - _impl_.current_document_ = nullptr; - return temp; + set_has_missing(); + _impl_.result_.missing_.InitDefault(); + } + return _impl_.result_.missing_.Mutable( GetArena()); } -inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::_internal_mutable_current_document() { +inline std::string* BatchGetDocumentsResponse::release_missing() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] |= 0x00000008u; - if (_impl_.current_document_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::Precondition>(GetArena()); - _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(p); + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.missing) + if (result_case() != kMissing) { + return nullptr; } - return _impl_.current_document_; -} -inline ::google::firestore::v1::Precondition* UpdateDocumentRequest::mutable_current_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::Precondition* _msg = _internal_mutable_current_document(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.UpdateDocumentRequest.current_document) - return _msg; + clear_has_result(); + return _impl_.result_.missing_.Release(); } -inline void UpdateDocumentRequest::set_allocated_current_document(::google::firestore::v1::Precondition* value) { - ::google::protobuf::Arena* message_arena = GetArena(); +inline void BatchGetDocumentsResponse::set_allocated_missing(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); + if (has_result()) { + clear_result(); } - if (value != nullptr) { - ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); - if (message_arena != submessage_arena) { - value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000008u; - } else { - _impl_._has_bits_[0] &= ~0x00000008u; + set_has_missing(); + _impl_.result_.missing_.InitAllocated(value, GetArena()); } - - _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.UpdateDocumentRequest.current_document) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.missing) } -// ------------------------------------------------------------------- - -// DeleteDocumentRequest - -// string name = 1; -inline void DeleteDocumentRequest::clear_name() { +// bytes transaction = 3; +inline void BatchGetDocumentsResponse::clear_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.name_.ClearToEmpty(); + _impl_.transaction_.ClearToEmpty(); } -inline const std::string& DeleteDocumentRequest::name() const +inline const std::string& BatchGetDocumentsResponse::transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.DeleteDocumentRequest.name) - return _internal_name(); + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.transaction) + return _internal_transaction(); } template -inline PROTOBUF_ALWAYS_INLINE void DeleteDocumentRequest::set_name(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsResponse::set_transaction(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - _impl_.name_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.DeleteDocumentRequest.name) + _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsResponse.transaction) } -inline std::string* DeleteDocumentRequest::mutable_name() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_name(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.DeleteDocumentRequest.name) +inline std::string* BatchGetDocumentsResponse::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_transaction(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.transaction) return _s; } -inline const std::string& DeleteDocumentRequest::_internal_name() const { +inline const std::string& BatchGetDocumentsResponse::_internal_transaction() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.name_.Get(); + return _impl_.transaction_.Get(); } -inline void DeleteDocumentRequest::_internal_set_name(const std::string& value) { +inline void BatchGetDocumentsResponse::_internal_set_transaction(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - _impl_.name_.Set(value, GetArena()); + _impl_.transaction_.Set(value, GetArena()); } -inline std::string* DeleteDocumentRequest::_internal_mutable_name() { +inline std::string* BatchGetDocumentsResponse::_internal_mutable_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - return _impl_.name_.Mutable( GetArena()); + return _impl_.transaction_.Mutable( GetArena()); } -inline std::string* DeleteDocumentRequest::release_name() { +inline std::string* BatchGetDocumentsResponse::release_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.DeleteDocumentRequest.name) - return _impl_.name_.Release(); + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.transaction) + return _impl_.transaction_.Release(); } -inline void DeleteDocumentRequest::set_allocated_name(std::string* value) { +inline void BatchGetDocumentsResponse::set_allocated_transaction(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.name_.SetAllocated(value, GetArena()); + _impl_.transaction_.SetAllocated(value, GetArena()); #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.name_.IsDefault()) { - _impl_.name_.Set("", GetArena()); + if (_impl_.transaction_.IsDefault()) { + _impl_.transaction_.Set("", GetArena()); } #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.DeleteDocumentRequest.name) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.transaction) } -// .google.firestore.v1.Precondition current_document = 2; -inline bool DeleteDocumentRequest::has_current_document() const { +// .google.protobuf.Timestamp read_time = 4; +inline bool BatchGetDocumentsResponse::has_read_time() const { bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.current_document_ != nullptr); + PROTOBUF_ASSUME(!value || _impl_.read_time_ != nullptr); return value; } -inline const ::google::firestore::v1::Precondition& DeleteDocumentRequest::_internal_current_document() const { +inline const ::google::protobuf::Timestamp& BatchGetDocumentsResponse::_internal_read_time() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::Precondition* p = _impl_.current_document_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Precondition_default_instance_); + const ::google::protobuf::Timestamp* p = _impl_.read_time_; + return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Timestamp_default_instance_); } -inline const ::google::firestore::v1::Precondition& DeleteDocumentRequest::current_document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.DeleteDocumentRequest.current_document) - return _internal_current_document(); +inline const ::google::protobuf::Timestamp& BatchGetDocumentsResponse::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.read_time) + return _internal_read_time(); } -inline void DeleteDocumentRequest::unsafe_arena_set_allocated_current_document(::google::firestore::v1::Precondition* value) { +inline void BatchGetDocumentsResponse::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); } - _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); + _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); if (value != nullptr) { _impl_._has_bits_[0] |= 0x00000001u; } else { _impl_._has_bits_[0] &= ~0x00000001u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.DeleteDocumentRequest.current_document) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.read_time) } -inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::release_current_document() { +inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::release_read_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Precondition* released = _impl_.current_document_; - _impl_.current_document_ = nullptr; + ::google::protobuf::Timestamp* released = _impl_.read_time_; + _impl_.read_time_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -8603,34 +9924,34 @@ inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::release_cur #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::unsafe_arena_release_current_document() { +inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::unsafe_arena_release_read_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.DeleteDocumentRequest.current_document) + // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.read_time) _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Precondition* temp = _impl_.current_document_; - _impl_.current_document_ = nullptr; + ::google::protobuf::Timestamp* temp = _impl_.read_time_; + _impl_.read_time_ = nullptr; return temp; } -inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::_internal_mutable_current_document() { +inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::_internal_mutable_read_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.current_document_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::Precondition>(GetArena()); - _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(p); + if (_impl_.read_time_ == nullptr) { + auto* p = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); + _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(p); } - return _impl_.current_document_; + return _impl_.read_time_; } -inline ::google::firestore::v1::Precondition* DeleteDocumentRequest::mutable_current_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::Precondition* _msg = _internal_mutable_current_document(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.DeleteDocumentRequest.current_document) +inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.read_time) return _msg; } -inline void DeleteDocumentRequest::set_allocated_current_document(::google::firestore::v1::Precondition* value) { +inline void BatchGetDocumentsResponse::set_allocated_read_time(::google::protobuf::Timestamp* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.current_document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); } if (value != nullptr) { @@ -8642,203 +9963,111 @@ inline void DeleteDocumentRequest::set_allocated_current_document(::google::fire } else { _impl_._has_bits_[0] &= ~0x00000001u; } - - _impl_.current_document_ = reinterpret_cast<::google::firestore::v1::Precondition*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.DeleteDocumentRequest.current_document) -} - -// ------------------------------------------------------------------- - -// BatchGetDocumentsRequest - -// string database = 1; -inline void BatchGetDocumentsRequest::clear_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.ClearToEmpty(); -} -inline const std::string& BatchGetDocumentsRequest::database() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.database) - return _internal_database(); -} -template -inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsRequest::set_database(Arg_&& arg, - Args_... args) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.database) -} -inline std::string* BatchGetDocumentsRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_database(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.database) - return _s; -} -inline const std::string& BatchGetDocumentsRequest::_internal_database() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.database_.Get(); -} -inline void BatchGetDocumentsRequest::_internal_set_database(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(value, GetArena()); -} -inline std::string* BatchGetDocumentsRequest::_internal_mutable_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.database_.Mutable( GetArena()); -} -inline std::string* BatchGetDocumentsRequest::release_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.database) - return _impl_.database_.Release(); -} -inline void BatchGetDocumentsRequest::set_allocated_database(std::string* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.database_.IsDefault()) { - _impl_.database_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.database) -} - -// repeated string documents = 2; -inline int BatchGetDocumentsRequest::_internal_documents_size() const { - return _internal_documents().size(); -} -inline int BatchGetDocumentsRequest::documents_size() const { - return _internal_documents_size(); -} -inline void BatchGetDocumentsRequest::clear_documents() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.documents_.Clear(); -} -inline std::string* BatchGetDocumentsRequest::add_documents() - ABSL_ATTRIBUTE_LIFETIME_BOUND { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - std::string* _s = _internal_mutable_documents()->Add(); - // @@protoc_insertion_point(field_add_mutable:google.firestore.v1.BatchGetDocumentsRequest.documents) - return _s; -} -inline const std::string& BatchGetDocumentsRequest::documents(int index) const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.documents) - return _internal_documents().Get(index); -} -inline std::string* BatchGetDocumentsRequest::mutable_documents(int index) - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.documents) - return _internal_mutable_documents()->Mutable(index); + + _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.read_time) } -inline void BatchGetDocumentsRequest::set_documents(int index, const std::string& value) { - _internal_mutable_documents()->Mutable(index)->assign(value); - // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.documents) + +inline bool BatchGetDocumentsResponse::has_result() const { + return result_case() != RESULT_NOT_SET; } -inline void BatchGetDocumentsRequest::set_documents(int index, std::string&& value) { - _internal_mutable_documents()->Mutable(index)->assign(std::move(value)); - // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.documents) +inline void BatchGetDocumentsResponse::clear_has_result() { + _impl_._oneof_case_[0] = RESULT_NOT_SET; } -inline void BatchGetDocumentsRequest::set_documents(int index, const char* value) { - ABSL_DCHECK(value != nullptr); - _internal_mutable_documents()->Mutable(index)->assign(value); - // @@protoc_insertion_point(field_set_char:google.firestore.v1.BatchGetDocumentsRequest.documents) +inline BatchGetDocumentsResponse::ResultCase BatchGetDocumentsResponse::result_case() const { + return BatchGetDocumentsResponse::ResultCase(_impl_._oneof_case_[0]); } -inline void BatchGetDocumentsRequest::set_documents(int index, const char* value, - std::size_t size) { - _internal_mutable_documents()->Mutable(index)->assign( - reinterpret_cast(value), size); - // @@protoc_insertion_point(field_set_pointer:google.firestore.v1.BatchGetDocumentsRequest.documents) +// ------------------------------------------------------------------- + +// BeginTransactionRequest + +// string database = 1; +inline void BeginTransactionRequest::clear_database() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.database_.ClearToEmpty(); } -inline void BatchGetDocumentsRequest::set_documents(int index, absl::string_view value) { - _internal_mutable_documents()->Mutable(index)->assign(value.data(), - value.size()); - // @@protoc_insertion_point(field_set_string_piece:google.firestore.v1.BatchGetDocumentsRequest.documents) +inline const std::string& BeginTransactionRequest::database() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BeginTransactionRequest.database) + return _internal_database(); } -inline void BatchGetDocumentsRequest::add_documents(const std::string& value) { +template +inline PROTOBUF_ALWAYS_INLINE void BeginTransactionRequest::set_database(Arg_&& arg, + Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _internal_mutable_documents()->Add()->assign(value); - // @@protoc_insertion_point(field_add:google.firestore.v1.BatchGetDocumentsRequest.documents) + ; + _impl_.database_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.BeginTransactionRequest.database) } -inline void BatchGetDocumentsRequest::add_documents(std::string&& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _internal_mutable_documents()->Add(std::move(value)); - // @@protoc_insertion_point(field_add:google.firestore.v1.BatchGetDocumentsRequest.documents) +inline std::string* BeginTransactionRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_database(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BeginTransactionRequest.database) + return _s; } -inline void BatchGetDocumentsRequest::add_documents(const char* value) { - ABSL_DCHECK(value != nullptr); - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _internal_mutable_documents()->Add()->assign(value); - // @@protoc_insertion_point(field_add_char:google.firestore.v1.BatchGetDocumentsRequest.documents) +inline const std::string& BeginTransactionRequest::_internal_database() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.database_.Get(); } -inline void BatchGetDocumentsRequest::add_documents(const char* value, std::size_t size) { +inline void BeginTransactionRequest::_internal_set_database(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _internal_mutable_documents()->Add()->assign( - reinterpret_cast(value), size); - // @@protoc_insertion_point(field_add_pointer:google.firestore.v1.BatchGetDocumentsRequest.documents) + ; + _impl_.database_.Set(value, GetArena()); } -inline void BatchGetDocumentsRequest::add_documents(absl::string_view value) { +inline std::string* BeginTransactionRequest::_internal_mutable_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _internal_mutable_documents()->Add()->assign(value.data(), value.size()); - // @@protoc_insertion_point(field_add_string_piece:google.firestore.v1.BatchGetDocumentsRequest.documents) -} -inline const ::google::protobuf::RepeatedPtrField& -BatchGetDocumentsRequest::documents() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_list:google.firestore.v1.BatchGetDocumentsRequest.documents) - return _internal_documents(); + ; + return _impl_.database_.Mutable( GetArena()); } -inline ::google::protobuf::RepeatedPtrField* -BatchGetDocumentsRequest::mutable_documents() ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.BatchGetDocumentsRequest.documents) +inline std::string* BeginTransactionRequest::release_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - return _internal_mutable_documents(); -} -inline const ::google::protobuf::RepeatedPtrField& -BatchGetDocumentsRequest::_internal_documents() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.documents_; + // @@protoc_insertion_point(field_release:google.firestore.v1.BeginTransactionRequest.database) + return _impl_.database_.Release(); } -inline ::google::protobuf::RepeatedPtrField* -BatchGetDocumentsRequest::_internal_mutable_documents() { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return &_impl_.documents_; +inline void BeginTransactionRequest::set_allocated_database(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.database_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.database_.IsDefault()) { + _impl_.database_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BeginTransactionRequest.database) } -// .google.firestore.v1.DocumentMask mask = 3; -inline bool BatchGetDocumentsRequest::has_mask() const { +// .google.firestore.v1.TransactionOptions options = 2; +inline bool BeginTransactionRequest::has_options() const { bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.mask_ != nullptr); + PROTOBUF_ASSUME(!value || _impl_.options_ != nullptr); return value; } -inline const ::google::firestore::v1::DocumentMask& BatchGetDocumentsRequest::_internal_mask() const { +inline const ::google::firestore::v1::TransactionOptions& BeginTransactionRequest::_internal_options() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::DocumentMask* p = _impl_.mask_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_DocumentMask_default_instance_); + const ::google::firestore::v1::TransactionOptions* p = _impl_.options_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_TransactionOptions_default_instance_); } -inline const ::google::firestore::v1::DocumentMask& BatchGetDocumentsRequest::mask() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.mask) - return _internal_mask(); +inline const ::google::firestore::v1::TransactionOptions& BeginTransactionRequest::options() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.BeginTransactionRequest.options) + return _internal_options(); } -inline void BatchGetDocumentsRequest::unsafe_arena_set_allocated_mask(::google::firestore::v1::DocumentMask* value) { +inline void BeginTransactionRequest::unsafe_arena_set_allocated_options(::google::firestore::v1::TransactionOptions* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.options_); } - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); + _impl_.options_ = reinterpret_cast<::google::firestore::v1::TransactionOptions*>(value); if (value != nullptr) { _impl_._has_bits_[0] |= 0x00000001u; } else { _impl_._has_bits_[0] &= ~0x00000001u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.mask) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BeginTransactionRequest.options) } -inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::release_mask() { +inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::release_options() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::DocumentMask* released = _impl_.mask_; - _impl_.mask_ = nullptr; + ::google::firestore::v1::TransactionOptions* released = _impl_.options_; + _impl_.options_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -8852,34 +10081,34 @@ inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::release_ #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::unsafe_arena_release_mask() { +inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::unsafe_arena_release_options() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.mask) + // @@protoc_insertion_point(field_release:google.firestore.v1.BeginTransactionRequest.options) _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::DocumentMask* temp = _impl_.mask_; - _impl_.mask_ = nullptr; + ::google::firestore::v1::TransactionOptions* temp = _impl_.options_; + _impl_.options_ = nullptr; return temp; } -inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::_internal_mutable_mask() { +inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::_internal_mutable_options() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.mask_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::DocumentMask>(GetArena()); - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(p); + if (_impl_.options_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::TransactionOptions>(GetArena()); + _impl_.options_ = reinterpret_cast<::google::firestore::v1::TransactionOptions*>(p); } - return _impl_.mask_; + return _impl_.options_; } -inline ::google::firestore::v1::DocumentMask* BatchGetDocumentsRequest::mutable_mask() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::DocumentMask* _msg = _internal_mutable_mask(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.mask) +inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::mutable_options() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::TransactionOptions* _msg = _internal_mutable_options(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BeginTransactionRequest.options) return _msg; } -inline void BatchGetDocumentsRequest::set_allocated_mask(::google::firestore::v1::DocumentMask* value) { +inline void BeginTransactionRequest::set_allocated_options(::google::firestore::v1::TransactionOptions* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.mask_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.options_); } if (value != nullptr) { @@ -8892,437 +10121,462 @@ inline void BatchGetDocumentsRequest::set_allocated_mask(::google::firestore::v1 _impl_._has_bits_[0] &= ~0x00000001u; } - _impl_.mask_ = reinterpret_cast<::google::firestore::v1::DocumentMask*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.mask) + _impl_.options_ = reinterpret_cast<::google::firestore::v1::TransactionOptions*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BeginTransactionRequest.options) } -// bytes transaction = 4; -inline bool BatchGetDocumentsRequest::has_transaction() const { - return consistency_selector_case() == kTransaction; -} -inline void BatchGetDocumentsRequest::set_has_transaction() { - _impl_._oneof_case_[0] = kTransaction; -} -inline void BatchGetDocumentsRequest::clear_transaction() { +// ------------------------------------------------------------------- + +// BeginTransactionResponse + +// bytes transaction = 1; +inline void BeginTransactionResponse::clear_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (consistency_selector_case() == kTransaction) { - _impl_.consistency_selector_.transaction_.Destroy(); - clear_has_consistency_selector(); - } + _impl_.transaction_.ClearToEmpty(); } -inline const std::string& BatchGetDocumentsRequest::transaction() const +inline const std::string& BeginTransactionResponse::transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.transaction) + // @@protoc_insertion_point(field_get:google.firestore.v1.BeginTransactionResponse.transaction) return _internal_transaction(); } template -inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsRequest::set_transaction(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void BeginTransactionResponse::set_transaction(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (consistency_selector_case() != kTransaction) { - clear_consistency_selector(); + ; + _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.BeginTransactionResponse.transaction) +} +inline std::string* BeginTransactionResponse::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_transaction(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.BeginTransactionResponse.transaction) + return _s; +} +inline const std::string& BeginTransactionResponse::_internal_transaction() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.transaction_.Get(); +} +inline void BeginTransactionResponse::_internal_set_transaction(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.transaction_.Set(value, GetArena()); +} +inline std::string* BeginTransactionResponse::_internal_mutable_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.transaction_.Mutable( GetArena()); +} +inline std::string* BeginTransactionResponse::release_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.BeginTransactionResponse.transaction) + return _impl_.transaction_.Release(); +} +inline void BeginTransactionResponse::set_allocated_transaction(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.transaction_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.transaction_.IsDefault()) { + _impl_.transaction_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BeginTransactionResponse.transaction) +} - set_has_transaction(); - _impl_.consistency_selector_.transaction_.InitDefault(); - } - _impl_.consistency_selector_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsRequest.transaction) +// ------------------------------------------------------------------- + +// CommitRequest + +// string database = 1; +inline void CommitRequest::clear_database() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.database_.ClearToEmpty(); +} +inline const std::string& CommitRequest::database() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CommitRequest.database) + return _internal_database(); } -inline std::string* BatchGetDocumentsRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.transaction) +template +inline PROTOBUF_ALWAYS_INLINE void CommitRequest::set_database(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.database_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.CommitRequest.database) +} +inline std::string* CommitRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_database(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitRequest.database) return _s; } -inline const std::string& BatchGetDocumentsRequest::_internal_transaction() const { +inline const std::string& CommitRequest::_internal_database() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - if (consistency_selector_case() != kTransaction) { - return ::google::protobuf::internal::GetEmptyStringAlreadyInited(); - } - return _impl_.consistency_selector_.transaction_.Get(); + return _impl_.database_.Get(); } -inline void BatchGetDocumentsRequest::_internal_set_transaction(const std::string& value) { +inline void CommitRequest::_internal_set_database(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (consistency_selector_case() != kTransaction) { - clear_consistency_selector(); - - set_has_transaction(); - _impl_.consistency_selector_.transaction_.InitDefault(); - } - _impl_.consistency_selector_.transaction_.Set(value, GetArena()); + ; + _impl_.database_.Set(value, GetArena()); } -inline std::string* BatchGetDocumentsRequest::_internal_mutable_transaction() { +inline std::string* CommitRequest::_internal_mutable_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (consistency_selector_case() != kTransaction) { - clear_consistency_selector(); - - set_has_transaction(); - _impl_.consistency_selector_.transaction_.InitDefault(); - } - return _impl_.consistency_selector_.transaction_.Mutable( GetArena()); + ; + return _impl_.database_.Mutable( GetArena()); } -inline std::string* BatchGetDocumentsRequest::release_transaction() { +inline std::string* CommitRequest::release_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.transaction) - if (consistency_selector_case() != kTransaction) { - return nullptr; - } - clear_has_consistency_selector(); - return _impl_.consistency_selector_.transaction_.Release(); + // @@protoc_insertion_point(field_release:google.firestore.v1.CommitRequest.database) + return _impl_.database_.Release(); } -inline void BatchGetDocumentsRequest::set_allocated_transaction(std::string* value) { +inline void CommitRequest::set_allocated_database(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (has_consistency_selector()) { - clear_consistency_selector(); - } - if (value != nullptr) { - set_has_transaction(); - _impl_.consistency_selector_.transaction_.InitAllocated(value, GetArena()); - } - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.transaction) + _impl_.database_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.database_.IsDefault()) { + _impl_.database_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CommitRequest.database) } -// .google.firestore.v1.TransactionOptions new_transaction = 5; -inline bool BatchGetDocumentsRequest::has_new_transaction() const { - return consistency_selector_case() == kNewTransaction; -} -inline bool BatchGetDocumentsRequest::_internal_has_new_transaction() const { - return consistency_selector_case() == kNewTransaction; +// repeated .google.firestore.v1.Write writes = 2; +inline int CommitRequest::_internal_writes_size() const { + return _internal_writes().size(); } -inline void BatchGetDocumentsRequest::set_has_new_transaction() { - _impl_._oneof_case_[0] = kNewTransaction; +inline int CommitRequest::writes_size() const { + return _internal_writes_size(); } -inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::release_new_transaction() { - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) - if (consistency_selector_case() == kNewTransaction) { - clear_has_consistency_selector(); - auto* temp = _impl_.consistency_selector_.new_transaction_; - if (GetArena() != nullptr) { - temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); - } - _impl_.consistency_selector_.new_transaction_ = nullptr; - return temp; - } else { - return nullptr; - } +inline ::google::firestore::v1::Write* CommitRequest::mutable_writes(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitRequest.writes) + return _internal_mutable_writes()->Mutable(index); } -inline const ::google::firestore::v1::TransactionOptions& BatchGetDocumentsRequest::_internal_new_transaction() const { - return consistency_selector_case() == kNewTransaction ? *_impl_.consistency_selector_.new_transaction_ : reinterpret_cast<::google::firestore::v1::TransactionOptions&>(::google::firestore::v1::_TransactionOptions_default_instance_); +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* CommitRequest::mutable_writes() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.CommitRequest.writes) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_writes(); } -inline const ::google::firestore::v1::TransactionOptions& BatchGetDocumentsRequest::new_transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) - return _internal_new_transaction(); +inline const ::google::firestore::v1::Write& CommitRequest::writes(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CommitRequest.writes) + return _internal_writes().Get(index); } -inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::unsafe_arena_release_new_transaction() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) - if (consistency_selector_case() == kNewTransaction) { - clear_has_consistency_selector(); - auto* temp = _impl_.consistency_selector_.new_transaction_; - _impl_.consistency_selector_.new_transaction_ = nullptr; - return temp; - } else { - return nullptr; - } +inline ::google::firestore::v1::Write* CommitRequest::add_writes() ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::google::firestore::v1::Write* _add = _internal_mutable_writes()->Add(); + // @@protoc_insertion_point(field_add:google.firestore.v1.CommitRequest.writes) + return _add; } -inline void BatchGetDocumentsRequest::unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value) { - // We rely on the oneof clear method to free the earlier contents - // of this oneof. We can directly use the pointer we're given to - // set the new value. - clear_consistency_selector(); - if (value) { - set_has_new_transaction(); - _impl_.consistency_selector_.new_transaction_ = value; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& CommitRequest::writes() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.CommitRequest.writes) + return _internal_writes(); } -inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::_internal_mutable_new_transaction() { - if (consistency_selector_case() != kNewTransaction) { - clear_consistency_selector(); - set_has_new_transaction(); - _impl_.consistency_selector_.new_transaction_ = CreateMaybeMessage<::google::firestore::v1::TransactionOptions>(GetArena()); - } - return _impl_.consistency_selector_.new_transaction_; +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& +CommitRequest::_internal_writes() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.writes_; } -inline ::google::firestore::v1::TransactionOptions* BatchGetDocumentsRequest::mutable_new_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::TransactionOptions* _msg = _internal_mutable_new_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.new_transaction) - return _msg; +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* +CommitRequest::_internal_mutable_writes() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.writes_; } -// .google.protobuf.Timestamp read_time = 7; -inline bool BatchGetDocumentsRequest::has_read_time() const { - return consistency_selector_case() == kReadTime; +// bytes transaction = 3; +inline void CommitRequest::clear_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.transaction_.ClearToEmpty(); } -inline bool BatchGetDocumentsRequest::_internal_has_read_time() const { - return consistency_selector_case() == kReadTime; +inline const std::string& CommitRequest::transaction() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CommitRequest.transaction) + return _internal_transaction(); } -inline void BatchGetDocumentsRequest::set_has_read_time() { - _impl_._oneof_case_[0] = kReadTime; +template +inline PROTOBUF_ALWAYS_INLINE void CommitRequest::set_transaction(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.CommitRequest.transaction) } -inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::release_read_time() { - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsRequest.read_time) - if (consistency_selector_case() == kReadTime) { - clear_has_consistency_selector(); - auto* temp = _impl_.consistency_selector_.read_time_; - if (GetArena() != nullptr) { - temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); - } - _impl_.consistency_selector_.read_time_ = nullptr; - return temp; - } else { - return nullptr; - } +inline std::string* CommitRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_transaction(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitRequest.transaction) + return _s; } -inline const ::google::protobuf::Timestamp& BatchGetDocumentsRequest::_internal_read_time() const { - return consistency_selector_case() == kReadTime ? *_impl_.consistency_selector_.read_time_ : reinterpret_cast<::google::protobuf::Timestamp&>(::google::protobuf::_Timestamp_default_instance_); +inline const std::string& CommitRequest::_internal_transaction() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.transaction_.Get(); } -inline const ::google::protobuf::Timestamp& BatchGetDocumentsRequest::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsRequest.read_time) - return _internal_read_time(); +inline void CommitRequest::_internal_set_transaction(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.transaction_.Set(value, GetArena()); } -inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::unsafe_arena_release_read_time() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.BatchGetDocumentsRequest.read_time) - if (consistency_selector_case() == kReadTime) { - clear_has_consistency_selector(); - auto* temp = _impl_.consistency_selector_.read_time_; - _impl_.consistency_selector_.read_time_ = nullptr; - return temp; - } else { - return nullptr; - } +inline std::string* CommitRequest::_internal_mutable_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + return _impl_.transaction_.Mutable( GetArena()); } -inline void BatchGetDocumentsRequest::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { - // We rely on the oneof clear method to free the earlier contents - // of this oneof. We can directly use the pointer we're given to - // set the new value. - clear_consistency_selector(); - if (value) { - set_has_read_time(); - _impl_.consistency_selector_.read_time_ = value; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsRequest.read_time) +inline std::string* CommitRequest::release_transaction() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.CommitRequest.transaction) + return _impl_.transaction_.Release(); +} +inline void CommitRequest::set_allocated_transaction(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.transaction_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.transaction_.IsDefault()) { + _impl_.transaction_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CommitRequest.transaction) +} + +// ------------------------------------------------------------------- + +// CommitResponse + +// repeated .google.firestore.v1.WriteResult write_results = 1; +inline int CommitResponse::_internal_write_results_size() const { + return _internal_write_results().size(); } -inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::_internal_mutable_read_time() { - if (consistency_selector_case() != kReadTime) { - clear_consistency_selector(); - set_has_read_time(); - _impl_.consistency_selector_.read_time_ = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); - } - return _impl_.consistency_selector_.read_time_; +inline int CommitResponse::write_results_size() const { + return _internal_write_results_size(); } -inline ::google::protobuf::Timestamp* BatchGetDocumentsRequest::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsRequest.read_time) - return _msg; +inline ::google::firestore::v1::WriteResult* CommitResponse::mutable_write_results(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitResponse.write_results) + return _internal_mutable_write_results()->Mutable(index); } - -inline bool BatchGetDocumentsRequest::has_consistency_selector() const { - return consistency_selector_case() != CONSISTENCY_SELECTOR_NOT_SET; +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>* CommitResponse::mutable_write_results() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.CommitResponse.write_results) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_write_results(); } -inline void BatchGetDocumentsRequest::clear_has_consistency_selector() { - _impl_._oneof_case_[0] = CONSISTENCY_SELECTOR_NOT_SET; +inline const ::google::firestore::v1::WriteResult& CommitResponse::write_results(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CommitResponse.write_results) + return _internal_write_results().Get(index); } -inline BatchGetDocumentsRequest::ConsistencySelectorCase BatchGetDocumentsRequest::consistency_selector_case() const { - return BatchGetDocumentsRequest::ConsistencySelectorCase(_impl_._oneof_case_[0]); +inline ::google::firestore::v1::WriteResult* CommitResponse::add_write_results() ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::google::firestore::v1::WriteResult* _add = _internal_mutable_write_results()->Add(); + // @@protoc_insertion_point(field_add:google.firestore.v1.CommitResponse.write_results) + return _add; } -// ------------------------------------------------------------------- - -// BatchGetDocumentsResponse - -// .google.firestore.v1.Document found = 1; -inline bool BatchGetDocumentsResponse::has_found() const { - return result_case() == kFound; +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>& CommitResponse::write_results() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.CommitResponse.write_results) + return _internal_write_results(); } -inline bool BatchGetDocumentsResponse::_internal_has_found() const { - return result_case() == kFound; +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>& +CommitResponse::_internal_write_results() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.write_results_; } -inline void BatchGetDocumentsResponse::set_has_found() { - _impl_._oneof_case_[0] = kFound; +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>* +CommitResponse::_internal_mutable_write_results() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.write_results_; } -inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::release_found() { - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.found) - if (result_case() == kFound) { - clear_has_result(); - auto* temp = _impl_.result_.found_; - if (GetArena() != nullptr) { - temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); - } - _impl_.result_.found_ = nullptr; - return temp; - } else { - return nullptr; - } + +// .google.protobuf.Timestamp commit_time = 2; +inline bool CommitResponse::has_commit_time() const { + bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; + PROTOBUF_ASSUME(!value || _impl_.commit_time_ != nullptr); + return value; } -inline const ::google::firestore::v1::Document& BatchGetDocumentsResponse::_internal_found() const { - return result_case() == kFound ? *_impl_.result_.found_ : reinterpret_cast<::google::firestore::v1::Document&>(::google::firestore::v1::_Document_default_instance_); +inline const ::google::protobuf::Timestamp& CommitResponse::_internal_commit_time() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + const ::google::protobuf::Timestamp* p = _impl_.commit_time_; + return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Timestamp_default_instance_); } -inline const ::google::firestore::v1::Document& BatchGetDocumentsResponse::found() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.found) - return _internal_found(); +inline const ::google::protobuf::Timestamp& CommitResponse::commit_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.CommitResponse.commit_time) + return _internal_commit_time(); } -inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::unsafe_arena_release_found() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.BatchGetDocumentsResponse.found) - if (result_case() == kFound) { - clear_has_result(); - auto* temp = _impl_.result_.found_; - _impl_.result_.found_ = nullptr; - return temp; +inline void CommitResponse::unsafe_arena_set_allocated_commit_time(::google::protobuf::Timestamp* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.commit_time_); + } + _impl_.commit_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000001u; } else { - return nullptr; + _impl_._has_bits_[0] &= ~0x00000001u; } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.CommitResponse.commit_time) } -inline void BatchGetDocumentsResponse::unsafe_arena_set_allocated_found(::google::firestore::v1::Document* value) { - // We rely on the oneof clear method to free the earlier contents - // of this oneof. We can directly use the pointer we're given to - // set the new value. - clear_result(); - if (value) { - set_has_found(); - _impl_.result_.found_ = value; +inline ::google::protobuf::Timestamp* CommitResponse::release_commit_time() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::protobuf::Timestamp* released = _impl_.commit_time_; + _impl_.commit_time_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.found) +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; } -inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::_internal_mutable_found() { - if (result_case() != kFound) { - clear_result(); - set_has_found(); - _impl_.result_.found_ = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); +inline ::google::protobuf::Timestamp* CommitResponse::unsafe_arena_release_commit_time() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.CommitResponse.commit_time) + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::protobuf::Timestamp* temp = _impl_.commit_time_; + _impl_.commit_time_ = nullptr; + return temp; +} +inline ::google::protobuf::Timestamp* CommitResponse::_internal_mutable_commit_time() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_._has_bits_[0] |= 0x00000001u; + if (_impl_.commit_time_ == nullptr) { + auto* p = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); + _impl_.commit_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(p); } - return _impl_.result_.found_; + return _impl_.commit_time_; } -inline ::google::firestore::v1::Document* BatchGetDocumentsResponse::mutable_found() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::Document* _msg = _internal_mutable_found(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.found) +inline ::google::protobuf::Timestamp* CommitResponse::mutable_commit_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::Timestamp* _msg = _internal_mutable_commit_time(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitResponse.commit_time) return _msg; } +inline void CommitResponse::set_allocated_commit_time(::google::protobuf::Timestamp* value) { + ::google::protobuf::Arena* message_arena = GetArena(); + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.commit_time_); + } -// string missing = 2; -inline bool BatchGetDocumentsResponse::has_missing() const { - return result_case() == kMissing; -} -inline void BatchGetDocumentsResponse::set_has_missing() { - _impl_._oneof_case_[0] = kMissing; + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + + _impl_.commit_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CommitResponse.commit_time) } -inline void BatchGetDocumentsResponse::clear_missing() { + +// ------------------------------------------------------------------- + +// RollbackRequest + +// string database = 1; +inline void RollbackRequest::clear_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (result_case() == kMissing) { - _impl_.result_.missing_.Destroy(); - clear_has_result(); - } + _impl_.database_.ClearToEmpty(); } -inline const std::string& BatchGetDocumentsResponse::missing() const +inline const std::string& RollbackRequest::database() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.missing) - return _internal_missing(); + // @@protoc_insertion_point(field_get:google.firestore.v1.RollbackRequest.database) + return _internal_database(); } template -inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsResponse::set_missing(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void RollbackRequest::set_database(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (result_case() != kMissing) { - clear_result(); - - set_has_missing(); - _impl_.result_.missing_.InitDefault(); - } - _impl_.result_.missing_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsResponse.missing) + ; + _impl_.database_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.RollbackRequest.database) } -inline std::string* BatchGetDocumentsResponse::mutable_missing() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_missing(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.missing) +inline std::string* RollbackRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_database(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RollbackRequest.database) return _s; } -inline const std::string& BatchGetDocumentsResponse::_internal_missing() const { +inline const std::string& RollbackRequest::_internal_database() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - if (result_case() != kMissing) { - return ::google::protobuf::internal::GetEmptyStringAlreadyInited(); - } - return _impl_.result_.missing_.Get(); -} -inline void BatchGetDocumentsResponse::_internal_set_missing(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (result_case() != kMissing) { - clear_result(); - - set_has_missing(); - _impl_.result_.missing_.InitDefault(); - } - _impl_.result_.missing_.Set(value, GetArena()); + return _impl_.database_.Get(); } -inline std::string* BatchGetDocumentsResponse::_internal_mutable_missing() { +inline void RollbackRequest::_internal_set_database(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (result_case() != kMissing) { - clear_result(); - - set_has_missing(); - _impl_.result_.missing_.InitDefault(); - } - return _impl_.result_.missing_.Mutable( GetArena()); + ; + _impl_.database_.Set(value, GetArena()); } -inline std::string* BatchGetDocumentsResponse::release_missing() { +inline std::string* RollbackRequest::_internal_mutable_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.missing) - if (result_case() != kMissing) { - return nullptr; - } - clear_has_result(); - return _impl_.result_.missing_.Release(); + ; + return _impl_.database_.Mutable( GetArena()); } -inline void BatchGetDocumentsResponse::set_allocated_missing(std::string* value) { +inline std::string* RollbackRequest::release_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (has_result()) { - clear_result(); - } - if (value != nullptr) { - set_has_missing(); - _impl_.result_.missing_.InitAllocated(value, GetArena()); - } - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.missing) + // @@protoc_insertion_point(field_release:google.firestore.v1.RollbackRequest.database) + return _impl_.database_.Release(); +} +inline void RollbackRequest::set_allocated_database(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.database_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.database_.IsDefault()) { + _impl_.database_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RollbackRequest.database) } -// bytes transaction = 3; -inline void BatchGetDocumentsResponse::clear_transaction() { +// bytes transaction = 2; +inline void RollbackRequest::clear_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_.transaction_.ClearToEmpty(); } -inline const std::string& BatchGetDocumentsResponse::transaction() const +inline const std::string& RollbackRequest::transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.transaction) + // @@protoc_insertion_point(field_get:google.firestore.v1.RollbackRequest.transaction) return _internal_transaction(); } template -inline PROTOBUF_ALWAYS_INLINE void BatchGetDocumentsResponse::set_transaction(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void RollbackRequest::set_transaction(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.BatchGetDocumentsResponse.transaction) + // @@protoc_insertion_point(field_set:google.firestore.v1.RollbackRequest.transaction) } -inline std::string* BatchGetDocumentsResponse::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline std::string* RollbackRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { std::string* _s = _internal_mutable_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.transaction) + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RollbackRequest.transaction) return _s; } -inline const std::string& BatchGetDocumentsResponse::_internal_transaction() const { +inline const std::string& RollbackRequest::_internal_transaction() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); return _impl_.transaction_.Get(); } -inline void BatchGetDocumentsResponse::_internal_set_transaction(const std::string& value) { +inline void RollbackRequest::_internal_set_transaction(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; _impl_.transaction_.Set(value, GetArena()); } -inline std::string* BatchGetDocumentsResponse::_internal_mutable_transaction() { +inline std::string* RollbackRequest::_internal_mutable_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; return _impl_.transaction_.Mutable( GetArena()); } -inline std::string* BatchGetDocumentsResponse::release_transaction() { +inline std::string* RollbackRequest::release_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.transaction) + // @@protoc_insertion_point(field_release:google.firestore.v1.RollbackRequest.transaction) return _impl_.transaction_.Release(); } -inline void BatchGetDocumentsResponse::set_allocated_transaction(std::string* value) { +inline void RollbackRequest::set_allocated_transaction(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_.transaction_.SetAllocated(value, GetArena()); #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING @@ -9330,552 +10584,461 @@ inline void BatchGetDocumentsResponse::set_allocated_transaction(std::string* va _impl_.transaction_.Set("", GetArena()); } #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.transaction) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RollbackRequest.transaction) } -// .google.protobuf.Timestamp read_time = 4; -inline bool BatchGetDocumentsResponse::has_read_time() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.read_time_ != nullptr); - return value; +// ------------------------------------------------------------------- + +// RunQueryRequest + +// string parent = 1; +inline void RunQueryRequest::clear_parent() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.parent_.ClearToEmpty(); } -inline const ::google::protobuf::Timestamp& BatchGetDocumentsResponse::_internal_read_time() const { +inline const std::string& RunQueryRequest::parent() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.parent) + return _internal_parent(); +} +template +inline PROTOBUF_ALWAYS_INLINE void RunQueryRequest::set_parent(Arg_&& arg, + Args_... args) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.parent_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryRequest.parent) +} +inline std::string* RunQueryRequest::mutable_parent() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_parent(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.parent) + return _s; +} +inline const std::string& RunQueryRequest::_internal_parent() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::protobuf::Timestamp* p = _impl_.read_time_; - return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Timestamp_default_instance_); + return _impl_.parent_.Get(); } -inline const ::google::protobuf::Timestamp& BatchGetDocumentsResponse::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BatchGetDocumentsResponse.read_time) - return _internal_read_time(); +inline void RunQueryRequest::_internal_set_parent(const std::string& value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.parent_.Set(value, GetArena()); } -inline void BatchGetDocumentsResponse::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { +inline std::string* RunQueryRequest::_internal_mutable_parent() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); - } - _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); - if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.read_time) + ; + return _impl_.parent_.Mutable( GetArena()); } -inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::release_read_time() { +inline std::string* RunQueryRequest::release_parent() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - - _impl_._has_bits_[0] &= ~0x00000001u; - ::google::protobuf::Timestamp* released = _impl_.read_time_; - _impl_.read_time_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return released; + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.parent) + return _impl_.parent_.Release(); } -inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::unsafe_arena_release_read_time() { +inline void RunQueryRequest::set_allocated_parent(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BatchGetDocumentsResponse.read_time) + _impl_.parent_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.parent_.IsDefault()) { + _impl_.parent_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryRequest.parent) +} - _impl_._has_bits_[0] &= ~0x00000001u; - ::google::protobuf::Timestamp* temp = _impl_.read_time_; - _impl_.read_time_ = nullptr; - return temp; +// .google.firestore.v1.StructuredQuery structured_query = 2; +inline bool RunQueryRequest::has_structured_query() const { + return query_type_case() == kStructuredQuery; } -inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::_internal_mutable_read_time() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.read_time_ == nullptr) { - auto* p = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); - _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(p); - } - return _impl_.read_time_; +inline bool RunQueryRequest::_internal_has_structured_query() const { + return query_type_case() == kStructuredQuery; } -inline ::google::protobuf::Timestamp* BatchGetDocumentsResponse::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BatchGetDocumentsResponse.read_time) - return _msg; +inline void RunQueryRequest::set_has_structured_query() { + _impl_._oneof_case_[0] = kStructuredQuery; } -inline void BatchGetDocumentsResponse::set_allocated_read_time(::google::protobuf::Timestamp* value) { - ::google::protobuf::Arena* message_arena = GetArena(); - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); - } - - if (value != nullptr) { - ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); - if (message_arena != submessage_arena) { - value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); +inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::release_structured_query() { + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.structured_query) + if (query_type_case() == kStructuredQuery) { + clear_has_query_type(); + auto* temp = _impl_.query_type_.structured_query_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); } - _impl_._has_bits_[0] |= 0x00000001u; + _impl_.query_type_.structured_query_ = nullptr; + return temp; } else { - _impl_._has_bits_[0] &= ~0x00000001u; + return nullptr; } - - _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BatchGetDocumentsResponse.read_time) -} - -inline bool BatchGetDocumentsResponse::has_result() const { - return result_case() != RESULT_NOT_SET; } -inline void BatchGetDocumentsResponse::clear_has_result() { - _impl_._oneof_case_[0] = RESULT_NOT_SET; +inline const ::google::firestore::v1::StructuredQuery& RunQueryRequest::_internal_structured_query() const { + return query_type_case() == kStructuredQuery ? *_impl_.query_type_.structured_query_ : reinterpret_cast<::google::firestore::v1::StructuredQuery&>(::google::firestore::v1::_StructuredQuery_default_instance_); } -inline BatchGetDocumentsResponse::ResultCase BatchGetDocumentsResponse::result_case() const { - return BatchGetDocumentsResponse::ResultCase(_impl_._oneof_case_[0]); +inline const ::google::firestore::v1::StructuredQuery& RunQueryRequest::structured_query() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.structured_query) + return _internal_structured_query(); } -// ------------------------------------------------------------------- - -// BeginTransactionRequest - -// string database = 1; -inline void BeginTransactionRequest::clear_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.ClearToEmpty(); +inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::unsafe_arena_release_structured_query() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.RunQueryRequest.structured_query) + if (query_type_case() == kStructuredQuery) { + clear_has_query_type(); + auto* temp = _impl_.query_type_.structured_query_; + _impl_.query_type_.structured_query_ = nullptr; + return temp; + } else { + return nullptr; + } } -inline const std::string& BeginTransactionRequest::database() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BeginTransactionRequest.database) - return _internal_database(); +inline void RunQueryRequest::unsafe_arena_set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_query_type(); + if (value) { + set_has_structured_query(); + _impl_.query_type_.structured_query_ = value; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryRequest.structured_query) } -template -inline PROTOBUF_ALWAYS_INLINE void BeginTransactionRequest::set_database(Arg_&& arg, - Args_... args) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.BeginTransactionRequest.database) +inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::_internal_mutable_structured_query() { + if (query_type_case() != kStructuredQuery) { + clear_query_type(); + set_has_structured_query(); + _impl_.query_type_.structured_query_ = CreateMaybeMessage<::google::firestore::v1::StructuredQuery>(GetArena()); + } + return _impl_.query_type_.structured_query_; } -inline std::string* BeginTransactionRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_database(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BeginTransactionRequest.database) - return _s; +inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::mutable_structured_query() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::StructuredQuery* _msg = _internal_mutable_structured_query(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.structured_query) + return _msg; } -inline const std::string& BeginTransactionRequest::_internal_database() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.database_.Get(); + +// bytes transaction = 5; +inline bool RunQueryRequest::has_transaction() const { + return consistency_selector_case() == kTransaction; } -inline void BeginTransactionRequest::_internal_set_database(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(value, GetArena()); +inline void RunQueryRequest::set_has_transaction() { + _impl_._oneof_case_[1] = kTransaction; } -inline std::string* BeginTransactionRequest::_internal_mutable_database() { +inline void RunQueryRequest::clear_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.database_.Mutable( GetArena()); + if (consistency_selector_case() == kTransaction) { + _impl_.consistency_selector_.transaction_.Destroy(); + clear_has_consistency_selector(); + } } -inline std::string* BeginTransactionRequest::release_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BeginTransactionRequest.database) - return _impl_.database_.Release(); +inline const std::string& RunQueryRequest::transaction() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.transaction) + return _internal_transaction(); } -inline void BeginTransactionRequest::set_allocated_database(std::string* value) { +template +inline PROTOBUF_ALWAYS_INLINE void RunQueryRequest::set_transaction(Arg_&& arg, + Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.database_.IsDefault()) { - _impl_.database_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BeginTransactionRequest.database) -} + if (consistency_selector_case() != kTransaction) { + clear_consistency_selector(); -// .google.firestore.v1.TransactionOptions options = 2; -inline bool BeginTransactionRequest::has_options() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.options_ != nullptr); - return value; -} -inline const ::google::firestore::v1::TransactionOptions& BeginTransactionRequest::_internal_options() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::TransactionOptions* p = _impl_.options_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_TransactionOptions_default_instance_); + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitDefault(); + } + _impl_.consistency_selector_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryRequest.transaction) } -inline const ::google::firestore::v1::TransactionOptions& BeginTransactionRequest::options() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BeginTransactionRequest.options) - return _internal_options(); +inline std::string* RunQueryRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_transaction(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.transaction) + return _s; } -inline void BeginTransactionRequest::unsafe_arena_set_allocated_options(::google::firestore::v1::TransactionOptions* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.options_); - } - _impl_.options_ = reinterpret_cast<::google::firestore::v1::TransactionOptions*>(value); - if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; +inline const std::string& RunQueryRequest::_internal_transaction() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + if (consistency_selector_case() != kTransaction) { + return ::google::protobuf::internal::GetEmptyStringAlreadyInited(); } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.BeginTransactionRequest.options) + return _impl_.consistency_selector_.transaction_.Get(); } -inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::release_options() { +inline void RunQueryRequest::_internal_set_transaction(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (consistency_selector_case() != kTransaction) { + clear_consistency_selector(); - _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::TransactionOptions* released = _impl_.options_; - _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { - released = ::google::protobuf::internal::DuplicateIfNonNull(released); + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitDefault(); } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return released; + _impl_.consistency_selector_.transaction_.Set(value, GetArena()); } -inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::unsafe_arena_release_options() { +inline std::string* RunQueryRequest::_internal_mutable_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BeginTransactionRequest.options) + if (consistency_selector_case() != kTransaction) { + clear_consistency_selector(); - _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::TransactionOptions* temp = _impl_.options_; - _impl_.options_ = nullptr; - return temp; + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitDefault(); + } + return _impl_.consistency_selector_.transaction_.Mutable( GetArena()); } -inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::_internal_mutable_options() { +inline std::string* RunQueryRequest::release_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.options_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::TransactionOptions>(GetArena()); - _impl_.options_ = reinterpret_cast<::google::firestore::v1::TransactionOptions*>(p); + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.transaction) + if (consistency_selector_case() != kTransaction) { + return nullptr; } - return _impl_.options_; -} -inline ::google::firestore::v1::TransactionOptions* BeginTransactionRequest::mutable_options() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::TransactionOptions* _msg = _internal_mutable_options(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BeginTransactionRequest.options) - return _msg; + clear_has_consistency_selector(); + return _impl_.consistency_selector_.transaction_.Release(); } -inline void BeginTransactionRequest::set_allocated_options(::google::firestore::v1::TransactionOptions* value) { - ::google::protobuf::Arena* message_arena = GetArena(); +inline void RunQueryRequest::set_allocated_transaction(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.options_); + if (has_consistency_selector()) { + clear_consistency_selector(); } - if (value != nullptr) { - ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); - if (message_arena != submessage_arena) { - value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; + set_has_transaction(); + _impl_.consistency_selector_.transaction_.InitAllocated(value, GetArena()); } - - _impl_.options_ = reinterpret_cast<::google::firestore::v1::TransactionOptions*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BeginTransactionRequest.options) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryRequest.transaction) } -// ------------------------------------------------------------------- - -// BeginTransactionResponse - -// bytes transaction = 1; -inline void BeginTransactionResponse::clear_transaction() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.transaction_.ClearToEmpty(); -} -inline const std::string& BeginTransactionResponse::transaction() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.BeginTransactionResponse.transaction) - return _internal_transaction(); +// .google.firestore.v1.TransactionOptions new_transaction = 6; +inline bool RunQueryRequest::has_new_transaction() const { + return consistency_selector_case() == kNewTransaction; } -template -inline PROTOBUF_ALWAYS_INLINE void BeginTransactionResponse::set_transaction(Arg_&& arg, - Args_... args) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.BeginTransactionResponse.transaction) +inline bool RunQueryRequest::_internal_has_new_transaction() const { + return consistency_selector_case() == kNewTransaction; } -inline std::string* BeginTransactionResponse::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.BeginTransactionResponse.transaction) - return _s; +inline void RunQueryRequest::set_has_new_transaction() { + _impl_._oneof_case_[1] = kNewTransaction; } -inline const std::string& BeginTransactionResponse::_internal_transaction() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.transaction_.Get(); +inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::release_new_transaction() { + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.new_transaction) + if (consistency_selector_case() == kNewTransaction) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.new_transaction_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); + } + _impl_.consistency_selector_.new_transaction_ = nullptr; + return temp; + } else { + return nullptr; + } } -inline void BeginTransactionResponse::_internal_set_transaction(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.transaction_.Set(value, GetArena()); +inline const ::google::firestore::v1::TransactionOptions& RunQueryRequest::_internal_new_transaction() const { + return consistency_selector_case() == kNewTransaction ? *_impl_.consistency_selector_.new_transaction_ : reinterpret_cast<::google::firestore::v1::TransactionOptions&>(::google::firestore::v1::_TransactionOptions_default_instance_); } -inline std::string* BeginTransactionResponse::_internal_mutable_transaction() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.transaction_.Mutable( GetArena()); +inline const ::google::firestore::v1::TransactionOptions& RunQueryRequest::new_transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.new_transaction) + return _internal_new_transaction(); } -inline std::string* BeginTransactionResponse::release_transaction() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.BeginTransactionResponse.transaction) - return _impl_.transaction_.Release(); +inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::unsafe_arena_release_new_transaction() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.RunQueryRequest.new_transaction) + if (consistency_selector_case() == kNewTransaction) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.new_transaction_; + _impl_.consistency_selector_.new_transaction_ = nullptr; + return temp; + } else { + return nullptr; + } } -inline void BeginTransactionResponse::set_allocated_transaction(std::string* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.transaction_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.transaction_.IsDefault()) { - _impl_.transaction_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.BeginTransactionResponse.transaction) +inline void RunQueryRequest::unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_consistency_selector(); + if (value) { + set_has_new_transaction(); + _impl_.consistency_selector_.new_transaction_ = value; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryRequest.new_transaction) } - -// ------------------------------------------------------------------- - -// CommitRequest - -// string database = 1; -inline void CommitRequest::clear_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.ClearToEmpty(); +inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::_internal_mutable_new_transaction() { + if (consistency_selector_case() != kNewTransaction) { + clear_consistency_selector(); + set_has_new_transaction(); + _impl_.consistency_selector_.new_transaction_ = CreateMaybeMessage<::google::firestore::v1::TransactionOptions>(GetArena()); + } + return _impl_.consistency_selector_.new_transaction_; } -inline const std::string& CommitRequest::database() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CommitRequest.database) - return _internal_database(); +inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::mutable_new_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::TransactionOptions* _msg = _internal_mutable_new_transaction(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.new_transaction) + return _msg; } -template -inline PROTOBUF_ALWAYS_INLINE void CommitRequest::set_database(Arg_&& arg, - Args_... args) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.CommitRequest.database) + +// .google.protobuf.Timestamp read_time = 7; +inline bool RunQueryRequest::has_read_time() const { + return consistency_selector_case() == kReadTime; } -inline std::string* CommitRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_database(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitRequest.database) - return _s; +inline bool RunQueryRequest::_internal_has_read_time() const { + return consistency_selector_case() == kReadTime; } -inline const std::string& CommitRequest::_internal_database() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.database_.Get(); +inline void RunQueryRequest::set_has_read_time() { + _impl_._oneof_case_[1] = kReadTime; } -inline void CommitRequest::_internal_set_database(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(value, GetArena()); +inline ::google::protobuf::Timestamp* RunQueryRequest::release_read_time() { + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.read_time) + if (consistency_selector_case() == kReadTime) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.read_time_; + if (GetArena() != nullptr) { + temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); + } + _impl_.consistency_selector_.read_time_ = nullptr; + return temp; + } else { + return nullptr; + } } -inline std::string* CommitRequest::_internal_mutable_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.database_.Mutable( GetArena()); +inline const ::google::protobuf::Timestamp& RunQueryRequest::_internal_read_time() const { + return consistency_selector_case() == kReadTime ? *_impl_.consistency_selector_.read_time_ : reinterpret_cast<::google::protobuf::Timestamp&>(::google::protobuf::_Timestamp_default_instance_); } -inline std::string* CommitRequest::release_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CommitRequest.database) - return _impl_.database_.Release(); +inline const ::google::protobuf::Timestamp& RunQueryRequest::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.read_time) + return _internal_read_time(); } -inline void CommitRequest::set_allocated_database(std::string* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.database_.IsDefault()) { - _impl_.database_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CommitRequest.database) +inline ::google::protobuf::Timestamp* RunQueryRequest::unsafe_arena_release_read_time() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.RunQueryRequest.read_time) + if (consistency_selector_case() == kReadTime) { + clear_has_consistency_selector(); + auto* temp = _impl_.consistency_selector_.read_time_; + _impl_.consistency_selector_.read_time_ = nullptr; + return temp; + } else { + return nullptr; + } } - -// repeated .google.firestore.v1.Write writes = 2; -inline int CommitRequest::_internal_writes_size() const { - return _internal_writes().size(); +inline void RunQueryRequest::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { + // We rely on the oneof clear method to free the earlier contents + // of this oneof. We can directly use the pointer we're given to + // set the new value. + clear_consistency_selector(); + if (value) { + set_has_read_time(); + _impl_.consistency_selector_.read_time_ = value; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryRequest.read_time) } -inline int CommitRequest::writes_size() const { - return _internal_writes_size(); +inline ::google::protobuf::Timestamp* RunQueryRequest::_internal_mutable_read_time() { + if (consistency_selector_case() != kReadTime) { + clear_consistency_selector(); + set_has_read_time(); + _impl_.consistency_selector_.read_time_ = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); + } + return _impl_.consistency_selector_.read_time_; } -inline ::google::firestore::v1::Write* CommitRequest::mutable_writes(int index) - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitRequest.writes) - return _internal_mutable_writes()->Mutable(index); +inline ::google::protobuf::Timestamp* RunQueryRequest::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.read_time) + return _msg; } -inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* CommitRequest::mutable_writes() - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.CommitRequest.writes) - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - return _internal_mutable_writes(); + +inline bool RunQueryRequest::has_query_type() const { + return query_type_case() != QUERY_TYPE_NOT_SET; } -inline const ::google::firestore::v1::Write& CommitRequest::writes(int index) const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CommitRequest.writes) - return _internal_writes().Get(index); +inline void RunQueryRequest::clear_has_query_type() { + _impl_._oneof_case_[0] = QUERY_TYPE_NOT_SET; } -inline ::google::firestore::v1::Write* CommitRequest::add_writes() ABSL_ATTRIBUTE_LIFETIME_BOUND { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ::google::firestore::v1::Write* _add = _internal_mutable_writes()->Add(); - // @@protoc_insertion_point(field_add:google.firestore.v1.CommitRequest.writes) - return _add; +inline bool RunQueryRequest::has_consistency_selector() const { + return consistency_selector_case() != CONSISTENCY_SELECTOR_NOT_SET; } -inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& CommitRequest::writes() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_list:google.firestore.v1.CommitRequest.writes) - return _internal_writes(); +inline void RunQueryRequest::clear_has_consistency_selector() { + _impl_._oneof_case_[1] = CONSISTENCY_SELECTOR_NOT_SET; } -inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>& -CommitRequest::_internal_writes() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.writes_; +inline RunQueryRequest::QueryTypeCase RunQueryRequest::query_type_case() const { + return RunQueryRequest::QueryTypeCase(_impl_._oneof_case_[0]); } -inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Write>* -CommitRequest::_internal_mutable_writes() { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return &_impl_.writes_; +inline RunQueryRequest::ConsistencySelectorCase RunQueryRequest::consistency_selector_case() const { + return RunQueryRequest::ConsistencySelectorCase(_impl_._oneof_case_[1]); } +// ------------------------------------------------------------------- -// bytes transaction = 3; -inline void CommitRequest::clear_transaction() { +// RunQueryResponse + +// bytes transaction = 2; +inline void RunQueryResponse::clear_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_.transaction_.ClearToEmpty(); } -inline const std::string& CommitRequest::transaction() const +inline const std::string& RunQueryResponse::transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CommitRequest.transaction) + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.transaction) return _internal_transaction(); } template -inline PROTOBUF_ALWAYS_INLINE void CommitRequest::set_transaction(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void RunQueryResponse::set_transaction(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.CommitRequest.transaction) + // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryResponse.transaction) } -inline std::string* CommitRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline std::string* RunQueryResponse::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { std::string* _s = _internal_mutable_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitRequest.transaction) + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryResponse.transaction) return _s; } -inline const std::string& CommitRequest::_internal_transaction() const { +inline const std::string& RunQueryResponse::_internal_transaction() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); return _impl_.transaction_.Get(); } -inline void CommitRequest::_internal_set_transaction(const std::string& value) { +inline void RunQueryResponse::_internal_set_transaction(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; _impl_.transaction_.Set(value, GetArena()); } -inline std::string* CommitRequest::_internal_mutable_transaction() { +inline std::string* RunQueryResponse::_internal_mutable_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; return _impl_.transaction_.Mutable( GetArena()); } -inline std::string* CommitRequest::release_transaction() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CommitRequest.transaction) - return _impl_.transaction_.Release(); -} -inline void CommitRequest::set_allocated_transaction(std::string* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.transaction_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.transaction_.IsDefault()) { - _impl_.transaction_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CommitRequest.transaction) -} - -// ------------------------------------------------------------------- - -// CommitResponse - -// repeated .google.firestore.v1.WriteResult write_results = 1; -inline int CommitResponse::_internal_write_results_size() const { - return _internal_write_results().size(); -} -inline int CommitResponse::write_results_size() const { - return _internal_write_results_size(); -} -inline ::google::firestore::v1::WriteResult* CommitResponse::mutable_write_results(int index) - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitResponse.write_results) - return _internal_mutable_write_results()->Mutable(index); -} -inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>* CommitResponse::mutable_write_results() - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.CommitResponse.write_results) - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - return _internal_mutable_write_results(); -} -inline const ::google::firestore::v1::WriteResult& CommitResponse::write_results(int index) const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CommitResponse.write_results) - return _internal_write_results().Get(index); -} -inline ::google::firestore::v1::WriteResult* CommitResponse::add_write_results() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline std::string* RunQueryResponse::release_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ::google::firestore::v1::WriteResult* _add = _internal_mutable_write_results()->Add(); - // @@protoc_insertion_point(field_add:google.firestore.v1.CommitResponse.write_results) - return _add; -} -inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>& CommitResponse::write_results() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_list:google.firestore.v1.CommitResponse.write_results) - return _internal_write_results(); -} -inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>& -CommitResponse::_internal_write_results() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.write_results_; -} -inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::WriteResult>* -CommitResponse::_internal_mutable_write_results() { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return &_impl_.write_results_; + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryResponse.transaction) + return _impl_.transaction_.Release(); +} +inline void RunQueryResponse::set_allocated_transaction(std::string* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.transaction_.SetAllocated(value, GetArena()); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.transaction_.IsDefault()) { + _impl_.transaction_.Set("", GetArena()); + } + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryResponse.transaction) } -// .google.protobuf.Timestamp commit_time = 2; -inline bool CommitResponse::has_commit_time() const { +// .google.firestore.v1.Document document = 1; +inline bool RunQueryResponse::has_document() const { bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.commit_time_ != nullptr); + PROTOBUF_ASSUME(!value || _impl_.document_ != nullptr); return value; } -inline const ::google::protobuf::Timestamp& CommitResponse::_internal_commit_time() const { +inline const ::google::firestore::v1::Document& RunQueryResponse::_internal_document() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::protobuf::Timestamp* p = _impl_.commit_time_; - return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Timestamp_default_instance_); + const ::google::firestore::v1::Document* p = _impl_.document_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Document_default_instance_); } -inline const ::google::protobuf::Timestamp& CommitResponse::commit_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.CommitResponse.commit_time) - return _internal_commit_time(); +inline const ::google::firestore::v1::Document& RunQueryResponse::document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.document) + return _internal_document(); } -inline void CommitResponse::unsafe_arena_set_allocated_commit_time(::google::protobuf::Timestamp* value) { +inline void RunQueryResponse::unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.commit_time_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); } - _impl_.commit_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); if (value != nullptr) { _impl_._has_bits_[0] |= 0x00000001u; } else { _impl_._has_bits_[0] &= ~0x00000001u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.CommitResponse.commit_time) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryResponse.document) } -inline ::google::protobuf::Timestamp* CommitResponse::release_commit_time() { +inline ::google::firestore::v1::Document* RunQueryResponse::release_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] &= ~0x00000001u; - ::google::protobuf::Timestamp* released = _impl_.commit_time_; - _impl_.commit_time_ = nullptr; + ::google::firestore::v1::Document* released = _impl_.document_; + _impl_.document_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -9889,34 +11052,34 @@ inline ::google::protobuf::Timestamp* CommitResponse::release_commit_time() { #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::protobuf::Timestamp* CommitResponse::unsafe_arena_release_commit_time() { +inline ::google::firestore::v1::Document* RunQueryResponse::unsafe_arena_release_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.CommitResponse.commit_time) + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryResponse.document) _impl_._has_bits_[0] &= ~0x00000001u; - ::google::protobuf::Timestamp* temp = _impl_.commit_time_; - _impl_.commit_time_ = nullptr; + ::google::firestore::v1::Document* temp = _impl_.document_; + _impl_.document_ = nullptr; return temp; } -inline ::google::protobuf::Timestamp* CommitResponse::_internal_mutable_commit_time() { +inline ::google::firestore::v1::Document* RunQueryResponse::_internal_mutable_document() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.commit_time_ == nullptr) { - auto* p = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); - _impl_.commit_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(p); + if (_impl_.document_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(p); } - return _impl_.commit_time_; + return _impl_.document_; } -inline ::google::protobuf::Timestamp* CommitResponse::mutable_commit_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::protobuf::Timestamp* _msg = _internal_mutable_commit_time(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.CommitResponse.commit_time) +inline ::google::firestore::v1::Document* RunQueryResponse::mutable_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Document* _msg = _internal_mutable_document(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryResponse.document) return _msg; } -inline void CommitResponse::set_allocated_commit_time(::google::protobuf::Timestamp* value) { +inline void RunQueryResponse::set_allocated_document(::google::firestore::v1::Document* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.commit_time_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); } if (value != nullptr) { @@ -9929,265 +11092,269 @@ inline void CommitResponse::set_allocated_commit_time(::google::protobuf::Timest _impl_._has_bits_[0] &= ~0x00000001u; } - _impl_.commit_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.CommitResponse.commit_time) + _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryResponse.document) } -// ------------------------------------------------------------------- - -// RollbackRequest - -// string database = 1; -inline void RollbackRequest::clear_database() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.ClearToEmpty(); -} -inline const std::string& RollbackRequest::database() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RollbackRequest.database) - return _internal_database(); +// .google.protobuf.Timestamp read_time = 3; +inline bool RunQueryResponse::has_read_time() const { + bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; + PROTOBUF_ASSUME(!value || _impl_.read_time_ != nullptr); + return value; } -template -inline PROTOBUF_ALWAYS_INLINE void RollbackRequest::set_database(Arg_&& arg, - Args_... args) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.RollbackRequest.database) +inline const ::google::protobuf::Timestamp& RunQueryResponse::_internal_read_time() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + const ::google::protobuf::Timestamp* p = _impl_.read_time_; + return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Timestamp_default_instance_); } -inline std::string* RollbackRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_database(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RollbackRequest.database) - return _s; +inline const ::google::protobuf::Timestamp& RunQueryResponse::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.read_time) + return _internal_read_time(); } -inline const std::string& RollbackRequest::_internal_database() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.database_.Get(); +inline void RunQueryResponse::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); + } + _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000002u; + } else { + _impl_._has_bits_[0] &= ~0x00000002u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryResponse.read_time) } -inline void RollbackRequest::_internal_set_database(const std::string& value) { +inline ::google::protobuf::Timestamp* RunQueryResponse::release_read_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.database_.Set(value, GetArena()); + + _impl_._has_bits_[0] &= ~0x00000002u; + ::google::protobuf::Timestamp* released = _impl_.read_time_; + _impl_.read_time_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; } -inline std::string* RollbackRequest::_internal_mutable_database() { +inline ::google::protobuf::Timestamp* RunQueryResponse::unsafe_arena_release_read_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - return _impl_.database_.Mutable( GetArena()); + // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryResponse.read_time) + + _impl_._has_bits_[0] &= ~0x00000002u; + ::google::protobuf::Timestamp* temp = _impl_.read_time_; + _impl_.read_time_ = nullptr; + return temp; } -inline std::string* RollbackRequest::release_database() { +inline ::google::protobuf::Timestamp* RunQueryResponse::_internal_mutable_read_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.RollbackRequest.database) - return _impl_.database_.Release(); + _impl_._has_bits_[0] |= 0x00000002u; + if (_impl_.read_time_ == nullptr) { + auto* p = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); + _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(p); + } + return _impl_.read_time_; } -inline void RollbackRequest::set_allocated_database(std::string* value) { +inline ::google::protobuf::Timestamp* RunQueryResponse::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryResponse.read_time) + return _msg; +} +inline void RunQueryResponse::set_allocated_read_time(::google::protobuf::Timestamp* value) { + ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.database_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.database_.IsDefault()) { - _impl_.database_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RollbackRequest.database) + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000002u; + } else { + _impl_._has_bits_[0] &= ~0x00000002u; + } + + _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryResponse.read_time) } -// bytes transaction = 2; -inline void RollbackRequest::clear_transaction() { +// int32 skipped_results = 4; +inline void RunQueryResponse::clear_skipped_results() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.transaction_.ClearToEmpty(); -} -inline const std::string& RollbackRequest::transaction() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RollbackRequest.transaction) - return _internal_transaction(); + _impl_.skipped_results_ = 0; } -template -inline PROTOBUF_ALWAYS_INLINE void RollbackRequest::set_transaction(Arg_&& arg, - Args_... args) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.RollbackRequest.transaction) +inline ::int32_t RunQueryResponse::skipped_results() const { + // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.skipped_results) + return _internal_skipped_results(); } -inline std::string* RollbackRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RollbackRequest.transaction) - return _s; +inline void RunQueryResponse::set_skipped_results(::int32_t value) { + _internal_set_skipped_results(value); + // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryResponse.skipped_results) } -inline const std::string& RollbackRequest::_internal_transaction() const { +inline ::int32_t RunQueryResponse::_internal_skipped_results() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.transaction_.Get(); -} -inline void RollbackRequest::_internal_set_transaction(const std::string& value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.transaction_.Set(value, GetArena()); + return _impl_.skipped_results_; } -inline std::string* RollbackRequest::_internal_mutable_transaction() { +inline void RunQueryResponse::_internal_set_skipped_results(::int32_t value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - return _impl_.transaction_.Mutable( GetArena()); -} -inline std::string* RollbackRequest::release_transaction() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.RollbackRequest.transaction) - return _impl_.transaction_.Release(); -} -inline void RollbackRequest::set_allocated_transaction(std::string* value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.transaction_.SetAllocated(value, GetArena()); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.transaction_.IsDefault()) { - _impl_.transaction_.Set("", GetArena()); - } - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RollbackRequest.transaction) + _impl_.skipped_results_ = value; } // ------------------------------------------------------------------- -// RunQueryRequest +// ExecutePipelineRequest -// string parent = 1; -inline void RunQueryRequest::clear_parent() { +// string database = 1 [(.google.api.field_behavior) = REQUIRED]; +inline void ExecutePipelineRequest::clear_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.parent_.ClearToEmpty(); + _impl_.database_.ClearToEmpty(); } -inline const std::string& RunQueryRequest::parent() const +inline const std::string& ExecutePipelineRequest::database() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.parent) - return _internal_parent(); + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineRequest.database) + return _internal_database(); } template -inline PROTOBUF_ALWAYS_INLINE void RunQueryRequest::set_parent(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void ExecutePipelineRequest::set_database(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - _impl_.parent_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryRequest.parent) + _impl_.database_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:google.firestore.v1.ExecutePipelineRequest.database) } -inline std::string* RunQueryRequest::mutable_parent() ABSL_ATTRIBUTE_LIFETIME_BOUND { - std::string* _s = _internal_mutable_parent(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.parent) +inline std::string* ExecutePipelineRequest::mutable_database() ABSL_ATTRIBUTE_LIFETIME_BOUND { + std::string* _s = _internal_mutable_database(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineRequest.database) return _s; } -inline const std::string& RunQueryRequest::_internal_parent() const { +inline const std::string& ExecutePipelineRequest::_internal_database() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.parent_.Get(); + return _impl_.database_.Get(); } -inline void RunQueryRequest::_internal_set_parent(const std::string& value) { +inline void ExecutePipelineRequest::_internal_set_database(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - _impl_.parent_.Set(value, GetArena()); + _impl_.database_.Set(value, GetArena()); } -inline std::string* RunQueryRequest::_internal_mutable_parent() { +inline std::string* ExecutePipelineRequest::_internal_mutable_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; - return _impl_.parent_.Mutable( GetArena()); + return _impl_.database_.Mutable( GetArena()); } -inline std::string* RunQueryRequest::release_parent() { +inline std::string* ExecutePipelineRequest::release_database() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.parent) - return _impl_.parent_.Release(); + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineRequest.database) + return _impl_.database_.Release(); } -inline void RunQueryRequest::set_allocated_parent(std::string* value) { +inline void ExecutePipelineRequest::set_allocated_database(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.parent_.SetAllocated(value, GetArena()); + _impl_.database_.SetAllocated(value, GetArena()); #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.parent_.IsDefault()) { - _impl_.parent_.Set("", GetArena()); + if (_impl_.database_.IsDefault()) { + _impl_.database_.Set("", GetArena()); } #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryRequest.parent) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineRequest.database) } -// .google.firestore.v1.StructuredQuery structured_query = 2; -inline bool RunQueryRequest::has_structured_query() const { - return query_type_case() == kStructuredQuery; +// .google.firestore.v1.StructuredPipeline structured_pipeline = 2; +inline bool ExecutePipelineRequest::has_structured_pipeline() const { + return pipeline_type_case() == kStructuredPipeline; } -inline bool RunQueryRequest::_internal_has_structured_query() const { - return query_type_case() == kStructuredQuery; +inline bool ExecutePipelineRequest::_internal_has_structured_pipeline() const { + return pipeline_type_case() == kStructuredPipeline; } -inline void RunQueryRequest::set_has_structured_query() { - _impl_._oneof_case_[0] = kStructuredQuery; +inline void ExecutePipelineRequest::set_has_structured_pipeline() { + _impl_._oneof_case_[0] = kStructuredPipeline; } -inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::release_structured_query() { - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.structured_query) - if (query_type_case() == kStructuredQuery) { - clear_has_query_type(); - auto* temp = _impl_.query_type_.structured_query_; +inline ::google::firestore::v1::StructuredPipeline* ExecutePipelineRequest::release_structured_pipeline() { + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineRequest.structured_pipeline) + if (pipeline_type_case() == kStructuredPipeline) { + clear_has_pipeline_type(); + auto* temp = _impl_.pipeline_type_.structured_pipeline_; if (GetArena() != nullptr) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp); } - _impl_.query_type_.structured_query_ = nullptr; + _impl_.pipeline_type_.structured_pipeline_ = nullptr; return temp; } else { return nullptr; } } -inline const ::google::firestore::v1::StructuredQuery& RunQueryRequest::_internal_structured_query() const { - return query_type_case() == kStructuredQuery ? *_impl_.query_type_.structured_query_ : reinterpret_cast<::google::firestore::v1::StructuredQuery&>(::google::firestore::v1::_StructuredQuery_default_instance_); +inline const ::google::firestore::v1::StructuredPipeline& ExecutePipelineRequest::_internal_structured_pipeline() const { + return pipeline_type_case() == kStructuredPipeline ? *_impl_.pipeline_type_.structured_pipeline_ : reinterpret_cast<::google::firestore::v1::StructuredPipeline&>(::google::firestore::v1::_StructuredPipeline_default_instance_); } -inline const ::google::firestore::v1::StructuredQuery& RunQueryRequest::structured_query() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.structured_query) - return _internal_structured_query(); +inline const ::google::firestore::v1::StructuredPipeline& ExecutePipelineRequest::structured_pipeline() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineRequest.structured_pipeline) + return _internal_structured_pipeline(); } -inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::unsafe_arena_release_structured_query() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.RunQueryRequest.structured_query) - if (query_type_case() == kStructuredQuery) { - clear_has_query_type(); - auto* temp = _impl_.query_type_.structured_query_; - _impl_.query_type_.structured_query_ = nullptr; +inline ::google::firestore::v1::StructuredPipeline* ExecutePipelineRequest::unsafe_arena_release_structured_pipeline() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.ExecutePipelineRequest.structured_pipeline) + if (pipeline_type_case() == kStructuredPipeline) { + clear_has_pipeline_type(); + auto* temp = _impl_.pipeline_type_.structured_pipeline_; + _impl_.pipeline_type_.structured_pipeline_ = nullptr; return temp; } else { return nullptr; } } -inline void RunQueryRequest::unsafe_arena_set_allocated_structured_query(::google::firestore::v1::StructuredQuery* value) { +inline void ExecutePipelineRequest::unsafe_arena_set_allocated_structured_pipeline(::google::firestore::v1::StructuredPipeline* value) { // We rely on the oneof clear method to free the earlier contents // of this oneof. We can directly use the pointer we're given to // set the new value. - clear_query_type(); + clear_pipeline_type(); if (value) { - set_has_structured_query(); - _impl_.query_type_.structured_query_ = value; + set_has_structured_pipeline(); + _impl_.pipeline_type_.structured_pipeline_ = value; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryRequest.structured_query) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.ExecutePipelineRequest.structured_pipeline) } -inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::_internal_mutable_structured_query() { - if (query_type_case() != kStructuredQuery) { - clear_query_type(); - set_has_structured_query(); - _impl_.query_type_.structured_query_ = CreateMaybeMessage<::google::firestore::v1::StructuredQuery>(GetArena()); +inline ::google::firestore::v1::StructuredPipeline* ExecutePipelineRequest::_internal_mutable_structured_pipeline() { + if (pipeline_type_case() != kStructuredPipeline) { + clear_pipeline_type(); + set_has_structured_pipeline(); + _impl_.pipeline_type_.structured_pipeline_ = CreateMaybeMessage<::google::firestore::v1::StructuredPipeline>(GetArena()); } - return _impl_.query_type_.structured_query_; + return _impl_.pipeline_type_.structured_pipeline_; } -inline ::google::firestore::v1::StructuredQuery* RunQueryRequest::mutable_structured_query() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::StructuredQuery* _msg = _internal_mutable_structured_query(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.structured_query) +inline ::google::firestore::v1::StructuredPipeline* ExecutePipelineRequest::mutable_structured_pipeline() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::StructuredPipeline* _msg = _internal_mutable_structured_pipeline(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineRequest.structured_pipeline) return _msg; } // bytes transaction = 5; -inline bool RunQueryRequest::has_transaction() const { +inline bool ExecutePipelineRequest::has_transaction() const { return consistency_selector_case() == kTransaction; } -inline void RunQueryRequest::set_has_transaction() { +inline void ExecutePipelineRequest::set_has_transaction() { _impl_._oneof_case_[1] = kTransaction; } -inline void RunQueryRequest::clear_transaction() { +inline void ExecutePipelineRequest::clear_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (consistency_selector_case() == kTransaction) { _impl_.consistency_selector_.transaction_.Destroy(); clear_has_consistency_selector(); } } -inline const std::string& RunQueryRequest::transaction() const +inline const std::string& ExecutePipelineRequest::transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.transaction) + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineRequest.transaction) return _internal_transaction(); } template -inline PROTOBUF_ALWAYS_INLINE void RunQueryRequest::set_transaction(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void ExecutePipelineRequest::set_transaction(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (consistency_selector_case() != kTransaction) { @@ -10197,21 +11364,21 @@ inline PROTOBUF_ALWAYS_INLINE void RunQueryRequest::set_transaction(Arg_&& arg, _impl_.consistency_selector_.transaction_.InitDefault(); } _impl_.consistency_selector_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryRequest.transaction) + // @@protoc_insertion_point(field_set:google.firestore.v1.ExecutePipelineRequest.transaction) } -inline std::string* RunQueryRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline std::string* ExecutePipelineRequest::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { std::string* _s = _internal_mutable_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.transaction) + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineRequest.transaction) return _s; } -inline const std::string& RunQueryRequest::_internal_transaction() const { +inline const std::string& ExecutePipelineRequest::_internal_transaction() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); if (consistency_selector_case() != kTransaction) { return ::google::protobuf::internal::GetEmptyStringAlreadyInited(); } return _impl_.consistency_selector_.transaction_.Get(); } -inline void RunQueryRequest::_internal_set_transaction(const std::string& value) { +inline void ExecutePipelineRequest::_internal_set_transaction(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (consistency_selector_case() != kTransaction) { clear_consistency_selector(); @@ -10221,7 +11388,7 @@ inline void RunQueryRequest::_internal_set_transaction(const std::string& value) } _impl_.consistency_selector_.transaction_.Set(value, GetArena()); } -inline std::string* RunQueryRequest::_internal_mutable_transaction() { +inline std::string* ExecutePipelineRequest::_internal_mutable_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (consistency_selector_case() != kTransaction) { clear_consistency_selector(); @@ -10231,16 +11398,16 @@ inline std::string* RunQueryRequest::_internal_mutable_transaction() { } return _impl_.consistency_selector_.transaction_.Mutable( GetArena()); } -inline std::string* RunQueryRequest::release_transaction() { +inline std::string* ExecutePipelineRequest::release_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.transaction) + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineRequest.transaction) if (consistency_selector_case() != kTransaction) { return nullptr; } clear_has_consistency_selector(); return _impl_.consistency_selector_.transaction_.Release(); } -inline void RunQueryRequest::set_allocated_transaction(std::string* value) { +inline void ExecutePipelineRequest::set_allocated_transaction(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (has_consistency_selector()) { clear_consistency_selector(); @@ -10249,21 +11416,21 @@ inline void RunQueryRequest::set_allocated_transaction(std::string* value) { set_has_transaction(); _impl_.consistency_selector_.transaction_.InitAllocated(value, GetArena()); } - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryRequest.transaction) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineRequest.transaction) } // .google.firestore.v1.TransactionOptions new_transaction = 6; -inline bool RunQueryRequest::has_new_transaction() const { +inline bool ExecutePipelineRequest::has_new_transaction() const { return consistency_selector_case() == kNewTransaction; } -inline bool RunQueryRequest::_internal_has_new_transaction() const { +inline bool ExecutePipelineRequest::_internal_has_new_transaction() const { return consistency_selector_case() == kNewTransaction; } -inline void RunQueryRequest::set_has_new_transaction() { +inline void ExecutePipelineRequest::set_has_new_transaction() { _impl_._oneof_case_[1] = kNewTransaction; } -inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::release_new_transaction() { - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.new_transaction) +inline ::google::firestore::v1::TransactionOptions* ExecutePipelineRequest::release_new_transaction() { + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineRequest.new_transaction) if (consistency_selector_case() == kNewTransaction) { clear_has_consistency_selector(); auto* temp = _impl_.consistency_selector_.new_transaction_; @@ -10276,15 +11443,15 @@ inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::release_new return nullptr; } } -inline const ::google::firestore::v1::TransactionOptions& RunQueryRequest::_internal_new_transaction() const { +inline const ::google::firestore::v1::TransactionOptions& ExecutePipelineRequest::_internal_new_transaction() const { return consistency_selector_case() == kNewTransaction ? *_impl_.consistency_selector_.new_transaction_ : reinterpret_cast<::google::firestore::v1::TransactionOptions&>(::google::firestore::v1::_TransactionOptions_default_instance_); } -inline const ::google::firestore::v1::TransactionOptions& RunQueryRequest::new_transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.new_transaction) +inline const ::google::firestore::v1::TransactionOptions& ExecutePipelineRequest::new_transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineRequest.new_transaction) return _internal_new_transaction(); } -inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::unsafe_arena_release_new_transaction() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.RunQueryRequest.new_transaction) +inline ::google::firestore::v1::TransactionOptions* ExecutePipelineRequest::unsafe_arena_release_new_transaction() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.ExecutePipelineRequest.new_transaction) if (consistency_selector_case() == kNewTransaction) { clear_has_consistency_selector(); auto* temp = _impl_.consistency_selector_.new_transaction_; @@ -10294,7 +11461,7 @@ inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::unsafe_aren return nullptr; } } -inline void RunQueryRequest::unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value) { +inline void ExecutePipelineRequest::unsafe_arena_set_allocated_new_transaction(::google::firestore::v1::TransactionOptions* value) { // We rely on the oneof clear method to free the earlier contents // of this oneof. We can directly use the pointer we're given to // set the new value. @@ -10303,9 +11470,9 @@ inline void RunQueryRequest::unsafe_arena_set_allocated_new_transaction(::google set_has_new_transaction(); _impl_.consistency_selector_.new_transaction_ = value; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryRequest.new_transaction) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.ExecutePipelineRequest.new_transaction) } -inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::_internal_mutable_new_transaction() { +inline ::google::firestore::v1::TransactionOptions* ExecutePipelineRequest::_internal_mutable_new_transaction() { if (consistency_selector_case() != kNewTransaction) { clear_consistency_selector(); set_has_new_transaction(); @@ -10313,24 +11480,24 @@ inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::_internal_m } return _impl_.consistency_selector_.new_transaction_; } -inline ::google::firestore::v1::TransactionOptions* RunQueryRequest::mutable_new_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline ::google::firestore::v1::TransactionOptions* ExecutePipelineRequest::mutable_new_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { ::google::firestore::v1::TransactionOptions* _msg = _internal_mutable_new_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.new_transaction) + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineRequest.new_transaction) return _msg; } // .google.protobuf.Timestamp read_time = 7; -inline bool RunQueryRequest::has_read_time() const { +inline bool ExecutePipelineRequest::has_read_time() const { return consistency_selector_case() == kReadTime; } -inline bool RunQueryRequest::_internal_has_read_time() const { +inline bool ExecutePipelineRequest::_internal_has_read_time() const { return consistency_selector_case() == kReadTime; } -inline void RunQueryRequest::set_has_read_time() { +inline void ExecutePipelineRequest::set_has_read_time() { _impl_._oneof_case_[1] = kReadTime; } -inline ::google::protobuf::Timestamp* RunQueryRequest::release_read_time() { - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryRequest.read_time) +inline ::google::protobuf::Timestamp* ExecutePipelineRequest::release_read_time() { + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineRequest.read_time) if (consistency_selector_case() == kReadTime) { clear_has_consistency_selector(); auto* temp = _impl_.consistency_selector_.read_time_; @@ -10343,15 +11510,15 @@ inline ::google::protobuf::Timestamp* RunQueryRequest::release_read_time() { return nullptr; } } -inline const ::google::protobuf::Timestamp& RunQueryRequest::_internal_read_time() const { +inline const ::google::protobuf::Timestamp& ExecutePipelineRequest::_internal_read_time() const { return consistency_selector_case() == kReadTime ? *_impl_.consistency_selector_.read_time_ : reinterpret_cast<::google::protobuf::Timestamp&>(::google::protobuf::_Timestamp_default_instance_); } -inline const ::google::protobuf::Timestamp& RunQueryRequest::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryRequest.read_time) +inline const ::google::protobuf::Timestamp& ExecutePipelineRequest::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineRequest.read_time) return _internal_read_time(); } -inline ::google::protobuf::Timestamp* RunQueryRequest::unsafe_arena_release_read_time() { - // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.RunQueryRequest.read_time) +inline ::google::protobuf::Timestamp* ExecutePipelineRequest::unsafe_arena_release_read_time() { + // @@protoc_insertion_point(field_unsafe_arena_release:google.firestore.v1.ExecutePipelineRequest.read_time) if (consistency_selector_case() == kReadTime) { clear_has_consistency_selector(); auto* temp = _impl_.consistency_selector_.read_time_; @@ -10361,7 +11528,7 @@ inline ::google::protobuf::Timestamp* RunQueryRequest::unsafe_arena_release_read return nullptr; } } -inline void RunQueryRequest::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { +inline void ExecutePipelineRequest::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { // We rely on the oneof clear method to free the earlier contents // of this oneof. We can directly use the pointer we're given to // set the new value. @@ -10370,9 +11537,9 @@ inline void RunQueryRequest::unsafe_arena_set_allocated_read_time(::google::prot set_has_read_time(); _impl_.consistency_selector_.read_time_ = value; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryRequest.read_time) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.ExecutePipelineRequest.read_time) } -inline ::google::protobuf::Timestamp* RunQueryRequest::_internal_mutable_read_time() { +inline ::google::protobuf::Timestamp* ExecutePipelineRequest::_internal_mutable_read_time() { if (consistency_selector_case() != kReadTime) { clear_consistency_selector(); set_has_read_time(); @@ -10380,77 +11547,77 @@ inline ::google::protobuf::Timestamp* RunQueryRequest::_internal_mutable_read_ti } return _impl_.consistency_selector_.read_time_; } -inline ::google::protobuf::Timestamp* RunQueryRequest::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline ::google::protobuf::Timestamp* ExecutePipelineRequest::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryRequest.read_time) + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineRequest.read_time) return _msg; } -inline bool RunQueryRequest::has_query_type() const { - return query_type_case() != QUERY_TYPE_NOT_SET; +inline bool ExecutePipelineRequest::has_pipeline_type() const { + return pipeline_type_case() != PIPELINE_TYPE_NOT_SET; } -inline void RunQueryRequest::clear_has_query_type() { - _impl_._oneof_case_[0] = QUERY_TYPE_NOT_SET; +inline void ExecutePipelineRequest::clear_has_pipeline_type() { + _impl_._oneof_case_[0] = PIPELINE_TYPE_NOT_SET; } -inline bool RunQueryRequest::has_consistency_selector() const { +inline bool ExecutePipelineRequest::has_consistency_selector() const { return consistency_selector_case() != CONSISTENCY_SELECTOR_NOT_SET; } -inline void RunQueryRequest::clear_has_consistency_selector() { +inline void ExecutePipelineRequest::clear_has_consistency_selector() { _impl_._oneof_case_[1] = CONSISTENCY_SELECTOR_NOT_SET; } -inline RunQueryRequest::QueryTypeCase RunQueryRequest::query_type_case() const { - return RunQueryRequest::QueryTypeCase(_impl_._oneof_case_[0]); +inline ExecutePipelineRequest::PipelineTypeCase ExecutePipelineRequest::pipeline_type_case() const { + return ExecutePipelineRequest::PipelineTypeCase(_impl_._oneof_case_[0]); } -inline RunQueryRequest::ConsistencySelectorCase RunQueryRequest::consistency_selector_case() const { - return RunQueryRequest::ConsistencySelectorCase(_impl_._oneof_case_[1]); +inline ExecutePipelineRequest::ConsistencySelectorCase ExecutePipelineRequest::consistency_selector_case() const { + return ExecutePipelineRequest::ConsistencySelectorCase(_impl_._oneof_case_[1]); } // ------------------------------------------------------------------- -// RunQueryResponse +// ExecutePipelineResponse -// bytes transaction = 2; -inline void RunQueryResponse::clear_transaction() { +// bytes transaction = 1; +inline void ExecutePipelineResponse::clear_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_.transaction_.ClearToEmpty(); } -inline const std::string& RunQueryResponse::transaction() const +inline const std::string& ExecutePipelineResponse::transaction() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.transaction) + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineResponse.transaction) return _internal_transaction(); } template -inline PROTOBUF_ALWAYS_INLINE void RunQueryResponse::set_transaction(Arg_&& arg, +inline PROTOBUF_ALWAYS_INLINE void ExecutePipelineResponse::set_transaction(Arg_&& arg, Args_... args) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; _impl_.transaction_.SetBytes(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryResponse.transaction) + // @@protoc_insertion_point(field_set:google.firestore.v1.ExecutePipelineResponse.transaction) } -inline std::string* RunQueryResponse::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { +inline std::string* ExecutePipelineResponse::mutable_transaction() ABSL_ATTRIBUTE_LIFETIME_BOUND { std::string* _s = _internal_mutable_transaction(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryResponse.transaction) + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineResponse.transaction) return _s; } -inline const std::string& RunQueryResponse::_internal_transaction() const { +inline const std::string& ExecutePipelineResponse::_internal_transaction() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); return _impl_.transaction_.Get(); } -inline void RunQueryResponse::_internal_set_transaction(const std::string& value) { +inline void ExecutePipelineResponse::_internal_set_transaction(const std::string& value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; _impl_.transaction_.Set(value, GetArena()); } -inline std::string* RunQueryResponse::_internal_mutable_transaction() { +inline std::string* ExecutePipelineResponse::_internal_mutable_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); ; return _impl_.transaction_.Mutable( GetArena()); } -inline std::string* RunQueryResponse::release_transaction() { +inline std::string* ExecutePipelineResponse::release_transaction() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryResponse.transaction) + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineResponse.transaction) return _impl_.transaction_.Release(); } -inline void RunQueryResponse::set_allocated_transaction(std::string* value) { +inline void ExecutePipelineResponse::set_allocated_transaction(std::string* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_.transaction_.SetAllocated(value, GetArena()); #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING @@ -10458,43 +11625,88 @@ inline void RunQueryResponse::set_allocated_transaction(std::string* value) { _impl_.transaction_.Set("", GetArena()); } #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryResponse.transaction) + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineResponse.transaction) } -// .google.firestore.v1.Document document = 1; -inline bool RunQueryResponse::has_document() const { +// repeated .google.firestore.v1.Document results = 2; +inline int ExecutePipelineResponse::_internal_results_size() const { + return _internal_results().size(); +} +inline int ExecutePipelineResponse::results_size() const { + return _internal_results_size(); +} +inline ::google::firestore::v1::Document* ExecutePipelineResponse::mutable_results(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineResponse.results) + return _internal_mutable_results()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>* ExecutePipelineResponse::mutable_results() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_list:google.firestore.v1.ExecutePipelineResponse.results) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _internal_mutable_results(); +} +inline const ::google::firestore::v1::Document& ExecutePipelineResponse::results(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineResponse.results) + return _internal_results().Get(index); +} +inline ::google::firestore::v1::Document* ExecutePipelineResponse::add_results() ABSL_ATTRIBUTE_LIFETIME_BOUND { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::google::firestore::v1::Document* _add = _internal_mutable_results()->Add(); + // @@protoc_insertion_point(field_add:google.firestore.v1.ExecutePipelineResponse.results) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>& ExecutePipelineResponse::results() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:google.firestore.v1.ExecutePipelineResponse.results) + return _internal_results(); +} +inline const ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>& +ExecutePipelineResponse::_internal_results() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.results_; +} +inline ::google::protobuf::RepeatedPtrField<::google::firestore::v1::Document>* +ExecutePipelineResponse::_internal_mutable_results() { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return &_impl_.results_; +} + +// .google.protobuf.Timestamp execution_time = 3; +inline bool ExecutePipelineResponse::has_execution_time() const { bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.document_ != nullptr); + PROTOBUF_ASSUME(!value || _impl_.execution_time_ != nullptr); return value; } -inline const ::google::firestore::v1::Document& RunQueryResponse::_internal_document() const { +inline const ::google::protobuf::Timestamp& ExecutePipelineResponse::_internal_execution_time() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::firestore::v1::Document* p = _impl_.document_; - return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Document_default_instance_); + const ::google::protobuf::Timestamp* p = _impl_.execution_time_; + return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Timestamp_default_instance_); } -inline const ::google::firestore::v1::Document& RunQueryResponse::document() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.document) - return _internal_document(); +inline const ::google::protobuf::Timestamp& ExecutePipelineResponse::execution_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineResponse.execution_time) + return _internal_execution_time(); } -inline void RunQueryResponse::unsafe_arena_set_allocated_document(::google::firestore::v1::Document* value) { +inline void ExecutePipelineResponse::unsafe_arena_set_allocated_execution_time(::google::protobuf::Timestamp* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.execution_time_); } - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); + _impl_.execution_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); if (value != nullptr) { _impl_._has_bits_[0] |= 0x00000001u; } else { _impl_._has_bits_[0] &= ~0x00000001u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryResponse.document) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.ExecutePipelineResponse.execution_time) } -inline ::google::firestore::v1::Document* RunQueryResponse::release_document() { +inline ::google::protobuf::Timestamp* ExecutePipelineResponse::release_execution_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Document* released = _impl_.document_; - _impl_.document_ = nullptr; + ::google::protobuf::Timestamp* released = _impl_.execution_time_; + _impl_.execution_time_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -10508,34 +11720,34 @@ inline ::google::firestore::v1::Document* RunQueryResponse::release_document() { #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::firestore::v1::Document* RunQueryResponse::unsafe_arena_release_document() { +inline ::google::protobuf::Timestamp* ExecutePipelineResponse::unsafe_arena_release_execution_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryResponse.document) + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineResponse.execution_time) _impl_._has_bits_[0] &= ~0x00000001u; - ::google::firestore::v1::Document* temp = _impl_.document_; - _impl_.document_ = nullptr; + ::google::protobuf::Timestamp* temp = _impl_.execution_time_; + _impl_.execution_time_ = nullptr; return temp; } -inline ::google::firestore::v1::Document* RunQueryResponse::_internal_mutable_document() { +inline ::google::protobuf::Timestamp* ExecutePipelineResponse::_internal_mutable_execution_time() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.document_ == nullptr) { - auto* p = CreateMaybeMessage<::google::firestore::v1::Document>(GetArena()); - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(p); + if (_impl_.execution_time_ == nullptr) { + auto* p = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); + _impl_.execution_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(p); } - return _impl_.document_; + return _impl_.execution_time_; } -inline ::google::firestore::v1::Document* RunQueryResponse::mutable_document() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::firestore::v1::Document* _msg = _internal_mutable_document(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryResponse.document) +inline ::google::protobuf::Timestamp* ExecutePipelineResponse::mutable_execution_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::Timestamp* _msg = _internal_mutable_execution_time(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineResponse.execution_time) return _msg; } -inline void RunQueryResponse::set_allocated_document(::google::firestore::v1::Document* value) { +inline void ExecutePipelineResponse::set_allocated_execution_time(::google::protobuf::Timestamp* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.document_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.execution_time_); } if (value != nullptr) { @@ -10548,44 +11760,44 @@ inline void RunQueryResponse::set_allocated_document(::google::firestore::v1::Do _impl_._has_bits_[0] &= ~0x00000001u; } - _impl_.document_ = reinterpret_cast<::google::firestore::v1::Document*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryResponse.document) + _impl_.execution_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineResponse.execution_time) } -// .google.protobuf.Timestamp read_time = 3; -inline bool RunQueryResponse::has_read_time() const { +// .google.firestore.v1.ExplainStats explain_stats = 4; +inline bool ExecutePipelineResponse::has_explain_stats() const { bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - PROTOBUF_ASSUME(!value || _impl_.read_time_ != nullptr); + PROTOBUF_ASSUME(!value || _impl_.explain_stats_ != nullptr); return value; } -inline const ::google::protobuf::Timestamp& RunQueryResponse::_internal_read_time() const { +inline const ::google::firestore::v1::ExplainStats& ExecutePipelineResponse::_internal_explain_stats() const { PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - const ::google::protobuf::Timestamp* p = _impl_.read_time_; - return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Timestamp_default_instance_); + const ::google::firestore::v1::ExplainStats* p = _impl_.explain_stats_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_ExplainStats_default_instance_); } -inline const ::google::protobuf::Timestamp& RunQueryResponse::read_time() const ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.read_time) - return _internal_read_time(); +inline const ::google::firestore::v1::ExplainStats& ExecutePipelineResponse::explain_stats() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.ExecutePipelineResponse.explain_stats) + return _internal_explain_stats(); } -inline void RunQueryResponse::unsafe_arena_set_allocated_read_time(::google::protobuf::Timestamp* value) { +inline void ExecutePipelineResponse::unsafe_arena_set_allocated_explain_stats(::google::firestore::v1::ExplainStats* value) { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (GetArena() == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.explain_stats_); } - _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); + _impl_.explain_stats_ = reinterpret_cast<::google::firestore::v1::ExplainStats*>(value); if (value != nullptr) { _impl_._has_bits_[0] |= 0x00000002u; } else { _impl_._has_bits_[0] &= ~0x00000002u; } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.RunQueryResponse.read_time) + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.ExecutePipelineResponse.explain_stats) } -inline ::google::protobuf::Timestamp* RunQueryResponse::release_read_time() { +inline ::google::firestore::v1::ExplainStats* ExecutePipelineResponse::release_explain_stats() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] &= ~0x00000002u; - ::google::protobuf::Timestamp* released = _impl_.read_time_; - _impl_.read_time_ = nullptr; + ::google::firestore::v1::ExplainStats* released = _impl_.explain_stats_; + _impl_.explain_stats_ = nullptr; #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); @@ -10599,34 +11811,34 @@ inline ::google::protobuf::Timestamp* RunQueryResponse::release_read_time() { #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } -inline ::google::protobuf::Timestamp* RunQueryResponse::unsafe_arena_release_read_time() { +inline ::google::firestore::v1::ExplainStats* ExecutePipelineResponse::unsafe_arena_release_explain_stats() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - // @@protoc_insertion_point(field_release:google.firestore.v1.RunQueryResponse.read_time) + // @@protoc_insertion_point(field_release:google.firestore.v1.ExecutePipelineResponse.explain_stats) _impl_._has_bits_[0] &= ~0x00000002u; - ::google::protobuf::Timestamp* temp = _impl_.read_time_; - _impl_.read_time_ = nullptr; + ::google::firestore::v1::ExplainStats* temp = _impl_.explain_stats_; + _impl_.explain_stats_ = nullptr; return temp; } -inline ::google::protobuf::Timestamp* RunQueryResponse::_internal_mutable_read_time() { +inline ::google::firestore::v1::ExplainStats* ExecutePipelineResponse::_internal_mutable_explain_stats() { PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); _impl_._has_bits_[0] |= 0x00000002u; - if (_impl_.read_time_ == nullptr) { - auto* p = CreateMaybeMessage<::google::protobuf::Timestamp>(GetArena()); - _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(p); + if (_impl_.explain_stats_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::ExplainStats>(GetArena()); + _impl_.explain_stats_ = reinterpret_cast<::google::firestore::v1::ExplainStats*>(p); } - return _impl_.read_time_; + return _impl_.explain_stats_; } -inline ::google::protobuf::Timestamp* RunQueryResponse::mutable_read_time() ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::google::protobuf::Timestamp* _msg = _internal_mutable_read_time(); - // @@protoc_insertion_point(field_mutable:google.firestore.v1.RunQueryResponse.read_time) +inline ::google::firestore::v1::ExplainStats* ExecutePipelineResponse::mutable_explain_stats() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::ExplainStats* _msg = _internal_mutable_explain_stats(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.ExecutePipelineResponse.explain_stats) return _msg; } -inline void RunQueryResponse::set_allocated_read_time(::google::protobuf::Timestamp* value) { +inline void ExecutePipelineResponse::set_allocated_explain_stats(::google::firestore::v1::ExplainStats* value) { ::google::protobuf::Arena* message_arena = GetArena(); PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); if (message_arena == nullptr) { - delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.read_time_); + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.explain_stats_); } if (value != nullptr) { @@ -10639,31 +11851,8 @@ inline void RunQueryResponse::set_allocated_read_time(::google::protobuf::Timest _impl_._has_bits_[0] &= ~0x00000002u; } - _impl_.read_time_ = reinterpret_cast<::google::protobuf::Timestamp*>(value); - // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.RunQueryResponse.read_time) -} - -// int32 skipped_results = 4; -inline void RunQueryResponse::clear_skipped_results() { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - _impl_.skipped_results_ = 0; -} -inline ::int32_t RunQueryResponse::skipped_results() const { - // @@protoc_insertion_point(field_get:google.firestore.v1.RunQueryResponse.skipped_results) - return _internal_skipped_results(); -} -inline void RunQueryResponse::set_skipped_results(::int32_t value) { - _internal_set_skipped_results(value); - // @@protoc_insertion_point(field_set:google.firestore.v1.RunQueryResponse.skipped_results) -} -inline ::int32_t RunQueryResponse::_internal_skipped_results() const { - PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); - return _impl_.skipped_results_; -} -inline void RunQueryResponse::_internal_set_skipped_results(::int32_t value) { - PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); - ; - _impl_.skipped_results_ = value; + _impl_.explain_stats_ = reinterpret_cast<::google::firestore::v1::ExplainStats*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.ExecutePipelineResponse.explain_stats) } // ------------------------------------------------------------------- diff --git a/Firestore/Protos/cpp/google/firestore/v1/pipeline.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/pipeline.pb.cc new file mode 100644 index 00000000000..db718366205 --- /dev/null +++ b/Firestore/Protos/cpp/google/firestore/v1/pipeline.pb.cc @@ -0,0 +1,466 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/firestore/v1/pipeline.proto + +#include "google/firestore/v1/pipeline.pb.h" + +#include +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/extension_set.h" +#include "google/protobuf/wire_format_lite.h" +#include "google/protobuf/descriptor.h" +#include "google/protobuf/generated_message_reflection.h" +#include "google/protobuf/reflection_ops.h" +#include "google/protobuf/wire_format.h" +#include "google/protobuf/generated_message_tctable_impl.h" +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" +PROTOBUF_PRAGMA_INIT_SEG +namespace _pb = ::google::protobuf; +namespace _pbi = ::google::protobuf::internal; +namespace _fl = ::google::protobuf::internal::field_layout; +namespace google { +namespace firestore { +namespace v1 { + template +PROTOBUF_CONSTEXPR StructuredPipeline_OptionsEntry_DoNotUse::StructuredPipeline_OptionsEntry_DoNotUse(::_pbi::ConstantInitialized) {} +struct StructuredPipeline_OptionsEntry_DoNotUseDefaultTypeInternal { + PROTOBUF_CONSTEXPR StructuredPipeline_OptionsEntry_DoNotUseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~StructuredPipeline_OptionsEntry_DoNotUseDefaultTypeInternal() {} + union { + StructuredPipeline_OptionsEntry_DoNotUse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 StructuredPipeline_OptionsEntry_DoNotUseDefaultTypeInternal _StructuredPipeline_OptionsEntry_DoNotUse_default_instance_; + +inline constexpr StructuredPipeline::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + options_{}, + pipeline_{nullptr} {} + +template +PROTOBUF_CONSTEXPR StructuredPipeline::StructuredPipeline(::_pbi::ConstantInitialized) + : _impl_(::_pbi::ConstantInitialized()) {} +struct StructuredPipelineDefaultTypeInternal { + PROTOBUF_CONSTEXPR StructuredPipelineDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~StructuredPipelineDefaultTypeInternal() {} + union { + StructuredPipeline _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 StructuredPipelineDefaultTypeInternal _StructuredPipeline_default_instance_; +} // namespace v1 +} // namespace firestore +} // namespace google +static ::_pb::Metadata file_level_metadata_google_2ffirestore_2fv1_2fpipeline_2eproto[2]; +static constexpr const ::_pb::EnumDescriptor** + file_level_enum_descriptors_google_2ffirestore_2fv1_2fpipeline_2eproto = nullptr; +static constexpr const ::_pb::ServiceDescriptor** + file_level_service_descriptors_google_2ffirestore_2fv1_2fpipeline_2eproto = nullptr; +const ::uint32_t TableStruct_google_2ffirestore_2fv1_2fpipeline_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE( + protodesc_cold) = { + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline_OptionsEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline_OptionsEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline_OptionsEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline_OptionsEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline, _impl_._has_bits_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline, _impl_.pipeline_), + PROTOBUF_FIELD_OFFSET(::google::firestore::v1::StructuredPipeline, _impl_.options_), + 0, + ~0u, +}; + +static const ::_pbi::MigrationSchema + schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + {0, 10, -1, sizeof(::google::firestore::v1::StructuredPipeline_OptionsEntry_DoNotUse)}, + {12, 22, -1, sizeof(::google::firestore::v1::StructuredPipeline)}, +}; + +static const ::_pb::Message* const file_default_instances[] = { + &::google::firestore::v1::_StructuredPipeline_OptionsEntry_DoNotUse_default_instance_._instance, + &::google::firestore::v1::_StructuredPipeline_default_instance_._instance, +}; +const char descriptor_table_protodef_google_2ffirestore_2fv1_2fpipeline_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + "\n\"google/firestore/v1/pipeline.proto\022\023go" + "ogle.firestore.v1\032\037google/api/field_beha" + "vior.proto\032\"google/firestore/v1/document" + ".proto\"\342\001\n\022StructuredPipeline\0224\n\010pipelin" + "e\030\001 \001(\0132\035.google.firestore.v1.PipelineB\003" + "\340A\002\022J\n\007options\030\002 \003(\01324.google.firestore." + "v1.StructuredPipeline.OptionsEntryB\003\340A\001\032" + "J\n\014OptionsEntry\022\013\n\003key\030\001 \001(\t\022)\n\005value\030\002 " + "\001(\0132\032.google.firestore.v1.Value:\0028\001B\305\001\n\027" + "com.google.firestore.v1B\rPipelineProtoP\001" + "Z;cloud.google.com/go/firestore/apiv1/fi" + "restorepb;firestorepb\242\002\004GCFS\252\002\031Google.Cl" + "oud.Firestore.V1\312\002\031Google\\Cloud\\Firestor" + "e\\V1\352\002\034Google::Cloud::Firestore::V1b\006pro" + "to3" +}; +static const ::_pbi::DescriptorTable* const descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_deps[2] = + { + &::descriptor_table_google_2fapi_2ffield_5fbehavior_2eproto, + &::descriptor_table_google_2ffirestore_2fv1_2fdocument_2eproto, +}; +static ::absl::once_flag descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_once; +const ::_pbi::DescriptorTable descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto = { + false, + false, + 563, + descriptor_table_protodef_google_2ffirestore_2fv1_2fpipeline_2eproto, + "google/firestore/v1/pipeline.proto", + &descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_once, + descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_deps, + 2, + 2, + schemas, + file_default_instances, + TableStruct_google_2ffirestore_2fv1_2fpipeline_2eproto::offsets, + file_level_metadata_google_2ffirestore_2fv1_2fpipeline_2eproto, + file_level_enum_descriptors_google_2ffirestore_2fv1_2fpipeline_2eproto, + file_level_service_descriptors_google_2ffirestore_2fv1_2fpipeline_2eproto, +}; + +// This function exists to be marked as weak. +// It can significantly speed up compilation by breaking up LLVM's SCC +// in the .pb.cc translation units. Large translation units see a +// reduction of more than 35% of walltime for optimized builds. Without +// the weak attribute all the messages in the file, including all the +// vtables and everything they use become part of the same SCC through +// a cycle like: +// GetMetadata -> descriptor table -> default instances -> +// vtables -> GetMetadata +// By adding a weak function here we break the connection from the +// individual vtables back into the descriptor table. +PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_getter() { + return &descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto; +} +// Force running AddDescriptors() at dynamic initialization time. +PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 +static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2ffirestore_2fv1_2fpipeline_2eproto(&descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto); +namespace google { +namespace firestore { +namespace v1 { +// =================================================================== + +StructuredPipeline_OptionsEntry_DoNotUse::StructuredPipeline_OptionsEntry_DoNotUse() {} +StructuredPipeline_OptionsEntry_DoNotUse::StructuredPipeline_OptionsEntry_DoNotUse(::google::protobuf::Arena* arena) + : SuperType(arena) {} +::google::protobuf::Metadata StructuredPipeline_OptionsEntry_DoNotUse::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fpipeline_2eproto[0]); +} +// =================================================================== + +class StructuredPipeline::_Internal { + public: + using HasBits = decltype(std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(StructuredPipeline, _impl_._has_bits_); + static const ::google::firestore::v1::Pipeline& pipeline(const StructuredPipeline* msg); + static void set_has_pipeline(HasBits* has_bits) { + (*has_bits)[0] |= 1u; + } +}; + +const ::google::firestore::v1::Pipeline& StructuredPipeline::_Internal::pipeline(const StructuredPipeline* msg) { + return *msg->_impl_.pipeline_; +} +void StructuredPipeline::clear_pipeline() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (_impl_.pipeline_ != nullptr) _impl_.pipeline_->Clear(); + _impl_._has_bits_[0] &= ~0x00000001u; +} +void StructuredPipeline::clear_options() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_.options_.Clear(); +} +StructuredPipeline::StructuredPipeline(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:google.firestore.v1.StructuredPipeline) +} +inline PROTOBUF_NDEBUG_INLINE StructuredPipeline::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena, + const Impl_& from) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + options_{visibility, arena, from.options_} {} + +StructuredPipeline::StructuredPipeline( + ::google::protobuf::Arena* arena, + const StructuredPipeline& from) + : ::google::protobuf::Message(arena) { + StructuredPipeline* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.pipeline_ = (cached_has_bits & 0x00000001u) + ? CreateMaybeMessage<::google::firestore::v1::Pipeline>(arena, *from._impl_.pipeline_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:google.firestore.v1.StructuredPipeline) +} +inline PROTOBUF_NDEBUG_INLINE StructuredPipeline::Impl_::Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena) + : _cached_size_{0}, + options_{visibility, arena} {} + +inline void StructuredPipeline::SharedCtor(::_pb::Arena* arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.pipeline_ = {}; +} +StructuredPipeline::~StructuredPipeline() { + // @@protoc_insertion_point(destructor:google.firestore.v1.StructuredPipeline) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void StructuredPipeline::SharedDtor() { + ABSL_DCHECK(GetArena() == nullptr); + delete _impl_.pipeline_; + _impl_.~Impl_(); +} + +PROTOBUF_NOINLINE void StructuredPipeline::Clear() { +// @@protoc_insertion_point(message_clear_start:google.firestore.v1.StructuredPipeline) + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.options_.Clear(); + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000001u) { + ABSL_DCHECK(_impl_.pipeline_ != nullptr); + _impl_.pipeline_->Clear(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* StructuredPipeline::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 2, 3, 54, 2> StructuredPipeline::_table_ = { + { + PROTOBUF_FIELD_OFFSET(StructuredPipeline, _impl_._has_bits_), + 0, // no _extensions_ + 2, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_StructuredPipeline_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // .google.firestore.v1.Pipeline pipeline = 1 [(.google.api.field_behavior) = REQUIRED]; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, PROTOBUF_FIELD_OFFSET(StructuredPipeline, _impl_.pipeline_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .google.firestore.v1.Pipeline pipeline = 1 [(.google.api.field_behavior) = REQUIRED]; + {PROTOBUF_FIELD_OFFSET(StructuredPipeline, _impl_.pipeline_), _Internal::kHasBitsOffset + 0, 0, + (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // map options = 2 [(.google.api.field_behavior) = OPTIONAL]; + {PROTOBUF_FIELD_OFFSET(StructuredPipeline, _impl_.options_), -1, 1, + (0 | ::_fl::kFcRepeated | ::_fl::kMap)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::firestore::v1::Pipeline>()}, + {::_pbi::TcParser::GetMapAuxInfo< + decltype(StructuredPipeline()._impl_.options_)>( + 1, 0, 0, 9, + 11)}, + {::_pbi::TcParser::CreateInArenaStorageCb<::google::firestore::v1::Value>}, + }}, {{ + "\46\0\7\0\0\0\0\0" + "google.firestore.v1.StructuredPipeline" + "options" + }}, +}; + +::uint8_t* StructuredPipeline::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:google.firestore.v1.StructuredPipeline) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + // .google.firestore.v1.Pipeline pipeline = 1 [(.google.api.field_behavior) = REQUIRED]; + if (cached_has_bits & 0x00000001u) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, _Internal::pipeline(this), + _Internal::pipeline(this).GetCachedSize(), target, stream); + } + + // map options = 2 [(.google.api.field_behavior) = OPTIONAL]; + if (!_internal_options().empty()) { + using MapType = ::google::protobuf::Map; + using WireHelper = _pbi::MapEntryFuncs; + const auto& field = _internal_options(); + + if (stream->IsSerializationDeterministic() && field.size() > 1) { + for (const auto& entry : ::google::protobuf::internal::MapSorterPtr(field)) { + target = WireHelper::InternalSerialize( + 2, entry.first, entry.second, target, stream); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + entry.first.data(), static_cast(entry.first.length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.StructuredPipeline.options"); + } + } else { + for (const auto& entry : field) { + target = WireHelper::InternalSerialize( + 2, entry.first, entry.second, target, stream); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + entry.first.data(), static_cast(entry.first.length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.firestore.v1.StructuredPipeline.options"); + } + } + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:google.firestore.v1.StructuredPipeline) + return target; +} + +::size_t StructuredPipeline::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:google.firestore.v1.StructuredPipeline) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // map options = 2 [(.google.api.field_behavior) = OPTIONAL]; + total_size += 1 * ::google::protobuf::internal::FromIntSize(_internal_options_size()); + for (const auto& entry : _internal_options()) { + total_size += _pbi::MapEntryFuncs::ByteSizeLong(entry.first, entry.second); + } + // .google.firestore.v1.Pipeline pipeline = 1 [(.google.api.field_behavior) = REQUIRED]; + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000001u) { + total_size += + 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.pipeline_); + } + + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData StructuredPipeline::_class_data_ = { + StructuredPipeline::MergeImpl, + nullptr, // OnDemandRegisterArenaDtor +}; +const ::google::protobuf::Message::ClassData* StructuredPipeline::GetClassData() const { + return &_class_data_; +} + +void StructuredPipeline::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:google.firestore.v1.StructuredPipeline) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + _this->_impl_.options_.MergeFrom(from._impl_.options_); + if ((from._impl_._has_bits_[0] & 0x00000001u) != 0) { + _this->_internal_mutable_pipeline()->::google::firestore::v1::Pipeline::MergeFrom( + from._internal_pipeline()); + } + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void StructuredPipeline::CopyFrom(const StructuredPipeline& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:google.firestore.v1.StructuredPipeline) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool StructuredPipeline::IsInitialized() const { + return true; +} + +::_pbi::CachedSize* StructuredPipeline::AccessCachedSize() const { + return &_impl_._cached_size_; +} +void StructuredPipeline::InternalSwap(StructuredPipeline* PROTOBUF_RESTRICT other) { + using std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.options_.InternalSwap(&other->_impl_.options_); + swap(_impl_.pipeline_, other->_impl_.pipeline_); +} + +::google::protobuf::Metadata StructuredPipeline::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_getter, &descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto_once, + file_level_metadata_google_2ffirestore_2fv1_2fpipeline_2eproto[1]); +} +// @@protoc_insertion_point(namespace_scope) +} // namespace v1 +} // namespace firestore +} // namespace google +namespace google { +namespace protobuf { +} // namespace protobuf +} // namespace google +// @@protoc_insertion_point(global_scope) +#include "google/protobuf/port_undef.inc" diff --git a/Firestore/Protos/cpp/google/firestore/v1/pipeline.pb.h b/Firestore/Protos/cpp/google/firestore/v1/pipeline.pb.h new file mode 100644 index 00000000000..1487e6b1629 --- /dev/null +++ b/Firestore/Protos/cpp/google/firestore/v1/pipeline.pb.h @@ -0,0 +1,480 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/firestore/v1/pipeline.proto +// Protobuf C++ Version: 4.25.1 + +#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2ffirestore_2fv1_2fpipeline_2eproto_2epb_2eh +#define GOOGLE_PROTOBUF_INCLUDED_google_2ffirestore_2fv1_2fpipeline_2eproto_2epb_2eh + +#include +#include +#include +#include + +#include "google/protobuf/port_def.inc" +#if PROTOBUF_VERSION < 4025000 +#error "This file was generated by a newer version of protoc which is" +#error "incompatible with your Protocol Buffer headers. Please update" +#error "your headers." +#endif // PROTOBUF_VERSION + +#if 4025001 < PROTOBUF_MIN_PROTOC_VERSION +#error "This file was generated by an older version of protoc which is" +#error "incompatible with your Protocol Buffer headers. Please" +#error "regenerate this file with a newer version of protoc." +#endif // PROTOBUF_MIN_PROTOC_VERSION +#include "google/protobuf/port_undef.inc" +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/arena.h" +#include "google/protobuf/arenastring.h" +#include "google/protobuf/generated_message_tctable_decl.h" +#include "google/protobuf/generated_message_util.h" +#include "google/protobuf/metadata_lite.h" +#include "google/protobuf/generated_message_reflection.h" +#include "google/protobuf/message.h" +#include "google/protobuf/repeated_field.h" // IWYU pragma: export +#include "google/protobuf/extension_set.h" // IWYU pragma: export +#include "google/protobuf/map.h" // IWYU pragma: export +#include "google/protobuf/map_entry.h" +#include "google/protobuf/map_field_inl.h" +#include "google/protobuf/unknown_field_set.h" +#include "google/api/field_behavior.pb.h" +#include "google/firestore/v1/document.pb.h" +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" + +#define PROTOBUF_INTERNAL_EXPORT_google_2ffirestore_2fv1_2fpipeline_2eproto + +namespace google { +namespace protobuf { +namespace internal { +class AnyMetadata; +} // namespace internal +} // namespace protobuf +} // namespace google + +// Internal implementation detail -- do not use these members. +struct TableStruct_google_2ffirestore_2fv1_2fpipeline_2eproto { + static const ::uint32_t offsets[]; +}; +extern const ::google::protobuf::internal::DescriptorTable + descriptor_table_google_2ffirestore_2fv1_2fpipeline_2eproto; +namespace google { +namespace firestore { +namespace v1 { +class StructuredPipeline; +struct StructuredPipelineDefaultTypeInternal; +extern StructuredPipelineDefaultTypeInternal _StructuredPipeline_default_instance_; +class StructuredPipeline_OptionsEntry_DoNotUse; +struct StructuredPipeline_OptionsEntry_DoNotUseDefaultTypeInternal; +extern StructuredPipeline_OptionsEntry_DoNotUseDefaultTypeInternal _StructuredPipeline_OptionsEntry_DoNotUse_default_instance_; +} // namespace v1 +} // namespace firestore +namespace protobuf { +} // namespace protobuf +} // namespace google + +namespace google { +namespace firestore { +namespace v1 { + +// =================================================================== + + +// ------------------------------------------------------------------- + +class StructuredPipeline_OptionsEntry_DoNotUse final + : public ::google::protobuf::internal::MapEntry< + StructuredPipeline_OptionsEntry_DoNotUse, std::string, ::google::firestore::v1::Value, + ::google::protobuf::internal::WireFormatLite::TYPE_STRING, + ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE> { + public: + using SuperType = ::google::protobuf::internal::MapEntry< + StructuredPipeline_OptionsEntry_DoNotUse, std::string, ::google::firestore::v1::Value, + ::google::protobuf::internal::WireFormatLite::TYPE_STRING, + ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE>; + StructuredPipeline_OptionsEntry_DoNotUse(); + template + explicit PROTOBUF_CONSTEXPR StructuredPipeline_OptionsEntry_DoNotUse( + ::google::protobuf::internal::ConstantInitialized); + explicit StructuredPipeline_OptionsEntry_DoNotUse(::google::protobuf::Arena* arena); + static const StructuredPipeline_OptionsEntry_DoNotUse* internal_default_instance() { + return reinterpret_cast( + &_StructuredPipeline_OptionsEntry_DoNotUse_default_instance_); + } + static bool ValidateKey(std::string* s) { + return ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast(s->size()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.firestore.v1.StructuredPipeline.OptionsEntry.key"); + } + static bool ValidateValue(void*) { return true; } + ::google::protobuf::Metadata GetMetadata() const final; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fpipeline_2eproto; +}; +// ------------------------------------------------------------------- + +class StructuredPipeline final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.firestore.v1.StructuredPipeline) */ { + public: + inline StructuredPipeline() : StructuredPipeline(nullptr) {} + ~StructuredPipeline() override; + template + explicit PROTOBUF_CONSTEXPR StructuredPipeline(::google::protobuf::internal::ConstantInitialized); + + inline StructuredPipeline(const StructuredPipeline& from) + : StructuredPipeline(nullptr, from) {} + StructuredPipeline(StructuredPipeline&& from) noexcept + : StructuredPipeline() { + *this = ::std::move(from); + } + + inline StructuredPipeline& operator=(const StructuredPipeline& from) { + CopyFrom(from); + return *this; + } + inline StructuredPipeline& operator=(StructuredPipeline&& from) noexcept { + if (this == &from) return *this; + if (GetArena() == from.GetArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const StructuredPipeline& default_instance() { + return *internal_default_instance(); + } + static inline const StructuredPipeline* internal_default_instance() { + return reinterpret_cast( + &_StructuredPipeline_default_instance_); + } + static constexpr int kIndexInFileMessages = + 1; + + friend void swap(StructuredPipeline& a, StructuredPipeline& b) { + a.Swap(&b); + } + inline void Swap(StructuredPipeline* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() != nullptr && + GetArena() == other->GetArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetArena() == other->GetArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(StructuredPipeline* other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + StructuredPipeline* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const StructuredPipeline& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const StructuredPipeline& from) { + StructuredPipeline::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + ::google::protobuf::internal::CachedSize* AccessCachedSize() const final; + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void InternalSwap(StructuredPipeline* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "google.firestore.v1.StructuredPipeline"; + } + protected: + explicit StructuredPipeline(::google::protobuf::Arena* arena); + StructuredPipeline(::google::protobuf::Arena* arena, const StructuredPipeline& from); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + + // accessors ------------------------------------------------------- + + enum : int { + kOptionsFieldNumber = 2, + kPipelineFieldNumber = 1, + }; + // map options = 2 [(.google.api.field_behavior) = OPTIONAL]; + int options_size() const; + private: + int _internal_options_size() const; + + public: + void clear_options() ; + const ::google::protobuf::Map& options() const; + ::google::protobuf::Map* mutable_options(); + + private: + const ::google::protobuf::Map& _internal_options() const; + ::google::protobuf::Map* _internal_mutable_options(); + + public: + // .google.firestore.v1.Pipeline pipeline = 1 [(.google.api.field_behavior) = REQUIRED]; + bool has_pipeline() const; + void clear_pipeline() ; + const ::google::firestore::v1::Pipeline& pipeline() const; + PROTOBUF_NODISCARD ::google::firestore::v1::Pipeline* release_pipeline(); + ::google::firestore::v1::Pipeline* mutable_pipeline(); + void set_allocated_pipeline(::google::firestore::v1::Pipeline* value); + void unsafe_arena_set_allocated_pipeline(::google::firestore::v1::Pipeline* value); + ::google::firestore::v1::Pipeline* unsafe_arena_release_pipeline(); + + private: + const ::google::firestore::v1::Pipeline& _internal_pipeline() const; + ::google::firestore::v1::Pipeline* _internal_mutable_pipeline(); + + public: + // @@protoc_insertion_point(class_scope:google.firestore.v1.StructuredPipeline) + private: + class _Internal; + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable< + 0, 2, 3, + 54, 2> + _table_; + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + + inline explicit constexpr Impl_( + ::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena); + inline explicit Impl_(::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* arena, const Impl_& from); + ::google::protobuf::internal::HasBits<1> _has_bits_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::MapField + options_; + ::google::firestore::v1::Pipeline* pipeline_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_google_2ffirestore_2fv1_2fpipeline_2eproto; +}; + +// =================================================================== + + + + +// =================================================================== + + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// StructuredPipeline + +// .google.firestore.v1.Pipeline pipeline = 1 [(.google.api.field_behavior) = REQUIRED]; +inline bool StructuredPipeline::has_pipeline() const { + bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; + PROTOBUF_ASSUME(!value || _impl_.pipeline_ != nullptr); + return value; +} +inline const ::google::firestore::v1::Pipeline& StructuredPipeline::_internal_pipeline() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + const ::google::firestore::v1::Pipeline* p = _impl_.pipeline_; + return p != nullptr ? *p : reinterpret_cast(::google::firestore::v1::_Pipeline_default_instance_); +} +inline const ::google::firestore::v1::Pipeline& StructuredPipeline::pipeline() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:google.firestore.v1.StructuredPipeline.pipeline) + return _internal_pipeline(); +} +inline void StructuredPipeline::unsafe_arena_set_allocated_pipeline(::google::firestore::v1::Pipeline* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.pipeline_); + } + _impl_.pipeline_ = reinterpret_cast<::google::firestore::v1::Pipeline*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.firestore.v1.StructuredPipeline.pipeline) +} +inline ::google::firestore::v1::Pipeline* StructuredPipeline::release_pipeline() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Pipeline* released = _impl_.pipeline_; + _impl_.pipeline_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; +} +inline ::google::firestore::v1::Pipeline* StructuredPipeline::unsafe_arena_release_pipeline() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:google.firestore.v1.StructuredPipeline.pipeline) + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::firestore::v1::Pipeline* temp = _impl_.pipeline_; + _impl_.pipeline_ = nullptr; + return temp; +} +inline ::google::firestore::v1::Pipeline* StructuredPipeline::_internal_mutable_pipeline() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_._has_bits_[0] |= 0x00000001u; + if (_impl_.pipeline_ == nullptr) { + auto* p = CreateMaybeMessage<::google::firestore::v1::Pipeline>(GetArena()); + _impl_.pipeline_ = reinterpret_cast<::google::firestore::v1::Pipeline*>(p); + } + return _impl_.pipeline_; +} +inline ::google::firestore::v1::Pipeline* StructuredPipeline::mutable_pipeline() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::firestore::v1::Pipeline* _msg = _internal_mutable_pipeline(); + // @@protoc_insertion_point(field_mutable:google.firestore.v1.StructuredPipeline.pipeline) + return _msg; +} +inline void StructuredPipeline::set_allocated_pipeline(::google::firestore::v1::Pipeline* value) { + ::google::protobuf::Arena* message_arena = GetArena(); + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.pipeline_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = reinterpret_cast<::google::protobuf::MessageLite*>(value)->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + + _impl_.pipeline_ = reinterpret_cast<::google::firestore::v1::Pipeline*>(value); + // @@protoc_insertion_point(field_set_allocated:google.firestore.v1.StructuredPipeline.pipeline) +} + +// map options = 2 [(.google.api.field_behavior) = OPTIONAL]; +inline int StructuredPipeline::_internal_options_size() const { + return _internal_options().size(); +} +inline int StructuredPipeline::options_size() const { + return _internal_options_size(); +} +inline const ::google::protobuf::Map& StructuredPipeline::_internal_options() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return _impl_.options_.GetMap(); +} +inline const ::google::protobuf::Map& StructuredPipeline::options() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_map:google.firestore.v1.StructuredPipeline.options) + return _internal_options(); +} +inline ::google::protobuf::Map* StructuredPipeline::_internal_mutable_options() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + return _impl_.options_.MutableMap(); +} +inline ::google::protobuf::Map* StructuredPipeline::mutable_options() ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable_map:google.firestore.v1.StructuredPipeline.options) + return _internal_mutable_options(); +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif // __GNUC__ + +// @@protoc_insertion_point(namespace_scope) +} // namespace v1 +} // namespace firestore +} // namespace google + + +// @@protoc_insertion_point(global_scope) + +#include "google/protobuf/port_undef.inc" + +#endif // GOOGLE_PROTOBUF_INCLUDED_google_2ffirestore_2fv1_2fpipeline_2eproto_2epb_2eh diff --git a/Firestore/Protos/cpp/google/firestore/v1/query.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/query.pb.cc index 7ad9fec1f02..af917d57906 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/query.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/v1/query.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/query.pb.h b/Firestore/Protos/cpp/google/firestore/v1/query.pb.h index 205f9bea8a0..52bdd1d4641 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/query.pb.h +++ b/Firestore/Protos/cpp/google/firestore/v1/query.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/write.pb.cc b/Firestore/Protos/cpp/google/firestore/v1/write.pb.cc index b1e26f29a16..51916110a2e 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/write.pb.cc +++ b/Firestore/Protos/cpp/google/firestore/v1/write.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/firestore/v1/write.pb.h b/Firestore/Protos/cpp/google/firestore/v1/write.pb.h index 46fd9394542..2bc4a3b3cf3 100644 --- a/Firestore/Protos/cpp/google/firestore/v1/write.pb.h +++ b/Firestore/Protos/cpp/google/firestore/v1/write.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/rpc/status.pb.cc b/Firestore/Protos/cpp/google/rpc/status.pb.cc index e053fa12c18..b6cfa669f6f 100644 --- a/Firestore/Protos/cpp/google/rpc/status.pb.cc +++ b/Firestore/Protos/cpp/google/rpc/status.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/rpc/status.pb.h b/Firestore/Protos/cpp/google/rpc/status.pb.h index fdadd942ac4..d3b966147b6 100644 --- a/Firestore/Protos/cpp/google/rpc/status.pb.h +++ b/Firestore/Protos/cpp/google/rpc/status.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/type/latlng.pb.cc b/Firestore/Protos/cpp/google/type/latlng.pb.cc index 5303b0891a2..b9efd72a5af 100644 --- a/Firestore/Protos/cpp/google/type/latlng.pb.cc +++ b/Firestore/Protos/cpp/google/type/latlng.pb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/cpp/google/type/latlng.pb.h b/Firestore/Protos/cpp/google/type/latlng.pb.h index 0f889988d23..6fd0da83cf0 100644 --- a/Firestore/Protos/cpp/google/type/latlng.pb.h +++ b/Firestore/Protos/cpp/google/type/latlng.pb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/bundle.nanopb.cc b/Firestore/Protos/nanopb/firestore/bundle.nanopb.cc index 6e15969980e..f470145f1ad 100644 --- a/Firestore/Protos/nanopb/firestore/bundle.nanopb.cc +++ b/Firestore/Protos/nanopb/firestore/bundle.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/bundle.nanopb.h b/Firestore/Protos/nanopb/firestore/bundle.nanopb.h index 872ea118504..bb312068857 100644 --- a/Firestore/Protos/nanopb/firestore/bundle.nanopb.h +++ b/Firestore/Protos/nanopb/firestore/bundle.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.cc b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.cc index 2f906d9f95d..f145a4a81b8 100644 --- a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.cc +++ b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h index 53762bb101f..a6373161785 100644 --- a/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h +++ b/Firestore/Protos/nanopb/firestore/local/maybe_document.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.cc b/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.cc index 1a06d56941d..55f9a23489e 100644 --- a/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.cc +++ b/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.h b/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.h index 28430465212..b316ea582b9 100644 --- a/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.h +++ b/Firestore/Protos/nanopb/firestore/local/mutation.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/local/target.nanopb.cc b/Firestore/Protos/nanopb/firestore/local/target.nanopb.cc index cd73d9344f7..7d0d51ab579 100644 --- a/Firestore/Protos/nanopb/firestore/local/target.nanopb.cc +++ b/Firestore/Protos/nanopb/firestore/local/target.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/firestore/local/target.nanopb.h b/Firestore/Protos/nanopb/firestore/local/target.nanopb.h index 7dedb4d91eb..34f926f3ea0 100644 --- a/Firestore/Protos/nanopb/firestore/local/target.nanopb.h +++ b/Firestore/Protos/nanopb/firestore/local/target.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/api/annotations.nanopb.cc b/Firestore/Protos/nanopb/google/api/annotations.nanopb.cc index b755cad4926..c0bc8de7cdf 100644 --- a/Firestore/Protos/nanopb/google/api/annotations.nanopb.cc +++ b/Firestore/Protos/nanopb/google/api/annotations.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/api/annotations.nanopb.h b/Firestore/Protos/nanopb/google/api/annotations.nanopb.h index 4ddc9010007..46f6d833985 100644 --- a/Firestore/Protos/nanopb/google/api/annotations.nanopb.h +++ b/Firestore/Protos/nanopb/google/api/annotations.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/api/field_behavior.nanopb.cc b/Firestore/Protos/nanopb/google/api/field_behavior.nanopb.cc new file mode 100644 index 00000000000..38e3aa6a29b --- /dev/null +++ b/Firestore/Protos/nanopb/google/api/field_behavior.nanopb.cc @@ -0,0 +1,77 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.8 */ + +#include "field_behavior.nanopb.h" + +#include "Firestore/core/src/nanopb/pretty_printing.h" + +namespace firebase { +namespace firestore { + +using nanopb::PrintEnumField; +using nanopb::PrintHeader; +using nanopb::PrintMessageField; +using nanopb::PrintPrimitiveField; +using nanopb::PrintTail; + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + + + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +#error Field descriptor for google_api_field_behavior_struct.field_behavior is too large. Define PB_FIELD_16BIT to fix this. +#endif + + +const char* EnumToString( + google_api_FieldBehavior value) { + switch (value) { + case google_api_FieldBehavior_FIELD_BEHAVIOR_UNSPECIFIED: + return "FIELD_BEHAVIOR_UNSPECIFIED"; + case google_api_FieldBehavior_OPTIONAL: + return "OPTIONAL"; + case google_api_FieldBehavior_REQUIRED: + return "REQUIRED"; + case google_api_FieldBehavior_OUTPUT_ONLY: + return "OUTPUT_ONLY"; + case google_api_FieldBehavior_INPUT_ONLY: + return "INPUT_ONLY"; + case google_api_FieldBehavior_IMMUTABLE: + return "IMMUTABLE"; + case google_api_FieldBehavior_UNORDERED_LIST: + return "UNORDERED_LIST"; + case google_api_FieldBehavior_NON_EMPTY_DEFAULT: + return "NON_EMPTY_DEFAULT"; + case google_api_FieldBehavior_IDENTIFIER: + return "IDENTIFIER"; + } + return ""; +} + +} // namespace firestore +} // namespace firebase + +/* @@protoc_insertion_point(eof) */ diff --git a/Firestore/Protos/nanopb/google/api/field_behavior.nanopb.h b/Firestore/Protos/nanopb/google/api/field_behavior.nanopb.h new file mode 100644 index 00000000000..ad18ad8b3cf --- /dev/null +++ b/Firestore/Protos/nanopb/google/api/field_behavior.nanopb.h @@ -0,0 +1,61 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.8 */ + +#ifndef PB_GOOGLE_API_FIELD_BEHAVIOR_NANOPB_H_INCLUDED +#define PB_GOOGLE_API_FIELD_BEHAVIOR_NANOPB_H_INCLUDED +#include + +#include + +namespace firebase { +namespace firestore { + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Enum definitions */ +typedef enum _google_api_FieldBehavior { + google_api_FieldBehavior_FIELD_BEHAVIOR_UNSPECIFIED = 0, + google_api_FieldBehavior_OPTIONAL = 1, + google_api_FieldBehavior_REQUIRED = 2, + google_api_FieldBehavior_OUTPUT_ONLY = 3, + google_api_FieldBehavior_INPUT_ONLY = 4, + google_api_FieldBehavior_IMMUTABLE = 5, + google_api_FieldBehavior_UNORDERED_LIST = 6, + google_api_FieldBehavior_NON_EMPTY_DEFAULT = 7, + google_api_FieldBehavior_IDENTIFIER = 8 +} google_api_FieldBehavior; +#define _google_api_FieldBehavior_MIN google_api_FieldBehavior_FIELD_BEHAVIOR_UNSPECIFIED +#define _google_api_FieldBehavior_MAX google_api_FieldBehavior_IDENTIFIER +#define _google_api_FieldBehavior_ARRAYSIZE ((google_api_FieldBehavior)(google_api_FieldBehavior_IDENTIFIER+1)) + +/* Extensions */ +/* Extension field google_api_field_behavior was skipped because only "optional" + type of extension fields is currently supported. */ + +const char* EnumToString(google_api_FieldBehavior value); +} // namespace firestore +} // namespace firebase + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Firestore/Protos/nanopb/google/api/http.nanopb.cc b/Firestore/Protos/nanopb/google/api/http.nanopb.cc index b69f3495d6f..6be59e2b5b8 100644 --- a/Firestore/Protos/nanopb/google/api/http.nanopb.cc +++ b/Firestore/Protos/nanopb/google/api/http.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/api/http.nanopb.h b/Firestore/Protos/nanopb/google/api/http.nanopb.h index 5d97d74d221..af98141f2c4 100644 --- a/Firestore/Protos/nanopb/google/api/http.nanopb.h +++ b/Firestore/Protos/nanopb/google/api/http.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/api/resource.nanopb.cc b/Firestore/Protos/nanopb/google/api/resource.nanopb.cc index 82456fe0cc8..852f7122473 100644 --- a/Firestore/Protos/nanopb/google/api/resource.nanopb.cc +++ b/Firestore/Protos/nanopb/google/api/resource.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/api/resource.nanopb.h b/Firestore/Protos/nanopb/google/api/resource.nanopb.h index 7c7c1ffabaa..741cc580045 100644 --- a/Firestore/Protos/nanopb/google/api/resource.nanopb.h +++ b/Firestore/Protos/nanopb/google/api/resource.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.cc index 5769d63aec7..acf9ce034d4 100644 --- a/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.h b/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.h index e9ba3c9cb86..9caefad8c54 100644 --- a/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/admin/index.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.cc index 5a740ffd8be..6b6dfe77b90 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.h index a64f9163853..0bed00bba6d 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/v1/aggregation_result.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.cc index 3ce3049039a..e30c4b9613f 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.h index 0f294a9b9e1..e46bb381ada 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/v1/bloom_filter.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.cc index 26c423266d4..f3b4bed3ff7 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.h index 7772c08f7df..b63ff25e66e 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/v1/common.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.cc index f236b603132..0fa5a799153 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,7 @@ const pb_field_t google_firestore_v1_Document_FieldsEntry_fields[3] = { PB_LAST_FIELD }; -const pb_field_t google_firestore_v1_Value_fields[12] = { +const pb_field_t google_firestore_v1_Value_fields[15] = { PB_ANONYMOUS_ONEOF_FIELD(value_type, 1, BOOL , ONEOF, STATIC , FIRST, google_firestore_v1_Value, boolean_value, boolean_value, 0), PB_ANONYMOUS_ONEOF_FIELD(value_type, 2, INT64 , ONEOF, STATIC , UNION, google_firestore_v1_Value, integer_value, integer_value, 0), PB_ANONYMOUS_ONEOF_FIELD(value_type, 3, DOUBLE , ONEOF, STATIC , UNION, google_firestore_v1_Value, double_value, double_value, 0), @@ -63,6 +63,9 @@ const pb_field_t google_firestore_v1_Value_fields[12] = { PB_ANONYMOUS_ONEOF_FIELD(value_type, 11, UENUM , ONEOF, STATIC , UNION, google_firestore_v1_Value, null_value, null_value, 0), PB_ANONYMOUS_ONEOF_FIELD(value_type, 17, BYTES , ONEOF, POINTER , UNION, google_firestore_v1_Value, string_value, string_value, 0), PB_ANONYMOUS_ONEOF_FIELD(value_type, 18, BYTES , ONEOF, POINTER , UNION, google_firestore_v1_Value, bytes_value, bytes_value, 0), + PB_ANONYMOUS_ONEOF_FIELD(value_type, 19, BYTES , ONEOF, POINTER , UNION, google_firestore_v1_Value, field_reference_value, field_reference_value, 0), + PB_ANONYMOUS_ONEOF_FIELD(value_type, 20, MESSAGE , ONEOF, STATIC , UNION, google_firestore_v1_Value, function_value, function_value, &google_firestore_v1_Function_fields), + PB_ANONYMOUS_ONEOF_FIELD(value_type, 21, MESSAGE , ONEOF, STATIC , UNION, google_firestore_v1_Value, pipeline_value, pipeline_value, &google_firestore_v1_Pipeline_fields), PB_LAST_FIELD }; @@ -82,6 +85,37 @@ const pb_field_t google_firestore_v1_MapValue_FieldsEntry_fields[3] = { PB_LAST_FIELD }; +const pb_field_t google_firestore_v1_Function_fields[4] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_Function, name, name, 0), + PB_FIELD( 2, MESSAGE , REPEATED, POINTER , OTHER, google_firestore_v1_Function, args, name, &google_firestore_v1_Value_fields), + PB_FIELD( 3, MESSAGE , REPEATED, POINTER , OTHER, google_firestore_v1_Function, options, args, &google_firestore_v1_Function_OptionsEntry_fields), + PB_LAST_FIELD +}; + +const pb_field_t google_firestore_v1_Function_OptionsEntry_fields[3] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_Function_OptionsEntry, key, key, 0), + PB_FIELD( 2, MESSAGE , SINGULAR, STATIC , OTHER, google_firestore_v1_Function_OptionsEntry, value, key, &google_firestore_v1_Value_fields), + PB_LAST_FIELD +}; + +const pb_field_t google_firestore_v1_Pipeline_fields[2] = { + PB_FIELD( 1, MESSAGE , REPEATED, POINTER , FIRST, google_firestore_v1_Pipeline, stages, stages, &google_firestore_v1_Pipeline_Stage_fields), + PB_LAST_FIELD +}; + +const pb_field_t google_firestore_v1_Pipeline_Stage_fields[4] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_Pipeline_Stage, name, name, 0), + PB_FIELD( 2, MESSAGE , REPEATED, POINTER , OTHER, google_firestore_v1_Pipeline_Stage, args, name, &google_firestore_v1_Value_fields), + PB_FIELD( 3, MESSAGE , REPEATED, POINTER , OTHER, google_firestore_v1_Pipeline_Stage, options, args, &google_firestore_v1_Pipeline_Stage_OptionsEntry_fields), + PB_LAST_FIELD +}; + +const pb_field_t google_firestore_v1_Pipeline_Stage_OptionsEntry_fields[3] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_Pipeline_Stage_OptionsEntry, key, key, 0), + PB_FIELD( 2, MESSAGE , SINGULAR, STATIC , OTHER, google_firestore_v1_Pipeline_Stage_OptionsEntry, value, key, &google_firestore_v1_Value_fields), + PB_LAST_FIELD +}; + /* Check that field information fits in pb_field_t */ #if !defined(PB_FIELD_32BIT) @@ -92,7 +126,7 @@ const pb_field_t google_firestore_v1_MapValue_FieldsEntry_fields[3] = { * numbers or field sizes that are larger than what can fit in 8 or 16 bit * field descriptors. */ -PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_Document, create_time) < 65536 && pb_membersize(google_firestore_v1_Document, update_time) < 65536 && pb_membersize(google_firestore_v1_Document_FieldsEntry, value) < 65536 && pb_membersize(google_firestore_v1_Value, map_value) < 65536 && pb_membersize(google_firestore_v1_Value, geo_point_value) < 65536 && pb_membersize(google_firestore_v1_Value, array_value) < 65536 && pb_membersize(google_firestore_v1_Value, timestamp_value) < 65536 && pb_membersize(google_firestore_v1_MapValue_FieldsEntry, value) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_firestore_v1_Document_google_firestore_v1_Document_FieldsEntry_google_firestore_v1_Value_google_firestore_v1_ArrayValue_google_firestore_v1_MapValue_google_firestore_v1_MapValue_FieldsEntry) +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_Document, create_time) < 65536 && pb_membersize(google_firestore_v1_Document, update_time) < 65536 && pb_membersize(google_firestore_v1_Document_FieldsEntry, value) < 65536 && pb_membersize(google_firestore_v1_Value, map_value) < 65536 && pb_membersize(google_firestore_v1_Value, geo_point_value) < 65536 && pb_membersize(google_firestore_v1_Value, array_value) < 65536 && pb_membersize(google_firestore_v1_Value, timestamp_value) < 65536 && pb_membersize(google_firestore_v1_Value, function_value) < 65536 && pb_membersize(google_firestore_v1_Value, pipeline_value) < 65536 && pb_membersize(google_firestore_v1_MapValue_FieldsEntry, value) < 65536 && pb_membersize(google_firestore_v1_Function_OptionsEntry, value) < 65536 && pb_membersize(google_firestore_v1_Pipeline_Stage_OptionsEntry, value) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_firestore_v1_Document_google_firestore_v1_Document_FieldsEntry_google_firestore_v1_Value_google_firestore_v1_ArrayValue_google_firestore_v1_MapValue_google_firestore_v1_MapValue_FieldsEntry_google_firestore_v1_Function_google_firestore_v1_Function_OptionsEntry_google_firestore_v1_Pipeline_google_firestore_v1_Pipeline_Stage_google_firestore_v1_Pipeline_Stage_OptionsEntry) #endif #if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) @@ -103,7 +137,7 @@ PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_Document, create_time) < 655 * numbers or field sizes that are larger than what can fit in the default * 8 bit descriptors. */ -PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_Document, create_time) < 256 && pb_membersize(google_firestore_v1_Document, update_time) < 256 && pb_membersize(google_firestore_v1_Document_FieldsEntry, value) < 256 && pb_membersize(google_firestore_v1_Value, map_value) < 256 && pb_membersize(google_firestore_v1_Value, geo_point_value) < 256 && pb_membersize(google_firestore_v1_Value, array_value) < 256 && pb_membersize(google_firestore_v1_Value, timestamp_value) < 256 && pb_membersize(google_firestore_v1_MapValue_FieldsEntry, value) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_firestore_v1_Document_google_firestore_v1_Document_FieldsEntry_google_firestore_v1_Value_google_firestore_v1_ArrayValue_google_firestore_v1_MapValue_google_firestore_v1_MapValue_FieldsEntry) +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_Document, create_time) < 256 && pb_membersize(google_firestore_v1_Document, update_time) < 256 && pb_membersize(google_firestore_v1_Document_FieldsEntry, value) < 256 && pb_membersize(google_firestore_v1_Value, map_value) < 256 && pb_membersize(google_firestore_v1_Value, geo_point_value) < 256 && pb_membersize(google_firestore_v1_Value, array_value) < 256 && pb_membersize(google_firestore_v1_Value, timestamp_value) < 256 && pb_membersize(google_firestore_v1_Value, function_value) < 256 && pb_membersize(google_firestore_v1_Value, pipeline_value) < 256 && pb_membersize(google_firestore_v1_MapValue_FieldsEntry, value) < 256 && pb_membersize(google_firestore_v1_Function_OptionsEntry, value) < 256 && pb_membersize(google_firestore_v1_Pipeline_Stage_OptionsEntry, value) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_firestore_v1_Document_google_firestore_v1_Document_FieldsEntry_google_firestore_v1_Value_google_firestore_v1_ArrayValue_google_firestore_v1_MapValue_google_firestore_v1_MapValue_FieldsEntry_google_firestore_v1_Function_google_firestore_v1_Function_OptionsEntry_google_firestore_v1_Pipeline_google_firestore_v1_Pipeline_Stage_google_firestore_v1_Pipeline_Stage_OptionsEntry) #endif @@ -193,6 +227,18 @@ std::string google_firestore_v1_Value::ToString(int indent) const { tostring_result += PrintPrimitiveField("bytes_value: ", bytes_value, indent + 1, true); break; + case google_firestore_v1_Value_field_reference_value_tag: + tostring_result += PrintPrimitiveField("field_reference_value: ", + field_reference_value, indent + 1, true); + break; + case google_firestore_v1_Value_function_value_tag: + tostring_result += PrintMessageField("function_value ", + function_value, indent + 1, true); + break; + case google_firestore_v1_Value_pipeline_value_tag: + tostring_result += PrintMessageField("pipeline_value ", + pipeline_value, indent + 1, true); + break; } bool is_root = indent == 0; @@ -251,6 +297,92 @@ std::string google_firestore_v1_MapValue_FieldsEntry::ToString(int indent) const return tostring_header + tostring_result + tostring_tail; } +std::string google_firestore_v1_Function::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "Function", this); + std::string tostring_result; + + tostring_result += PrintPrimitiveField("name: ", name, indent + 1, false); + for (pb_size_t i = 0; i != args_count; ++i) { + tostring_result += PrintMessageField("args ", + args[i], indent + 1, true); + } + for (pb_size_t i = 0; i != options_count; ++i) { + tostring_result += PrintMessageField("options ", + options[i], indent + 1, true); + } + + bool is_root = indent == 0; + if (!tostring_result.empty() || is_root) { + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; + } else { + return ""; + } +} + +std::string google_firestore_v1_Function_OptionsEntry::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "OptionsEntry", this); + std::string tostring_result; + + tostring_result += PrintPrimitiveField("key: ", key, indent + 1, false); + tostring_result += PrintMessageField("value ", value, indent + 1, false); + + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; +} + +std::string google_firestore_v1_Pipeline::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "Pipeline", this); + std::string tostring_result; + + for (pb_size_t i = 0; i != stages_count; ++i) { + tostring_result += PrintMessageField("stages ", + stages[i], indent + 1, true); + } + + bool is_root = indent == 0; + if (!tostring_result.empty() || is_root) { + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; + } else { + return ""; + } +} + +std::string google_firestore_v1_Pipeline_Stage::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "Stage", this); + std::string tostring_result; + + tostring_result += PrintPrimitiveField("name: ", name, indent + 1, false); + for (pb_size_t i = 0; i != args_count; ++i) { + tostring_result += PrintMessageField("args ", + args[i], indent + 1, true); + } + for (pb_size_t i = 0; i != options_count; ++i) { + tostring_result += PrintMessageField("options ", + options[i], indent + 1, true); + } + + bool is_root = indent == 0; + if (!tostring_result.empty() || is_root) { + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; + } else { + return ""; + } +} + +std::string google_firestore_v1_Pipeline_Stage_OptionsEntry::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "OptionsEntry", this); + std::string tostring_result; + + tostring_result += PrintPrimitiveField("key: ", key, indent + 1, false); + tostring_result += PrintMessageField("value ", value, indent + 1, false); + + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; +} + } // namespace firestore } // namespace firebase diff --git a/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h index 6a6435c05a3..c168433c5a8 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,8 @@ #define PB_GOOGLE_FIRESTORE_V1_DOCUMENT_NANOPB_H_INCLUDED #include +#include "google/api/field_behavior.nanopb.h" + #include "google/protobuf/struct.nanopb.h" #include "google/protobuf/timestamp.nanopb.h" @@ -47,6 +49,17 @@ typedef struct _google_firestore_v1_ArrayValue { /* @@protoc_insertion_point(struct:google_firestore_v1_ArrayValue) */ } google_firestore_v1_ArrayValue; +typedef struct _google_firestore_v1_Function { + pb_bytes_array_t *name; + pb_size_t args_count; + struct _google_firestore_v1_Value *args; + pb_size_t options_count; + struct _google_firestore_v1_Function_OptionsEntry *options; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_Function) */ +} google_firestore_v1_Function; + typedef struct _google_firestore_v1_MapValue { pb_size_t fields_count; struct _google_firestore_v1_MapValue_FieldsEntry *fields; @@ -55,6 +68,25 @@ typedef struct _google_firestore_v1_MapValue { /* @@protoc_insertion_point(struct:google_firestore_v1_MapValue) */ } google_firestore_v1_MapValue; +typedef struct _google_firestore_v1_Pipeline { + pb_size_t stages_count; + struct _google_firestore_v1_Pipeline_Stage *stages; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_Pipeline) */ +} google_firestore_v1_Pipeline; + +typedef struct _google_firestore_v1_Pipeline_Stage { + pb_bytes_array_t *name; + pb_size_t args_count; + struct _google_firestore_v1_Value *args; + pb_size_t options_count; + struct _google_firestore_v1_Pipeline_Stage_OptionsEntry *options; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_Pipeline_Stage) */ +} google_firestore_v1_Pipeline_Stage; + typedef struct _google_firestore_v1_Document { pb_bytes_array_t *name; pb_size_t fields_count; @@ -81,6 +113,9 @@ typedef struct _google_firestore_v1_Value { google_protobuf_NullValue null_value; pb_bytes_array_t *string_value; pb_bytes_array_t *bytes_value; + pb_bytes_array_t *field_reference_value; + google_firestore_v1_Function function_value; + google_firestore_v1_Pipeline pipeline_value; }; std::string ToString(int indent = 0) const; @@ -95,6 +130,14 @@ typedef struct _google_firestore_v1_Document_FieldsEntry { /* @@protoc_insertion_point(struct:google_firestore_v1_Document_FieldsEntry) */ } google_firestore_v1_Document_FieldsEntry; +typedef struct _google_firestore_v1_Function_OptionsEntry { + pb_bytes_array_t *key; + google_firestore_v1_Value value; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_Function_OptionsEntry) */ +} google_firestore_v1_Function_OptionsEntry; + typedef struct _google_firestore_v1_MapValue_FieldsEntry { pb_bytes_array_t *key; google_firestore_v1_Value value; @@ -103,6 +146,14 @@ typedef struct _google_firestore_v1_MapValue_FieldsEntry { /* @@protoc_insertion_point(struct:google_firestore_v1_MapValue_FieldsEntry) */ } google_firestore_v1_MapValue_FieldsEntry; +typedef struct _google_firestore_v1_Pipeline_Stage_OptionsEntry { + pb_bytes_array_t *key; + google_firestore_v1_Value value; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_Pipeline_Stage_OptionsEntry) */ +} google_firestore_v1_Pipeline_Stage_OptionsEntry; + /* Default values for struct fields */ /* Initializer values for message structs */ @@ -112,16 +163,33 @@ typedef struct _google_firestore_v1_MapValue_FieldsEntry { #define google_firestore_v1_ArrayValue_init_default {0, NULL} #define google_firestore_v1_MapValue_init_default {0, NULL} #define google_firestore_v1_MapValue_FieldsEntry_init_default {NULL, google_firestore_v1_Value_init_default} +#define google_firestore_v1_Function_init_default {NULL, 0, NULL, 0, NULL} +#define google_firestore_v1_Function_OptionsEntry_init_default {NULL, google_firestore_v1_Value_init_default} +#define google_firestore_v1_Pipeline_init_default {0, NULL} +#define google_firestore_v1_Pipeline_Stage_init_default {NULL, 0, NULL, 0, NULL} +#define google_firestore_v1_Pipeline_Stage_OptionsEntry_init_default {NULL, google_firestore_v1_Value_init_default} #define google_firestore_v1_Document_init_zero {NULL, 0, NULL, google_protobuf_Timestamp_init_zero, false, google_protobuf_Timestamp_init_zero} #define google_firestore_v1_Document_FieldsEntry_init_zero {NULL, google_firestore_v1_Value_init_zero} #define google_firestore_v1_Value_init_zero {0, {0}} #define google_firestore_v1_ArrayValue_init_zero {0, NULL} #define google_firestore_v1_MapValue_init_zero {0, NULL} #define google_firestore_v1_MapValue_FieldsEntry_init_zero {NULL, google_firestore_v1_Value_init_zero} +#define google_firestore_v1_Function_init_zero {NULL, 0, NULL, 0, NULL} +#define google_firestore_v1_Function_OptionsEntry_init_zero {NULL, google_firestore_v1_Value_init_zero} +#define google_firestore_v1_Pipeline_init_zero {0, NULL} +#define google_firestore_v1_Pipeline_Stage_init_zero {NULL, 0, NULL, 0, NULL} +#define google_firestore_v1_Pipeline_Stage_OptionsEntry_init_zero {NULL, google_firestore_v1_Value_init_zero} /* Field tags (for use in manual encoding/decoding) */ #define google_firestore_v1_ArrayValue_values_tag 1 +#define google_firestore_v1_Function_name_tag 1 +#define google_firestore_v1_Function_args_tag 2 +#define google_firestore_v1_Function_options_tag 3 #define google_firestore_v1_MapValue_fields_tag 1 +#define google_firestore_v1_Pipeline_stages_tag 1 +#define google_firestore_v1_Pipeline_Stage_name_tag 1 +#define google_firestore_v1_Pipeline_Stage_args_tag 2 +#define google_firestore_v1_Pipeline_Stage_options_tag 3 #define google_firestore_v1_Document_name_tag 1 #define google_firestore_v1_Document_fields_tag 2 #define google_firestore_v1_Document_create_time_tag 3 @@ -137,18 +205,30 @@ typedef struct _google_firestore_v1_MapValue_FieldsEntry { #define google_firestore_v1_Value_null_value_tag 11 #define google_firestore_v1_Value_string_value_tag 17 #define google_firestore_v1_Value_bytes_value_tag 18 +#define google_firestore_v1_Value_field_reference_value_tag 19 +#define google_firestore_v1_Value_function_value_tag 20 +#define google_firestore_v1_Value_pipeline_value_tag 21 #define google_firestore_v1_Document_FieldsEntry_key_tag 1 #define google_firestore_v1_Document_FieldsEntry_value_tag 2 +#define google_firestore_v1_Function_OptionsEntry_key_tag 1 +#define google_firestore_v1_Function_OptionsEntry_value_tag 2 #define google_firestore_v1_MapValue_FieldsEntry_key_tag 1 #define google_firestore_v1_MapValue_FieldsEntry_value_tag 2 +#define google_firestore_v1_Pipeline_Stage_OptionsEntry_key_tag 1 +#define google_firestore_v1_Pipeline_Stage_OptionsEntry_value_tag 2 /* Struct field encoding specification for nanopb */ extern const pb_field_t google_firestore_v1_Document_fields[5]; extern const pb_field_t google_firestore_v1_Document_FieldsEntry_fields[3]; -extern const pb_field_t google_firestore_v1_Value_fields[12]; +extern const pb_field_t google_firestore_v1_Value_fields[15]; extern const pb_field_t google_firestore_v1_ArrayValue_fields[2]; extern const pb_field_t google_firestore_v1_MapValue_fields[2]; extern const pb_field_t google_firestore_v1_MapValue_FieldsEntry_fields[3]; +extern const pb_field_t google_firestore_v1_Function_fields[4]; +extern const pb_field_t google_firestore_v1_Function_OptionsEntry_fields[3]; +extern const pb_field_t google_firestore_v1_Pipeline_fields[2]; +extern const pb_field_t google_firestore_v1_Pipeline_Stage_fields[4]; +extern const pb_field_t google_firestore_v1_Pipeline_Stage_OptionsEntry_fields[3]; /* Maximum encoded size of messages (where known) */ /* google_firestore_v1_Document_size depends on runtime parameters */ @@ -157,6 +237,11 @@ extern const pb_field_t google_firestore_v1_MapValue_FieldsEntry_fields[3]; /* google_firestore_v1_ArrayValue_size depends on runtime parameters */ /* google_firestore_v1_MapValue_size depends on runtime parameters */ /* google_firestore_v1_MapValue_FieldsEntry_size depends on runtime parameters */ +/* google_firestore_v1_Function_size depends on runtime parameters */ +/* google_firestore_v1_Function_OptionsEntry_size depends on runtime parameters */ +/* google_firestore_v1_Pipeline_size depends on runtime parameters */ +/* google_firestore_v1_Pipeline_Stage_size depends on runtime parameters */ +/* google_firestore_v1_Pipeline_Stage_OptionsEntry_size depends on runtime parameters */ /* Message IDs (where set with "msgid" option) */ #ifdef PB_MSGID diff --git a/Firestore/Protos/nanopb/google/firestore/v1/explain_stats.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/explain_stats.nanopb.cc new file mode 100644 index 00000000000..60d7cfab731 --- /dev/null +++ b/Firestore/Protos/nanopb/google/firestore/v1/explain_stats.nanopb.cc @@ -0,0 +1,83 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.8 */ + +#include "explain_stats.nanopb.h" + +#include "Firestore/core/src/nanopb/pretty_printing.h" + +namespace firebase { +namespace firestore { + +using nanopb::PrintEnumField; +using nanopb::PrintHeader; +using nanopb::PrintMessageField; +using nanopb::PrintPrimitiveField; +using nanopb::PrintTail; + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t google_firestore_v1_ExplainStats_fields[2] = { + PB_FIELD( 1, MESSAGE , SINGULAR, STATIC , FIRST, google_firestore_v1_ExplainStats, data, data, &google_protobuf_Any_fields), + PB_LAST_FIELD +}; + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_ExplainStats, data) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_firestore_v1_ExplainStats) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_ExplainStats, data) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_firestore_v1_ExplainStats) +#endif + + +std::string google_firestore_v1_ExplainStats::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "ExplainStats", this); + std::string tostring_result; + + tostring_result += PrintMessageField("data ", data, indent + 1, false); + + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; +} + +} // namespace firestore +} // namespace firebase + +/* @@protoc_insertion_point(eof) */ diff --git a/Firestore/Protos/nanopb/google/firestore/v1/explain_stats.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/explain_stats.nanopb.h new file mode 100644 index 00000000000..f97eb64ee51 --- /dev/null +++ b/Firestore/Protos/nanopb/google/firestore/v1/explain_stats.nanopb.h @@ -0,0 +1,73 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.8 */ + +#ifndef PB_GOOGLE_FIRESTORE_V1_EXPLAIN_STATS_NANOPB_H_INCLUDED +#define PB_GOOGLE_FIRESTORE_V1_EXPLAIN_STATS_NANOPB_H_INCLUDED +#include + +#include "google/protobuf/any.nanopb.h" + +#include + +namespace firebase { +namespace firestore { + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Struct definitions */ +typedef struct _google_firestore_v1_ExplainStats { + google_protobuf_Any data; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_ExplainStats) */ +} google_firestore_v1_ExplainStats; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define google_firestore_v1_ExplainStats_init_default {google_protobuf_Any_init_default} +#define google_firestore_v1_ExplainStats_init_zero {google_protobuf_Any_init_zero} + +/* Field tags (for use in manual encoding/decoding) */ +#define google_firestore_v1_ExplainStats_data_tag 1 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t google_firestore_v1_ExplainStats_fields[2]; + +/* Maximum encoded size of messages (where known) */ +#define google_firestore_v1_ExplainStats_size (6 + google_protobuf_Any_size) + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define EXPLAIN_STATS_MESSAGES \ + + +#endif + +} // namespace firestore +} // namespace firebase + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.cc index 233d2025dc9..fabd2343097 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -152,6 +152,23 @@ const pb_field_t google_firestore_v1_RunQueryResponse_fields[5] = { PB_LAST_FIELD }; +const pb_field_t google_firestore_v1_ExecutePipelineRequest_fields[6] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_ExecutePipelineRequest, database, database, 0), + PB_ONEOF_FIELD(pipeline_type, 2, MESSAGE , ONEOF, STATIC , OTHER, google_firestore_v1_ExecutePipelineRequest, structured_pipeline, database, &google_firestore_v1_StructuredPipeline_fields), + PB_ONEOF_FIELD(consistency_selector, 5, BYTES , ONEOF, POINTER , OTHER, google_firestore_v1_ExecutePipelineRequest, transaction, pipeline_type.structured_pipeline, 0), + PB_ONEOF_FIELD(consistency_selector, 6, MESSAGE , ONEOF, STATIC , UNION, google_firestore_v1_ExecutePipelineRequest, new_transaction, pipeline_type.structured_pipeline, &google_firestore_v1_TransactionOptions_fields), + PB_ONEOF_FIELD(consistency_selector, 7, MESSAGE , ONEOF, STATIC , UNION, google_firestore_v1_ExecutePipelineRequest, read_time, pipeline_type.structured_pipeline, &google_protobuf_Timestamp_fields), + PB_LAST_FIELD +}; + +const pb_field_t google_firestore_v1_ExecutePipelineResponse_fields[5] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_ExecutePipelineResponse, transaction, transaction, 0), + PB_FIELD( 2, MESSAGE , REPEATED, POINTER , OTHER, google_firestore_v1_ExecutePipelineResponse, results, transaction, &google_firestore_v1_Document_fields), + PB_FIELD( 3, MESSAGE , SINGULAR, STATIC , OTHER, google_firestore_v1_ExecutePipelineResponse, execution_time, results, &google_protobuf_Timestamp_fields), + PB_FIELD( 4, MESSAGE , SINGULAR, STATIC , OTHER, google_firestore_v1_ExecutePipelineResponse, explain_stats, execution_time, &google_firestore_v1_ExplainStats_fields), + PB_LAST_FIELD +}; + const pb_field_t google_firestore_v1_RunAggregationQueryRequest_fields[6] = { PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_RunAggregationQueryRequest, parent, parent, 0), PB_ONEOF_FIELD(query_type, 2, MESSAGE , ONEOF, STATIC , OTHER, google_firestore_v1_RunAggregationQueryRequest, structured_aggregation_query, parent, &google_firestore_v1_StructuredAggregationQuery_fields), @@ -269,7 +286,7 @@ const pb_field_t google_firestore_v1_ListCollectionIdsResponse_fields[3] = { * numbers or field sizes that are larger than what can fit in 8 or 16 bit * field descriptors. */ -PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_GetDocumentRequest, read_time) < 65536 && pb_membersize(google_firestore_v1_GetDocumentRequest, mask) < 65536 && pb_membersize(google_firestore_v1_ListDocumentsRequest, read_time) < 65536 && pb_membersize(google_firestore_v1_ListDocumentsRequest, mask) < 65536 && pb_membersize(google_firestore_v1_CreateDocumentRequest, document) < 65536 && pb_membersize(google_firestore_v1_CreateDocumentRequest, mask) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, document) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, update_mask) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, mask) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, current_document) < 65536 && pb_membersize(google_firestore_v1_DeleteDocumentRequest, current_document) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, new_transaction) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, read_time) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, mask) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, found) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, read_time) < 65536 && pb_membersize(google_firestore_v1_BeginTransactionRequest, options) < 65536 && pb_membersize(google_firestore_v1_CommitResponse, commit_time) < 65536 && pb_membersize(google_firestore_v1_RunQueryRequest, query_type.structured_query) < 65536 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.new_transaction) < 65536 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.read_time) < 65536 && pb_membersize(google_firestore_v1_RunQueryResponse, document) < 65536 && pb_membersize(google_firestore_v1_RunQueryResponse, read_time) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, query_type.structured_aggregation_query) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.new_transaction) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.read_time) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, result) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, read_time) < 65536 && pb_membersize(google_firestore_v1_WriteResponse, commit_time) < 65536 && pb_membersize(google_firestore_v1_ListenRequest, add_target) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, target_change) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, document_change) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, document_delete) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, filter) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, document_remove) < 65536 && pb_membersize(google_firestore_v1_Target, target_type.query) < 65536 && pb_membersize(google_firestore_v1_Target, target_type.documents) < 65536 && pb_membersize(google_firestore_v1_Target, resume_type.read_time) < 65536 && pb_membersize(google_firestore_v1_Target, expected_count) < 65536 && pb_membersize(google_firestore_v1_Target_QueryTarget, structured_query) < 65536 && pb_membersize(google_firestore_v1_TargetChange, cause) < 65536 && pb_membersize(google_firestore_v1_TargetChange, read_time) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_firestore_v1_GetDocumentRequest_google_firestore_v1_ListDocumentsRequest_google_firestore_v1_ListDocumentsResponse_google_firestore_v1_CreateDocumentRequest_google_firestore_v1_UpdateDocumentRequest_google_firestore_v1_DeleteDocumentRequest_google_firestore_v1_BatchGetDocumentsRequest_google_firestore_v1_BatchGetDocumentsResponse_google_firestore_v1_BeginTransactionRequest_google_firestore_v1_BeginTransactionResponse_google_firestore_v1_CommitRequest_google_firestore_v1_CommitResponse_google_firestore_v1_RollbackRequest_google_firestore_v1_RunQueryRequest_google_firestore_v1_RunQueryResponse_google_firestore_v1_RunAggregationQueryRequest_google_firestore_v1_RunAggregationQueryResponse_google_firestore_v1_WriteRequest_google_firestore_v1_WriteRequest_LabelsEntry_google_firestore_v1_WriteResponse_google_firestore_v1_ListenRequest_google_firestore_v1_ListenRequest_LabelsEntry_google_firestore_v1_ListenResponse_google_firestore_v1_Target_google_firestore_v1_Target_DocumentsTarget_google_firestore_v1_Target_QueryTarget_google_firestore_v1_TargetChange_google_firestore_v1_ListCollectionIdsRequest_google_firestore_v1_ListCollectionIdsResponse) +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_GetDocumentRequest, read_time) < 65536 && pb_membersize(google_firestore_v1_GetDocumentRequest, mask) < 65536 && pb_membersize(google_firestore_v1_ListDocumentsRequest, read_time) < 65536 && pb_membersize(google_firestore_v1_ListDocumentsRequest, mask) < 65536 && pb_membersize(google_firestore_v1_CreateDocumentRequest, document) < 65536 && pb_membersize(google_firestore_v1_CreateDocumentRequest, mask) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, document) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, update_mask) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, mask) < 65536 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, current_document) < 65536 && pb_membersize(google_firestore_v1_DeleteDocumentRequest, current_document) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, new_transaction) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, read_time) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, mask) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, found) < 65536 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, read_time) < 65536 && pb_membersize(google_firestore_v1_BeginTransactionRequest, options) < 65536 && pb_membersize(google_firestore_v1_CommitResponse, commit_time) < 65536 && pb_membersize(google_firestore_v1_RunQueryRequest, query_type.structured_query) < 65536 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.new_transaction) < 65536 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.read_time) < 65536 && pb_membersize(google_firestore_v1_RunQueryResponse, document) < 65536 && pb_membersize(google_firestore_v1_RunQueryResponse, read_time) < 65536 && pb_membersize(google_firestore_v1_ExecutePipelineRequest, pipeline_type.structured_pipeline) < 65536 && pb_membersize(google_firestore_v1_ExecutePipelineRequest, consistency_selector.new_transaction) < 65536 && pb_membersize(google_firestore_v1_ExecutePipelineRequest, consistency_selector.read_time) < 65536 && pb_membersize(google_firestore_v1_ExecutePipelineResponse, execution_time) < 65536 && pb_membersize(google_firestore_v1_ExecutePipelineResponse, explain_stats) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, query_type.structured_aggregation_query) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.new_transaction) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.read_time) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, result) < 65536 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, read_time) < 65536 && pb_membersize(google_firestore_v1_WriteResponse, commit_time) < 65536 && pb_membersize(google_firestore_v1_ListenRequest, add_target) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, target_change) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, document_change) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, document_delete) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, filter) < 65536 && pb_membersize(google_firestore_v1_ListenResponse, document_remove) < 65536 && pb_membersize(google_firestore_v1_Target, target_type.query) < 65536 && pb_membersize(google_firestore_v1_Target, target_type.documents) < 65536 && pb_membersize(google_firestore_v1_Target, resume_type.read_time) < 65536 && pb_membersize(google_firestore_v1_Target, expected_count) < 65536 && pb_membersize(google_firestore_v1_Target_QueryTarget, structured_query) < 65536 && pb_membersize(google_firestore_v1_TargetChange, cause) < 65536 && pb_membersize(google_firestore_v1_TargetChange, read_time) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_firestore_v1_GetDocumentRequest_google_firestore_v1_ListDocumentsRequest_google_firestore_v1_ListDocumentsResponse_google_firestore_v1_CreateDocumentRequest_google_firestore_v1_UpdateDocumentRequest_google_firestore_v1_DeleteDocumentRequest_google_firestore_v1_BatchGetDocumentsRequest_google_firestore_v1_BatchGetDocumentsResponse_google_firestore_v1_BeginTransactionRequest_google_firestore_v1_BeginTransactionResponse_google_firestore_v1_CommitRequest_google_firestore_v1_CommitResponse_google_firestore_v1_RollbackRequest_google_firestore_v1_RunQueryRequest_google_firestore_v1_RunQueryResponse_google_firestore_v1_ExecutePipelineRequest_google_firestore_v1_ExecutePipelineResponse_google_firestore_v1_RunAggregationQueryRequest_google_firestore_v1_RunAggregationQueryResponse_google_firestore_v1_WriteRequest_google_firestore_v1_WriteRequest_LabelsEntry_google_firestore_v1_WriteResponse_google_firestore_v1_ListenRequest_google_firestore_v1_ListenRequest_LabelsEntry_google_firestore_v1_ListenResponse_google_firestore_v1_Target_google_firestore_v1_Target_DocumentsTarget_google_firestore_v1_Target_QueryTarget_google_firestore_v1_TargetChange_google_firestore_v1_ListCollectionIdsRequest_google_firestore_v1_ListCollectionIdsResponse) #endif #if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) @@ -280,7 +297,7 @@ PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_GetDocumentRequest, read_tim * numbers or field sizes that are larger than what can fit in the default * 8 bit descriptors. */ -PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_GetDocumentRequest, read_time) < 256 && pb_membersize(google_firestore_v1_GetDocumentRequest, mask) < 256 && pb_membersize(google_firestore_v1_ListDocumentsRequest, read_time) < 256 && pb_membersize(google_firestore_v1_ListDocumentsRequest, mask) < 256 && pb_membersize(google_firestore_v1_CreateDocumentRequest, document) < 256 && pb_membersize(google_firestore_v1_CreateDocumentRequest, mask) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, document) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, update_mask) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, mask) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, current_document) < 256 && pb_membersize(google_firestore_v1_DeleteDocumentRequest, current_document) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, new_transaction) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, read_time) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, mask) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, found) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, read_time) < 256 && pb_membersize(google_firestore_v1_BeginTransactionRequest, options) < 256 && pb_membersize(google_firestore_v1_CommitResponse, commit_time) < 256 && pb_membersize(google_firestore_v1_RunQueryRequest, query_type.structured_query) < 256 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.new_transaction) < 256 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.read_time) < 256 && pb_membersize(google_firestore_v1_RunQueryResponse, document) < 256 && pb_membersize(google_firestore_v1_RunQueryResponse, read_time) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, query_type.structured_aggregation_query) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.new_transaction) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.read_time) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, result) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, read_time) < 256 && pb_membersize(google_firestore_v1_WriteResponse, commit_time) < 256 && pb_membersize(google_firestore_v1_ListenRequest, add_target) < 256 && pb_membersize(google_firestore_v1_ListenResponse, target_change) < 256 && pb_membersize(google_firestore_v1_ListenResponse, document_change) < 256 && pb_membersize(google_firestore_v1_ListenResponse, document_delete) < 256 && pb_membersize(google_firestore_v1_ListenResponse, filter) < 256 && pb_membersize(google_firestore_v1_ListenResponse, document_remove) < 256 && pb_membersize(google_firestore_v1_Target, target_type.query) < 256 && pb_membersize(google_firestore_v1_Target, target_type.documents) < 256 && pb_membersize(google_firestore_v1_Target, resume_type.read_time) < 256 && pb_membersize(google_firestore_v1_Target, expected_count) < 256 && pb_membersize(google_firestore_v1_Target_QueryTarget, structured_query) < 256 && pb_membersize(google_firestore_v1_TargetChange, cause) < 256 && pb_membersize(google_firestore_v1_TargetChange, read_time) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_firestore_v1_GetDocumentRequest_google_firestore_v1_ListDocumentsRequest_google_firestore_v1_ListDocumentsResponse_google_firestore_v1_CreateDocumentRequest_google_firestore_v1_UpdateDocumentRequest_google_firestore_v1_DeleteDocumentRequest_google_firestore_v1_BatchGetDocumentsRequest_google_firestore_v1_BatchGetDocumentsResponse_google_firestore_v1_BeginTransactionRequest_google_firestore_v1_BeginTransactionResponse_google_firestore_v1_CommitRequest_google_firestore_v1_CommitResponse_google_firestore_v1_RollbackRequest_google_firestore_v1_RunQueryRequest_google_firestore_v1_RunQueryResponse_google_firestore_v1_RunAggregationQueryRequest_google_firestore_v1_RunAggregationQueryResponse_google_firestore_v1_WriteRequest_google_firestore_v1_WriteRequest_LabelsEntry_google_firestore_v1_WriteResponse_google_firestore_v1_ListenRequest_google_firestore_v1_ListenRequest_LabelsEntry_google_firestore_v1_ListenResponse_google_firestore_v1_Target_google_firestore_v1_Target_DocumentsTarget_google_firestore_v1_Target_QueryTarget_google_firestore_v1_TargetChange_google_firestore_v1_ListCollectionIdsRequest_google_firestore_v1_ListCollectionIdsResponse) +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_GetDocumentRequest, read_time) < 256 && pb_membersize(google_firestore_v1_GetDocumentRequest, mask) < 256 && pb_membersize(google_firestore_v1_ListDocumentsRequest, read_time) < 256 && pb_membersize(google_firestore_v1_ListDocumentsRequest, mask) < 256 && pb_membersize(google_firestore_v1_CreateDocumentRequest, document) < 256 && pb_membersize(google_firestore_v1_CreateDocumentRequest, mask) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, document) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, update_mask) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, mask) < 256 && pb_membersize(google_firestore_v1_UpdateDocumentRequest, current_document) < 256 && pb_membersize(google_firestore_v1_DeleteDocumentRequest, current_document) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, new_transaction) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, read_time) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsRequest, mask) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, found) < 256 && pb_membersize(google_firestore_v1_BatchGetDocumentsResponse, read_time) < 256 && pb_membersize(google_firestore_v1_BeginTransactionRequest, options) < 256 && pb_membersize(google_firestore_v1_CommitResponse, commit_time) < 256 && pb_membersize(google_firestore_v1_RunQueryRequest, query_type.structured_query) < 256 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.new_transaction) < 256 && pb_membersize(google_firestore_v1_RunQueryRequest, consistency_selector.read_time) < 256 && pb_membersize(google_firestore_v1_RunQueryResponse, document) < 256 && pb_membersize(google_firestore_v1_RunQueryResponse, read_time) < 256 && pb_membersize(google_firestore_v1_ExecutePipelineRequest, pipeline_type.structured_pipeline) < 256 && pb_membersize(google_firestore_v1_ExecutePipelineRequest, consistency_selector.new_transaction) < 256 && pb_membersize(google_firestore_v1_ExecutePipelineRequest, consistency_selector.read_time) < 256 && pb_membersize(google_firestore_v1_ExecutePipelineResponse, execution_time) < 256 && pb_membersize(google_firestore_v1_ExecutePipelineResponse, explain_stats) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, query_type.structured_aggregation_query) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.new_transaction) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryRequest, consistency_selector.read_time) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, result) < 256 && pb_membersize(google_firestore_v1_RunAggregationQueryResponse, read_time) < 256 && pb_membersize(google_firestore_v1_WriteResponse, commit_time) < 256 && pb_membersize(google_firestore_v1_ListenRequest, add_target) < 256 && pb_membersize(google_firestore_v1_ListenResponse, target_change) < 256 && pb_membersize(google_firestore_v1_ListenResponse, document_change) < 256 && pb_membersize(google_firestore_v1_ListenResponse, document_delete) < 256 && pb_membersize(google_firestore_v1_ListenResponse, filter) < 256 && pb_membersize(google_firestore_v1_ListenResponse, document_remove) < 256 && pb_membersize(google_firestore_v1_Target, target_type.query) < 256 && pb_membersize(google_firestore_v1_Target, target_type.documents) < 256 && pb_membersize(google_firestore_v1_Target, resume_type.read_time) < 256 && pb_membersize(google_firestore_v1_Target, expected_count) < 256 && pb_membersize(google_firestore_v1_Target_QueryTarget, structured_query) < 256 && pb_membersize(google_firestore_v1_TargetChange, cause) < 256 && pb_membersize(google_firestore_v1_TargetChange, read_time) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_firestore_v1_GetDocumentRequest_google_firestore_v1_ListDocumentsRequest_google_firestore_v1_ListDocumentsResponse_google_firestore_v1_CreateDocumentRequest_google_firestore_v1_UpdateDocumentRequest_google_firestore_v1_DeleteDocumentRequest_google_firestore_v1_BatchGetDocumentsRequest_google_firestore_v1_BatchGetDocumentsResponse_google_firestore_v1_BeginTransactionRequest_google_firestore_v1_BeginTransactionResponse_google_firestore_v1_CommitRequest_google_firestore_v1_CommitResponse_google_firestore_v1_RollbackRequest_google_firestore_v1_RunQueryRequest_google_firestore_v1_RunQueryResponse_google_firestore_v1_ExecutePipelineRequest_google_firestore_v1_ExecutePipelineResponse_google_firestore_v1_RunAggregationQueryRequest_google_firestore_v1_RunAggregationQueryResponse_google_firestore_v1_WriteRequest_google_firestore_v1_WriteRequest_LabelsEntry_google_firestore_v1_WriteResponse_google_firestore_v1_ListenRequest_google_firestore_v1_ListenRequest_LabelsEntry_google_firestore_v1_ListenResponse_google_firestore_v1_Target_google_firestore_v1_Target_DocumentsTarget_google_firestore_v1_Target_QueryTarget_google_firestore_v1_TargetChange_google_firestore_v1_ListCollectionIdsRequest_google_firestore_v1_ListCollectionIdsResponse) #endif @@ -610,6 +627,61 @@ std::string google_firestore_v1_RunQueryResponse::ToString(int indent) const { return tostring_header + tostring_result + tostring_tail; } +std::string google_firestore_v1_ExecutePipelineRequest::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "ExecutePipelineRequest", this); + std::string tostring_result; + + tostring_result += PrintPrimitiveField("database: ", + database, indent + 1, false); + switch (which_pipeline_type) { + case google_firestore_v1_ExecutePipelineRequest_structured_pipeline_tag: + tostring_result += PrintMessageField("structured_pipeline ", + pipeline_type.structured_pipeline, indent + 1, true); + break; + } + switch (which_consistency_selector) { + case google_firestore_v1_ExecutePipelineRequest_transaction_tag: + tostring_result += PrintPrimitiveField("transaction: ", + consistency_selector.transaction, indent + 1, true); + break; + case google_firestore_v1_ExecutePipelineRequest_new_transaction_tag: + tostring_result += PrintMessageField("new_transaction ", + consistency_selector.new_transaction, indent + 1, true); + break; + case google_firestore_v1_ExecutePipelineRequest_read_time_tag: + tostring_result += PrintMessageField("read_time ", + consistency_selector.read_time, indent + 1, true); + break; + } + + bool is_root = indent == 0; + if (!tostring_result.empty() || is_root) { + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; + } else { + return ""; + } +} + +std::string google_firestore_v1_ExecutePipelineResponse::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "ExecutePipelineResponse", this); + std::string tostring_result; + + tostring_result += PrintPrimitiveField("transaction: ", + transaction, indent + 1, false); + for (pb_size_t i = 0; i != results_count; ++i) { + tostring_result += PrintMessageField("results ", + results[i], indent + 1, true); + } + tostring_result += PrintMessageField("execution_time ", + execution_time, indent + 1, false); + tostring_result += PrintMessageField("explain_stats ", + explain_stats, indent + 1, false); + + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; +} + std::string google_firestore_v1_RunAggregationQueryRequest::ToString(int indent) const { std::string tostring_header = PrintHeader(indent, "RunAggregationQueryRequest", this); std::string tostring_result; diff --git a/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.h index 3dd603a5b09..a6d32a0862d 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,12 +23,18 @@ #include "google/api/annotations.nanopb.h" +#include "google/api/field_behavior.nanopb.h" + #include "google/firestore/v1/aggregation_result.nanopb.h" #include "google/firestore/v1/common.nanopb.h" #include "google/firestore/v1/document.nanopb.h" +#include "google/firestore/v1/explain_stats.nanopb.h" + +#include "google/firestore/v1/pipeline.nanopb.h" + #include "google/firestore/v1/query.nanopb.h" #include "google/firestore/v1/write.nanopb.h" @@ -210,6 +216,34 @@ typedef struct _google_firestore_v1_DeleteDocumentRequest { /* @@protoc_insertion_point(struct:google_firestore_v1_DeleteDocumentRequest) */ } google_firestore_v1_DeleteDocumentRequest; +typedef struct _google_firestore_v1_ExecutePipelineRequest { + pb_bytes_array_t *database; + pb_size_t which_pipeline_type; + union { + google_firestore_v1_StructuredPipeline structured_pipeline; + } pipeline_type; + pb_size_t which_consistency_selector; + union { + pb_bytes_array_t *transaction; + google_firestore_v1_TransactionOptions new_transaction; + google_protobuf_Timestamp read_time; + } consistency_selector; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_ExecutePipelineRequest) */ +} google_firestore_v1_ExecutePipelineRequest; + +typedef struct _google_firestore_v1_ExecutePipelineResponse { + pb_bytes_array_t *transaction; + pb_size_t results_count; + struct _google_firestore_v1_Document *results; + google_protobuf_Timestamp execution_time; + google_firestore_v1_ExplainStats explain_stats; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_ExecutePipelineResponse) */ +} google_firestore_v1_ExecutePipelineResponse; + typedef struct _google_firestore_v1_GetDocumentRequest { pb_bytes_array_t *name; google_firestore_v1_DocumentMask mask; @@ -414,6 +448,8 @@ typedef struct _google_firestore_v1_ListenRequest { #define google_firestore_v1_RollbackRequest_init_default {NULL, NULL} #define google_firestore_v1_RunQueryRequest_init_default {NULL, 0, {google_firestore_v1_StructuredQuery_init_default}, 0, {NULL}} #define google_firestore_v1_RunQueryResponse_init_default {google_firestore_v1_Document_init_default, NULL, google_protobuf_Timestamp_init_default, 0} +#define google_firestore_v1_ExecutePipelineRequest_init_default {NULL, 0, {google_firestore_v1_StructuredPipeline_init_default}, 0, {NULL}} +#define google_firestore_v1_ExecutePipelineResponse_init_default {NULL, 0, NULL, google_protobuf_Timestamp_init_default, google_firestore_v1_ExplainStats_init_default} #define google_firestore_v1_RunAggregationQueryRequest_init_default {NULL, 0, {google_firestore_v1_StructuredAggregationQuery_init_default}, 0, {NULL}} #define google_firestore_v1_RunAggregationQueryResponse_init_default {google_firestore_v1_AggregationResult_init_default, NULL, google_protobuf_Timestamp_init_default} #define google_firestore_v1_WriteRequest_init_default {NULL, NULL, 0, NULL, NULL, 0, NULL} @@ -443,6 +479,8 @@ typedef struct _google_firestore_v1_ListenRequest { #define google_firestore_v1_RollbackRequest_init_zero {NULL, NULL} #define google_firestore_v1_RunQueryRequest_init_zero {NULL, 0, {google_firestore_v1_StructuredQuery_init_zero}, 0, {NULL}} #define google_firestore_v1_RunQueryResponse_init_zero {google_firestore_v1_Document_init_zero, NULL, google_protobuf_Timestamp_init_zero, 0} +#define google_firestore_v1_ExecutePipelineRequest_init_zero {NULL, 0, {google_firestore_v1_StructuredPipeline_init_zero}, 0, {NULL}} +#define google_firestore_v1_ExecutePipelineResponse_init_zero {NULL, 0, NULL, google_protobuf_Timestamp_init_zero, google_firestore_v1_ExplainStats_init_zero} #define google_firestore_v1_RunAggregationQueryRequest_init_zero {NULL, 0, {google_firestore_v1_StructuredAggregationQuery_init_zero}, 0, {NULL}} #define google_firestore_v1_RunAggregationQueryResponse_init_zero {google_firestore_v1_AggregationResult_init_zero, NULL, google_protobuf_Timestamp_init_zero} #define google_firestore_v1_WriteRequest_init_zero {NULL, NULL, 0, NULL, NULL, 0, NULL} @@ -500,6 +538,15 @@ typedef struct _google_firestore_v1_ListenRequest { #define google_firestore_v1_CreateDocumentRequest_mask_tag 5 #define google_firestore_v1_DeleteDocumentRequest_name_tag 1 #define google_firestore_v1_DeleteDocumentRequest_current_document_tag 2 +#define google_firestore_v1_ExecutePipelineRequest_structured_pipeline_tag 2 +#define google_firestore_v1_ExecutePipelineRequest_transaction_tag 5 +#define google_firestore_v1_ExecutePipelineRequest_new_transaction_tag 6 +#define google_firestore_v1_ExecutePipelineRequest_read_time_tag 7 +#define google_firestore_v1_ExecutePipelineRequest_database_tag 1 +#define google_firestore_v1_ExecutePipelineResponse_transaction_tag 1 +#define google_firestore_v1_ExecutePipelineResponse_results_tag 2 +#define google_firestore_v1_ExecutePipelineResponse_execution_time_tag 3 +#define google_firestore_v1_ExecutePipelineResponse_explain_stats_tag 4 #define google_firestore_v1_GetDocumentRequest_transaction_tag 3 #define google_firestore_v1_GetDocumentRequest_read_time_tag 5 #define google_firestore_v1_GetDocumentRequest_name_tag 1 @@ -581,6 +628,8 @@ extern const pb_field_t google_firestore_v1_CommitResponse_fields[3]; extern const pb_field_t google_firestore_v1_RollbackRequest_fields[3]; extern const pb_field_t google_firestore_v1_RunQueryRequest_fields[6]; extern const pb_field_t google_firestore_v1_RunQueryResponse_fields[5]; +extern const pb_field_t google_firestore_v1_ExecutePipelineRequest_fields[6]; +extern const pb_field_t google_firestore_v1_ExecutePipelineResponse_fields[5]; extern const pb_field_t google_firestore_v1_RunAggregationQueryRequest_fields[6]; extern const pb_field_t google_firestore_v1_RunAggregationQueryResponse_fields[4]; extern const pb_field_t google_firestore_v1_WriteRequest_fields[6]; @@ -612,6 +661,8 @@ extern const pb_field_t google_firestore_v1_ListCollectionIdsResponse_fields[3]; /* google_firestore_v1_RollbackRequest_size depends on runtime parameters */ /* google_firestore_v1_RunQueryRequest_size depends on runtime parameters */ /* google_firestore_v1_RunQueryResponse_size depends on runtime parameters */ +/* google_firestore_v1_ExecutePipelineRequest_size depends on runtime parameters */ +/* google_firestore_v1_ExecutePipelineResponse_size depends on runtime parameters */ /* google_firestore_v1_RunAggregationQueryRequest_size depends on runtime parameters */ /* google_firestore_v1_RunAggregationQueryResponse_size depends on runtime parameters */ /* google_firestore_v1_WriteRequest_size depends on runtime parameters */ diff --git a/Firestore/Protos/nanopb/google/firestore/v1/pipeline.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/pipeline.nanopb.cc new file mode 100644 index 00000000000..96739c3630c --- /dev/null +++ b/Firestore/Protos/nanopb/google/firestore/v1/pipeline.nanopb.cc @@ -0,0 +1,106 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.8 */ + +#include "pipeline.nanopb.h" + +#include "Firestore/core/src/nanopb/pretty_printing.h" + +namespace firebase { +namespace firestore { + +using nanopb::PrintEnumField; +using nanopb::PrintHeader; +using nanopb::PrintMessageField; +using nanopb::PrintPrimitiveField; +using nanopb::PrintTail; + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t google_firestore_v1_StructuredPipeline_fields[3] = { + PB_FIELD( 1, MESSAGE , SINGULAR, STATIC , FIRST, google_firestore_v1_StructuredPipeline, pipeline, pipeline, &google_firestore_v1_Pipeline_fields), + PB_FIELD( 2, MESSAGE , REPEATED, POINTER , OTHER, google_firestore_v1_StructuredPipeline, options, pipeline, &google_firestore_v1_StructuredPipeline_OptionsEntry_fields), + PB_LAST_FIELD +}; + +const pb_field_t google_firestore_v1_StructuredPipeline_OptionsEntry_fields[3] = { + PB_FIELD( 1, BYTES , SINGULAR, POINTER , FIRST, google_firestore_v1_StructuredPipeline_OptionsEntry, key, key, 0), + PB_FIELD( 2, MESSAGE , SINGULAR, STATIC , OTHER, google_firestore_v1_StructuredPipeline_OptionsEntry, value, key, &google_firestore_v1_Value_fields), + PB_LAST_FIELD +}; + + +/* Check that field information fits in pb_field_t */ +#if !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_32BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in 8 or 16 bit + * field descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_StructuredPipeline, pipeline) < 65536 && pb_membersize(google_firestore_v1_StructuredPipeline_OptionsEntry, value) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_firestore_v1_StructuredPipeline_google_firestore_v1_StructuredPipeline_OptionsEntry) +#endif + +#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT) +/* If you get an error here, it means that you need to define PB_FIELD_16BIT + * compile-time option. You can do that in pb.h or on compiler command line. + * + * The reason you need to do this is that some of your messages contain tag + * numbers or field sizes that are larger than what can fit in the default + * 8 bit descriptors. + */ +PB_STATIC_ASSERT((pb_membersize(google_firestore_v1_StructuredPipeline, pipeline) < 256 && pb_membersize(google_firestore_v1_StructuredPipeline_OptionsEntry, value) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_firestore_v1_StructuredPipeline_google_firestore_v1_StructuredPipeline_OptionsEntry) +#endif + + +std::string google_firestore_v1_StructuredPipeline::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "StructuredPipeline", this); + std::string tostring_result; + + tostring_result += PrintMessageField("pipeline ", + pipeline, indent + 1, false); + for (pb_size_t i = 0; i != options_count; ++i) { + tostring_result += PrintMessageField("options ", + options[i], indent + 1, true); + } + + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; +} + +std::string google_firestore_v1_StructuredPipeline_OptionsEntry::ToString(int indent) const { + std::string tostring_header = PrintHeader(indent, "OptionsEntry", this); + std::string tostring_result; + + tostring_result += PrintPrimitiveField("key: ", key, indent + 1, false); + tostring_result += PrintMessageField("value ", value, indent + 1, false); + + std::string tostring_tail = PrintTail(indent); + return tostring_header + tostring_result + tostring_tail; +} + +} // namespace firestore +} // namespace firebase + +/* @@protoc_insertion_point(eof) */ diff --git a/Firestore/Protos/nanopb/google/firestore/v1/pipeline.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/pipeline.nanopb.h new file mode 100644 index 00000000000..df88e827f68 --- /dev/null +++ b/Firestore/Protos/nanopb/google/firestore/v1/pipeline.nanopb.h @@ -0,0 +1,92 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.8 */ + +#ifndef PB_GOOGLE_FIRESTORE_V1_PIPELINE_NANOPB_H_INCLUDED +#define PB_GOOGLE_FIRESTORE_V1_PIPELINE_NANOPB_H_INCLUDED +#include + +#include "google/api/field_behavior.nanopb.h" + +#include "google/firestore/v1/document.nanopb.h" + +#include + +namespace firebase { +namespace firestore { + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Struct definitions */ +typedef struct _google_firestore_v1_StructuredPipeline { + google_firestore_v1_Pipeline pipeline; + pb_size_t options_count; + struct _google_firestore_v1_StructuredPipeline_OptionsEntry *options; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_StructuredPipeline) */ +} google_firestore_v1_StructuredPipeline; + +typedef struct _google_firestore_v1_StructuredPipeline_OptionsEntry { + pb_bytes_array_t *key; + google_firestore_v1_Value value; + + std::string ToString(int indent = 0) const; +/* @@protoc_insertion_point(struct:google_firestore_v1_StructuredPipeline_OptionsEntry) */ +} google_firestore_v1_StructuredPipeline_OptionsEntry; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define google_firestore_v1_StructuredPipeline_init_default {google_firestore_v1_Pipeline_init_default, 0, NULL} +#define google_firestore_v1_StructuredPipeline_OptionsEntry_init_default {NULL, google_firestore_v1_Value_init_default} +#define google_firestore_v1_StructuredPipeline_init_zero {google_firestore_v1_Pipeline_init_zero, 0, NULL} +#define google_firestore_v1_StructuredPipeline_OptionsEntry_init_zero {NULL, google_firestore_v1_Value_init_zero} + +/* Field tags (for use in manual encoding/decoding) */ +#define google_firestore_v1_StructuredPipeline_pipeline_tag 1 +#define google_firestore_v1_StructuredPipeline_options_tag 2 +#define google_firestore_v1_StructuredPipeline_OptionsEntry_key_tag 1 +#define google_firestore_v1_StructuredPipeline_OptionsEntry_value_tag 2 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t google_firestore_v1_StructuredPipeline_fields[3]; +extern const pb_field_t google_firestore_v1_StructuredPipeline_OptionsEntry_fields[3]; + +/* Maximum encoded size of messages (where known) */ +/* google_firestore_v1_StructuredPipeline_size depends on runtime parameters */ +/* google_firestore_v1_StructuredPipeline_OptionsEntry_size depends on runtime parameters */ + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define PIPELINE_MESSAGES \ + + +#endif + +} // namespace firestore +} // namespace firebase + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.cc index decd34e2ca2..ca3ce6c85d6 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.h index cac63add141..b54d343853f 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/v1/query.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.cc b/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.cc index d423c292d4a..1f4a31bb164 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.cc +++ b/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.h b/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.h index 0db9c6d2874..9fd6d1688bd 100644 --- a/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.h +++ b/Firestore/Protos/nanopb/google/firestore/v1/write.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/any.nanopb.cc b/Firestore/Protos/nanopb/google/protobuf/any.nanopb.cc index 2a57547086a..5efdaf04dd4 100644 --- a/Firestore/Protos/nanopb/google/protobuf/any.nanopb.cc +++ b/Firestore/Protos/nanopb/google/protobuf/any.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/any.nanopb.h b/Firestore/Protos/nanopb/google/protobuf/any.nanopb.h index c06c82ca2db..5a418826834 100644 --- a/Firestore/Protos/nanopb/google/protobuf/any.nanopb.h +++ b/Firestore/Protos/nanopb/google/protobuf/any.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.cc b/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.cc index ea00f4e2640..bc43bb31233 100644 --- a/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.cc +++ b/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.h b/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.h index be77b64f2b7..5820d750a0d 100644 --- a/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.h +++ b/Firestore/Protos/nanopb/google/protobuf/empty.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.cc b/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.cc index 1eeb1d963c8..9cc956eb61a 100644 --- a/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.cc +++ b/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.h b/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.h index 086fabdc900..9fa79620456 100644 --- a/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.h +++ b/Firestore/Protos/nanopb/google/protobuf/struct.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.cc b/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.cc index d45c5991ef4..cfa685b724e 100644 --- a/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.cc +++ b/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.h b/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.h index a094a954fbc..d5757078e51 100644 --- a/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.h +++ b/Firestore/Protos/nanopb/google/protobuf/timestamp.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.cc b/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.cc index e9832439ffc..a6f03ac797b 100644 --- a/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.cc +++ b/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.h b/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.h index 7efae8dc674..98da8de2209 100644 --- a/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.h +++ b/Firestore/Protos/nanopb/google/protobuf/wrappers.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/rpc/status.nanopb.cc b/Firestore/Protos/nanopb/google/rpc/status.nanopb.cc index b71c001f277..cf7cc2768d9 100644 --- a/Firestore/Protos/nanopb/google/rpc/status.nanopb.cc +++ b/Firestore/Protos/nanopb/google/rpc/status.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/rpc/status.nanopb.h b/Firestore/Protos/nanopb/google/rpc/status.nanopb.h index cadd9ece3a0..bd59ff0a20e 100644 --- a/Firestore/Protos/nanopb/google/rpc/status.nanopb.h +++ b/Firestore/Protos/nanopb/google/rpc/status.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/type/latlng.nanopb.cc b/Firestore/Protos/nanopb/google/type/latlng.nanopb.cc index f6b9e6870e3..378c66500bf 100644 --- a/Firestore/Protos/nanopb/google/type/latlng.nanopb.cc +++ b/Firestore/Protos/nanopb/google/type/latlng.nanopb.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/nanopb/google/type/latlng.nanopb.h b/Firestore/Protos/nanopb/google/type/latlng.nanopb.h index 2daf244dd19..1e78b1896ca 100644 --- a/Firestore/Protos/nanopb/google/type/latlng.nanopb.h +++ b/Firestore/Protos/nanopb/google/type/latlng.nanopb.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 Google LLC + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Protos/protos/google/api/field_behavior.proto b/Firestore/Protos/protos/google/api/field_behavior.proto new file mode 100644 index 00000000000..3c114c3fc8e --- /dev/null +++ b/Firestore/Protos/protos/google/api/field_behavior.proto @@ -0,0 +1,104 @@ +// Copyright 2023 Google LLC +// +// 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. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "FieldBehaviorProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.FieldOptions { + // A designation of a specific field behavior (required, output only, etc.) + // in protobuf messages. + // + // Examples: + // + // string name = 1 [(google.api.field_behavior) = REQUIRED]; + // State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // google.protobuf.Duration ttl = 1 + // [(google.api.field_behavior) = INPUT_ONLY]; + // google.protobuf.Timestamp expire_time = 1 + // [(google.api.field_behavior) = OUTPUT_ONLY, + // (google.api.field_behavior) = IMMUTABLE]; + repeated google.api.FieldBehavior field_behavior = 1052 [packed = false]; +} + +// An indicator of the behavior of a given field (for example, that a field +// is required in requests, or given as output but ignored as input). +// This **does not** change the behavior in protocol buffers itself; it only +// denotes the behavior and may affect how API tooling handles the field. +// +// Note: This enum **may** receive new values in the future. +enum FieldBehavior { + // Conventional default for enums. Do not use this. + FIELD_BEHAVIOR_UNSPECIFIED = 0; + + // Specifically denotes a field as optional. + // While all fields in protocol buffers are optional, this may be specified + // for emphasis if appropriate. + OPTIONAL = 1; + + // Denotes a field as required. + // This indicates that the field **must** be provided as part of the request, + // and failure to do so will cause an error (usually `INVALID_ARGUMENT`). + REQUIRED = 2; + + // Denotes a field as output only. + // This indicates that the field is provided in responses, but including the + // field in a request does nothing (the server *must* ignore it and + // *must not* throw an error as a result of the field's presence). + OUTPUT_ONLY = 3; + + // Denotes a field as input only. + // This indicates that the field is provided in requests, and the + // corresponding field is not included in output. + INPUT_ONLY = 4; + + // Denotes a field as immutable. + // This indicates that the field may be set once in a request to create a + // resource, but may not be changed thereafter. + IMMUTABLE = 5; + + // Denotes that a (repeated) field is an unordered list. + // This indicates that the service may provide the elements of the list + // in any arbitrary order, rather than the order the user originally + // provided. Additionally, the list's order may or may not be stable. + UNORDERED_LIST = 6; + + // Denotes that this field returns a non-empty default value if not set. + // This indicates that if the user provides the empty value in a request, + // a non-empty value will be returned. The user will not be aware of what + // non-empty value to expect. + NON_EMPTY_DEFAULT = 7; + + // Denotes that the field in a resource (a message annotated with + // google.api.resource) is used in the resource name to uniquely identify the + // resource. For AIP-compliant APIs, this should only be applied to the + // `name` field on the resource. + // + // This behavior should not be applied to references to other resources within + // the message. + // + // The identifier field of resources often have different field behavior + // depending on the request it is embedded in (e.g. for Create methods name + // is optional and unused, while for Update methods it is required). Instead + // of method-specific annotations, only `IDENTIFIER` is required. + IDENTIFIER = 8; +} \ No newline at end of file diff --git a/Firestore/Protos/protos/google/firestore/v1/document.proto b/Firestore/Protos/protos/google/firestore/v1/document.proto index 7414c3c2c48..ec7de3d5aca 100644 --- a/Firestore/Protos/protos/google/firestore/v1/document.proto +++ b/Firestore/Protos/protos/google/firestore/v1/document.proto @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC. +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,24 +11,24 @@ // 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. -// syntax = "proto3"; package google.firestore.v1; +import "google/api/field_behavior.proto"; import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "google/type/latlng.proto"; -option csharp_namespace = "Google.Cloud.Firestore.V1Beta1"; -option go_package = "google.golang.org/genproto/googleapis/firestore/v1;firestore"; +option csharp_namespace = "Google.Cloud.Firestore.V1"; +option go_package = "cloud.google.com/go/firestore/apiv1/firestorepb;firestorepb"; option java_multiple_files = true; option java_outer_classname = "DocumentProto"; option java_package = "com.google.firestore.v1"; option objc_class_prefix = "GCFS"; -option php_namespace = "Google\\Cloud\\Firestore\\V1beta1"; - +option php_namespace = "Google\\Cloud\\Firestore\\V1"; +option ruby_package = "Google::Cloud::Firestore::V1"; // A Firestore document. // @@ -42,23 +42,23 @@ message Document { // // The map keys represent field names. // - // A simple field name contains only characters `a` to `z`, `A` to `Z`, - // `0` to `9`, or `_`, and must not start with `0` to `9`. For example, - // `foo_bar_17`. - // // Field names matching the regular expression `__.*__` are reserved. Reserved - // field names are forbidden except in certain documented contexts. The map - // keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be + // field names are forbidden except in certain documented contexts. The field + // names, represented as UTF-8, must not exceed 1,500 bytes and cannot be // empty. // // Field paths may be used in other contexts to refer to structured fields - // defined here. For `map_value`, the field path is represented by the simple - // or quoted field names of the containing fields, delimited by `.`. For - // example, the structured field - // `"foo" : { map_value: { "x&y" : { string_value: "hello" }}}` would be - // represented by the field path `foo.x&y`. + // defined here. For `map_value`, the field path is represented by a + // dot-delimited (`.`) string of segments. Each segment is either a simple + // field name (defined below) or a quoted field name. For example, the + // structured field `"foo" : { map_value: { "x&y" : { string_value: "hello" + // }}}` would be represented by the field path `` foo.`x&y` ``. + // + // A simple field name contains only characters `a` to `z`, `A` to `Z`, + // `0` to `9`, or `_`, and must not start with `0` to `9`. For example, + // `foo_bar_17`. // - // Within a field path, a quoted field name starts and ends with `` ` `` and + // A quoted field name starts and ends with `` ` `` and // may contain any character. Some characters, including `` ` ``, must be // escaped using a `\`. For example, `` `x&y` `` represents `x&y` and // `` `bak\`tik` `` represents `` bak`tik ``. @@ -123,12 +123,38 @@ message Value { // An array value. // - // Cannot directly contain another array value, though can contain an + // Cannot directly contain another array value, though can contain a // map which contains another array. ArrayValue array_value = 9; // A map value. MapValue map_value = 6; + + // Value which references a field. + // + // This is considered relative (vs absolute) since it only refers to a field + // and not a field within a particular document. + // + // **Requires:** + // + // * Must follow [field reference][FieldReference.field_path] limitations. + // + // * Not allowed to be used when writing documents. + string field_reference_value = 19; + + // A value that represents an unevaluated expression. + // + // **Requires:** + // + // * Not allowed to be used when writing documents. + Function function_value = 20; + + // A value that represents an unevaluated pipeline. + // + // **Requires:** + // + // * Not allowed to be used when writing documents. + Pipeline pipeline_value = 21; } } @@ -148,3 +174,67 @@ message MapValue { // not exceed 1,500 bytes and cannot be empty. map fields = 1; } + +// Represents an unevaluated scalar expression. +// +// For example, the expression `like(user_name, "%alice%")` is represented as: +// +// ``` +// name: "like" +// args { field_reference: "user_name" } +// args { string_value: "%alice%" } +// ``` +message Function { + // Required. The name of the function to evaluate. + // + // **Requires:** + // + // * must be in snake case (lower case with underscore separator). + string name = 1 [(google.api.field_behavior) = REQUIRED]; + + // Optional. Ordered list of arguments the given function expects. + repeated Value args = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Optional named arguments that certain functions may support. + map options = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// A Firestore query represented as an ordered list of operations / stages. +message Pipeline { + // A single operation within a pipeline. + // + // A stage is made up of a unique name, and a list of arguments. The exact + // number of arguments & types is dependent on the stage type. + // + // To give an example, the stage `filter(state = "MD")` would be encoded as: + // + // ``` + // name: "filter" + // args { + // function_value { + // name: "eq" + // args { field_reference_value: "state" } + // args { string_value: "MD" } + // } + // } + // ``` + // + // See public documentation for the full list. + message Stage { + // Required. The name of the stage to evaluate. + // + // **Requires:** + // + // * must be in snake case (lower case with underscore separator). + string name = 1 [(google.api.field_behavior) = REQUIRED]; + + // Optional. Ordered list of arguments the given stage expects. + repeated Value args = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Optional named arguments that certain functions may support. + map options = 3 [(google.api.field_behavior) = OPTIONAL]; + } + + // Required. Ordered list of stages to evaluate. + repeated Stage stages = 1 [(google.api.field_behavior) = REQUIRED]; +} \ No newline at end of file diff --git a/Firestore/Protos/protos/google/firestore/v1/explain_stats.proto b/Firestore/Protos/protos/google/firestore/v1/explain_stats.proto new file mode 100644 index 00000000000..285fe34066a --- /dev/null +++ b/Firestore/Protos/protos/google/firestore/v1/explain_stats.proto @@ -0,0 +1,38 @@ +// Copyright 2024 Google LLC +// +// 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. + +syntax = "proto3"; + +package google.firestore.v1; + +import "google/protobuf/any.proto"; + +option csharp_namespace = "Google.Cloud.Firestore.V1"; +option go_package = "cloud.google.com/go/firestore/apiv1/firestorepb;firestorepb"; +option java_multiple_files = true; +option java_outer_classname = "ExplainStatsProto"; +option java_package = "com.google.firestore.v1"; +option php_namespace = "Google\\Cloud\\Firestore\\V1"; +option ruby_package = "Google::Cloud::Firestore::V1"; + +// Specification of Firestore Explain Stats fields. + +// Explain stats for an RPC request, includes both the optimized plan and +// execution stats. +message ExplainStats { + // The format depends on the `output_format` options in the request. + // + // The only option today is `TEXT`, which is a `google.protobuf.StringValue`. + google.protobuf.Any data = 1; +} \ No newline at end of file diff --git a/Firestore/Protos/protos/google/firestore/v1/firestore.proto b/Firestore/Protos/protos/google/firestore/v1/firestore.proto index 9dafa8858c3..ebcb1249773 100644 --- a/Firestore/Protos/protos/google/firestore/v1/firestore.proto +++ b/Firestore/Protos/protos/google/firestore/v1/firestore.proto @@ -18,9 +18,12 @@ syntax = "proto3"; package google.firestore.v1; import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; import "google/firestore/v1/aggregation_result.proto"; import "google/firestore/v1/common.proto"; import "google/firestore/v1/document.proto"; +import "google/firestore/v1/explain_stats.proto"; +import "google/firestore/v1/pipeline.proto"; import "google/firestore/v1/query.proto"; import "google/firestore/v1/write.proto"; import "google/protobuf/empty.proto"; @@ -138,6 +141,15 @@ service Firestore { }; } + // Executes a pipeline query. + rpc ExecutePipeline(ExecutePipelineRequest) + returns (stream ExecutePipelineResponse) { + option (google.api.http) = { + post: "/v1/{database=projects/*/databases/*}/documents:executePipeline" + body: "*" + }; + } + // Runs an aggregation query. // // Rather than producing [Document][google.firestore.v1.Document] results like [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery], @@ -510,6 +522,81 @@ message RunQueryResponse { int32 skipped_results = 4; } +// The request for +// [Firestore.ExecutePipeline][google.firestore.v1.Firestore.ExecutePipeline]. +message ExecutePipelineRequest { + // Required. Database identifier, in the form + // `projects/{project}/databases/{database}`. + string database = 1 [(google.api.field_behavior) = REQUIRED]; + + oneof pipeline_type { + // A pipelined operation. + StructuredPipeline structured_pipeline = 2; + } + + // Optional consistency arguments, defaults to strong consistency. + oneof consistency_selector { + // Run the query within an already active transaction. + // + // The value here is the opaque transaction ID to execute the query in. + bytes transaction = 5; + + // Execute the pipeline in a new transaction. + // + // The identifier of the newly created transaction will be returned in the + // first response on the stream. This defaults to a read-only transaction. + TransactionOptions new_transaction = 6; + + // Execute the pipeline in a snapshot transaction at the given time. + // + // This must be a microsecond precision timestamp within the past one hour, + // or if Point-in-Time Recovery is enabled, can additionally be a whole + // minute timestamp within the past 7 days. + google.protobuf.Timestamp read_time = 7; + } +} + +// The response for [Firestore.Execute][]. +message ExecutePipelineResponse { + // Newly created transaction identifier. + // + // This field is only specified as part of the first response from the server, + // alongside the `results` field when the original request specified + // [ExecuteRequest.new_transaction][]. + bytes transaction = 1; + + // An ordered batch of results returned executing a pipeline. + // + // The batch size is variable, and can even be zero for when only a partial + // progress message is returned. + // + // The fields present in the returned documents are only those that were + // explicitly requested in the pipeline, this include those like + // [`__name__`][google.firestore.v1.Document.name] & + // [`__update_time__`][google.firestore.v1.Document.update_time]. This is + // explicitly a divergence from `Firestore.RunQuery` / `Firestore.GetDocument` + // RPCs which always return such fields even when they are not specified in + // the [`mask`][google.firestore.v1.DocumentMask]. + repeated Document results = 2; + + // The time at which the document(s) were read. + // + // This may be monotonically increasing; in this case, the previous documents + // in the result stream are guaranteed not to have changed between their + // `execution_time` and this one. + // + // If the query returns no results, a response with `execution_time` and no + // `results` will be sent, and this represents the time at which the operation + // was run. + google.protobuf.Timestamp execution_time = 3; + + // Query explain stats. + // + // Contains all metadata related to pipeline planning and execution, specific + // contents depend on the supplied pipeline options. + ExplainStats explain_stats = 4; +} + // The request for [Firestore.RunAggregationQuery][google.firestore.v1.Firestore.RunAggregationQuery]. message RunAggregationQueryRequest { // Required. The parent resource name. In the format: diff --git a/Firestore/Protos/protos/google/firestore/v1/pipeline.proto b/Firestore/Protos/protos/google/firestore/v1/pipeline.proto new file mode 100644 index 00000000000..33508166ea7 --- /dev/null +++ b/Firestore/Protos/protos/google/firestore/v1/pipeline.proto @@ -0,0 +1,43 @@ +// Copyright 2024 Google LLC +// +// 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. + +syntax = "proto3"; + +package google.firestore.v1; + +import "google/api/field_behavior.proto"; +import "google/firestore/v1/document.proto"; + +option csharp_namespace = "Google.Cloud.Firestore.V1"; +option go_package = "cloud.google.com/go/firestore/apiv1/firestorepb;firestorepb"; +option java_multiple_files = true; +option java_outer_classname = "PipelineProto"; +option java_package = "com.google.firestore.v1"; +option objc_class_prefix = "GCFS"; +option php_namespace = "Google\\Cloud\\Firestore\\V1"; +option ruby_package = "Google::Cloud::Firestore::V1"; + +// A Firestore query represented as an ordered list of operations / stages. +// +// This is considered the top-level function which plans & executes a query. +// It is logically equivalent to `query(stages, options)`, but prevents the +// client from having to build a function wrapper. +message StructuredPipeline { + // Required. The pipeline query to execute. + Pipeline pipeline = 1 [(google.api.field_behavior) = REQUIRED]; + + // Optional. Optional query-level arguments. + // + map options = 2 [(google.api.field_behavior) = OPTIONAL]; +} \ No newline at end of file diff --git a/Firestore/Source/API/FIRFirestore+Internal.h b/Firestore/Source/API/FIRFirestore+Internal.h index 5c5da4c525d..eecc1160a5f 100644 --- a/Firestore/Source/API/FIRFirestore+Internal.h +++ b/Firestore/Source/API/FIRFirestore+Internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2017 Google + * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Firestore/Source/API/FIRPipelineBridge+Internal.h b/Firestore/Source/API/FIRPipelineBridge+Internal.h new file mode 100644 index 00000000000..603bc7b88ac --- /dev/null +++ b/Firestore/Source/API/FIRPipelineBridge+Internal.h @@ -0,0 +1,68 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +#import "FIRPipelineBridge.h" + +#include + +#include "Firestore/core/src/api/expressions.h" +#include "Firestore/core/src/api/firestore.h" +#include "Firestore/core/src/api/pipeline.h" +#include "Firestore/core/src/api/stages.h" + +@class FIRFilter; + +namespace api = firebase::firestore::api; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRExprBridge (Internal) + +- (std::shared_ptr)cppExprWithReader:(FSTUserDataReader *)reader; + +@end + +@interface FIROrderingBridge (Internal) + +- (std::shared_ptr)cppOrderingWithReader:(FSTUserDataReader *)reader; + +@end + +@interface FIRStageBridge (Internal) + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader; + +@end + +@interface __FIRPipelineSnapshotBridge (Internal) + +- (id)initWithCppSnapshot:(api::PipelineSnapshot)snapshot; + +@end + +@interface __FIRPipelineResultBridge (Internal) + +- (id)initWithCppResult:(api::PipelineResult)result db:(std::shared_ptr)db; + +@end + +@interface FIRPipelineBridge (Internal) + +- (std::shared_ptr)cppPipelineWithReader:(FSTUserDataReader *)reader; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/API/FIRPipelineBridge.mm b/Firestore/Source/API/FIRPipelineBridge.mm new file mode 100644 index 00000000000..4a87351c4c5 --- /dev/null +++ b/Firestore/Source/API/FIRPipelineBridge.mm @@ -0,0 +1,1062 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +#import "FIRPipelineBridge.h" + +#import + +#include + +#import "Firestore/Source/API/FIRCollectionReference+Internal.h" +#import "Firestore/Source/API/FIRDocumentReference+Internal.h" +#import "Firestore/Source/API/FIRFieldPath+Internal.h" +#import "Firestore/Source/API/FIRFirestore+Internal.h" +#import "Firestore/Source/API/FIRPipelineBridge+Internal.h" +#import "Firestore/Source/API/FSTUserDataReader.h" +#import "Firestore/Source/API/FSTUserDataWriter.h" +#import "Firestore/Source/API/converters.h" +#import "Firestore/Source/Public/FirebaseFirestore/FIRVectorValue.h" + +#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" + +#include "Firestore/core/src/api/aggregate_expressions.h" +#include "Firestore/core/src/api/document_reference.h" +#include "Firestore/core/src/api/expressions.h" +#include "Firestore/core/src/api/ordering.h" +#include "Firestore/core/src/api/pipeline.h" +#include "Firestore/core/src/api/pipeline_result.h" +#include "Firestore/core/src/api/pipeline_snapshot.h" +#include "Firestore/core/src/api/stages.h" +#include "Firestore/core/src/util/comparison.h" +#include "Firestore/core/src/util/error_apple.h" +#include "Firestore/core/src/util/status.h" +#include "Firestore/core/src/util/string_apple.h" + +using firebase::firestore::api::AddFields; +using firebase::firestore::api::AggregateFunction; +using firebase::firestore::api::AggregateStage; +using firebase::firestore::api::CollectionGroupSource; +using firebase::firestore::api::CollectionSource; +using firebase::firestore::api::Constant; +using firebase::firestore::api::DatabaseSource; +using firebase::firestore::api::DistinctStage; +using firebase::firestore::api::DocumentReference; +using firebase::firestore::api::DocumentsSource; +using firebase::firestore::api::Expr; +using firebase::firestore::api::Field; +using firebase::firestore::api::FindNearestStage; +using firebase::firestore::api::FunctionExpr; +using firebase::firestore::api::LimitStage; +using firebase::firestore::api::MakeFIRTimestamp; +using firebase::firestore::api::OffsetStage; +using firebase::firestore::api::Ordering; +using firebase::firestore::api::Pipeline; +using firebase::firestore::api::RawStage; +using firebase::firestore::api::RemoveFieldsStage; +using firebase::firestore::api::ReplaceWith; +using firebase::firestore::api::Sample; +using firebase::firestore::api::SelectStage; +using firebase::firestore::api::SortStage; +using firebase::firestore::api::Union; +using firebase::firestore::api::Unnest; +using firebase::firestore::api::Where; +using firebase::firestore::model::DeepClone; +using firebase::firestore::model::FieldPath; +using firebase::firestore::nanopb::MakeSharedMessage; +using firebase::firestore::nanopb::SharedMessage; +using firebase::firestore::util::ComparisonResult; +using firebase::firestore::util::MakeCallback; +using firebase::firestore::util::MakeNSString; +using firebase::firestore::util::MakeString; +using firebase::firestore::util::ThrowInvalidArgument; + +NS_ASSUME_NONNULL_BEGIN + +inline std::string EnsureLeadingSlash(const std::string &path) { + if (!path.empty() && path[0] == '/') { + return path; + } + return "/" + path; +} + +@implementation FIRExprBridge +@end + +@implementation FIRFieldBridge { + FIRFieldPath *field_path; + std::shared_ptr field; +} + +- (id)initWithName:(NSString *)name { + self = [super init]; + if (self) { + field_path = [FIRFieldPath pathWithDotSeparatedString:name]; + field = std::make_shared([field_path internalValue].CanonicalString()); + } + return self; +} + +- (id)initWithPath:(FIRFieldPath *)path { + self = [super init]; + if (self) { + field_path = path; + field = std::make_shared([field_path internalValue].CanonicalString()); + } + return self; +} + +- (std::shared_ptr)cppExprWithReader:(FSTUserDataReader *)reader { + return field; +} + +- (NSString *)field_name { + return MakeNSString([field_path internalValue].CanonicalString()); +} + +@end + +@implementation FIRConstantBridge { + std::shared_ptr cpp_constant; + id _input; + Boolean isUserDataRead; +} +- (id)init:(id)input { + self = [super init]; + _input = input; + isUserDataRead = NO; + return self; +} + +- (std::shared_ptr)cppExprWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + cpp_constant = std::make_shared([reader parsedQueryValue:_input]); + } + + isUserDataRead = YES; + return cpp_constant; +} + +@end + +@implementation FIRFunctionExprBridge { + std::shared_ptr cpp_function; + NSString *_name; + NSArray *_args; + Boolean isUserDataRead; +} + +- (nonnull id)initWithName:(NSString *)name Args:(nonnull NSArray *)args { + self = [super init]; + _name = name; + _args = args; + isUserDataRead = NO; + return self; +} + +- (std::shared_ptr)cppExprWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::vector> cpp_args; + for (FIRExprBridge *arg in _args) { + cpp_args.push_back([arg cppExprWithReader:reader]); + } + cpp_function = std::make_shared(MakeString(_name), std::move(cpp_args)); + } + + isUserDataRead = YES; + return cpp_function; +} + +@end + +@implementation FIRAggregateFunctionBridge { + std::shared_ptr cpp_function; + NSString *_name; + NSArray *_args; + Boolean isUserDataRead; +} + +- (nonnull id)initWithName:(NSString *)name Args:(nonnull NSArray *)args { + _name = name; + _args = args; + isUserDataRead = NO; + return self; +} + +- (std::shared_ptr)cppExprWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::vector> cpp_args; + for (FIRExprBridge *arg in _args) { + cpp_args.push_back([arg cppExprWithReader:reader]); + } + cpp_function = std::make_shared(MakeString(_name), std::move(cpp_args)); + } + + isUserDataRead = YES; + return cpp_function; +} + +@end + +@implementation FIROrderingBridge { + std::shared_ptr cpp_ordering; + NSString *_direction; + FIRExprBridge *_expr; + Boolean isUserDataRead; +} + +- (nonnull id)initWithExpr:(FIRExprBridge *)expr Direction:(NSString *)direction { + _expr = expr; + _direction = direction; + isUserDataRead = NO; + return self; +} + +- (std::shared_ptr)cppOrderingWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + cpp_ordering = std::make_shared( + [_expr cppExprWithReader:reader], Ordering::DirectionFromString(MakeString(_direction))); + } + + isUserDataRead = YES; + return cpp_ordering; +} + +@end + +@implementation FIRStageBridge +@end + +@implementation FIRCollectionSourceStageBridge { + std::shared_ptr collection_source; +} + +- (id)initWithRef:(FIRCollectionReference *)ref firestore:(FIRFirestore *)db { + self = [super init]; + if (self) { + if (ref.firestore.databaseID.CompareTo(db.databaseID) != ComparisonResult::Same) { + ThrowInvalidArgument( + "Invalid CollectionReference. The project ID (\"%s\") or the database (\"%s\") does not " + "match " + "the project ID (\"%s\") and database (\"%s\") of the target database of this Pipeline.", + ref.firestore.databaseID.project_id(), ref.firestore.databaseID.database_id(), + db.databaseID.project_id(), db.databaseID.project_id()); + } + collection_source = + std::make_shared(EnsureLeadingSlash(MakeString(ref.path))); + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + return collection_source; +} + +@end + +@implementation FIRDatabaseSourceStageBridge { + std::shared_ptr cpp_database_source; +} + +- (id)init { + self = [super init]; + if (self) { + cpp_database_source = std::make_shared(); + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + return cpp_database_source; +} + +@end + +@implementation FIRCollectionGroupSourceStageBridge { + std::shared_ptr cpp_collection_group_source; +} + +- (id)initWithCollectionId:(NSString *)id { + self = [super init]; + if (self) { + cpp_collection_group_source = std::make_shared(MakeString(id)); + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + return cpp_collection_group_source; +} + +@end + +@implementation FIRDocumentsSourceStageBridge { + std::shared_ptr cpp_document_source; +} + +- (id)initWithDocuments:(NSArray *)documents firestore:(FIRFirestore *)db { + self = [super init]; + if (self) { + std::vector cpp_documents; + for (FIRDocumentReference *doc in documents) { + if (doc.firestore.databaseID.CompareTo(db.databaseID) != ComparisonResult::Same) { + ThrowInvalidArgument("Invalid DocumentReference. The project ID (\"%s\") or the database " + "(\"%s\") does not match " + "the project ID (\"%s\") and database (\"%s\") of the target database " + "of this Pipeline.", + doc.firestore.databaseID.project_id(), + doc.firestore.databaseID.database_id(), db.databaseID.project_id(), + db.databaseID.project_id()); + } + cpp_documents.push_back(EnsureLeadingSlash(MakeString(doc.path))); + } + cpp_document_source = std::make_shared(std::move(cpp_documents)); + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + return cpp_document_source; +} + +@end + +@implementation FIRWhereStageBridge { + FIRExprBridge *_exprBridge; + Boolean isUserDataRead; + std::shared_ptr cpp_where; +} + +- (id)initWithExpr:(FIRExprBridge *)expr { + self = [super init]; + if (self) { + _exprBridge = expr; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + cpp_where = std::make_shared([_exprBridge cppExprWithReader:reader]); + } + + isUserDataRead = YES; + return cpp_where; +} + +@end + +@implementation FIRLimitStageBridge { + Boolean isUserDataRead; + std::shared_ptr cpp_limit_stage; + int32_t limit; +} + +- (id)initWithLimit:(NSInteger)value { + self = [super init]; + if (self) { + isUserDataRead = NO; + limit = static_cast(value); + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + cpp_limit_stage = std::make_shared(limit); + } + + isUserDataRead = YES; + return cpp_limit_stage; +} + +@end + +@implementation FIROffsetStageBridge { + Boolean isUserDataRead; + std::shared_ptr cpp_offset_stage; + int32_t offset; +} + +- (id)initWithOffset:(NSInteger)value { + self = [super init]; + if (self) { + isUserDataRead = NO; + offset = static_cast(value); + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + cpp_offset_stage = std::make_shared(offset); + } + + isUserDataRead = YES; + return cpp_offset_stage; +} + +@end + +// TBD + +@implementation FIRAddFieldsStageBridge { + NSDictionary *_fields; + Boolean isUserDataRead; + std::shared_ptr cpp_add_fields; +} + +- (id)initWithFields:(NSDictionary *)fields { + self = [super init]; + if (self) { + _fields = fields; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::unordered_map> cpp_fields; + for (NSString *key in _fields) { + cpp_fields[MakeString(key)] = [_fields[key] cppExprWithReader:reader]; + } + cpp_add_fields = std::make_shared(std::move(cpp_fields)); + } + + isUserDataRead = YES; + return cpp_add_fields; +} + +@end + +@implementation FIRRemoveFieldsStageBridge { + NSArray *_fields; + Boolean isUserDataRead; + std::shared_ptr cpp_remove_fields; +} + +- (id)initWithFields:(NSArray *)fields { + self = [super init]; + if (self) { + _fields = fields; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::vector cpp_fields; + for (id field in _fields) { + cpp_fields.push_back(Field(MakeString(field))); + } + cpp_remove_fields = std::make_shared(std::move(cpp_fields)); + } + + isUserDataRead = YES; + return cpp_remove_fields; +} + +@end + +@implementation FIRSelectStageBridge { + NSDictionary *_selections; + Boolean isUserDataRead; + std::shared_ptr cpp_select; +} + +- (id)initWithSelections:(NSDictionary *)selections { + self = [super init]; + if (self) { + _selections = selections; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::unordered_map> cpp_selections; + for (NSString *key in _selections) { + cpp_selections[MakeString(key)] = [_selections[key] cppExprWithReader:reader]; + } + cpp_select = std::make_shared(std::move(cpp_selections)); + } + + isUserDataRead = YES; + return cpp_select; +} + +@end + +@implementation FIRDistinctStageBridge { + NSDictionary *_groups; + Boolean isUserDataRead; + std::shared_ptr cpp_distinct; +} + +- (id)initWithGroups:(NSDictionary *)groups { + self = [super init]; + if (self) { + _groups = groups; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::unordered_map> cpp_groups; + for (NSString *key in _groups) { + cpp_groups[MakeString(key)] = [_groups[key] cppExprWithReader:reader]; + } + cpp_distinct = std::make_shared(std::move(cpp_groups)); + } + + isUserDataRead = YES; + return cpp_distinct; +} + +@end + +@implementation FIRAggregateStageBridge { + NSDictionary *_accumulators; + NSDictionary *_groups; + Boolean isUserDataRead; + std::shared_ptr cpp_aggregate; +} + +- (id)initWithAccumulators:(NSDictionary *)accumulators + groups:(NSDictionary *)groups { + self = [super init]; + if (self) { + _accumulators = accumulators; + _groups = groups; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::unordered_map> cpp_accumulators; + for (NSString *key in _accumulators) { + cpp_accumulators[MakeString(key)] = [_accumulators[key] cppExprWithReader:reader]; + } + + std::unordered_map> cpp_groups; + for (NSString *key in _groups) { + cpp_groups[MakeString(key)] = [_groups[key] cppExprWithReader:reader]; + } + cpp_aggregate = + std::make_shared(std::move(cpp_accumulators), std::move(cpp_groups)); + } + + isUserDataRead = YES; + return cpp_aggregate; +} + +@end + +@implementation FIRFindNearestStageBridge { + FIRFieldBridge *_field; + FIRVectorValue *_vectorValue; + NSString *_distanceMeasure; + NSNumber *_limit; + FIRExprBridge *_Nullable _distanceField; + Boolean isUserDataRead; + std::shared_ptr cpp_find_nearest; +} + +- (id)initWithField:(FIRFieldBridge *)field + vectorValue:(FIRVectorValue *)vectorValue + distanceMeasure:(NSString *)distanceMeasure + limit:(NSNumber *_Nullable)limit + distanceField:(FIRExprBridge *_Nullable)distanceField { + self = [super init]; + if (self) { + _field = field; + _vectorValue = vectorValue; + _distanceMeasure = distanceMeasure; + _limit = limit; + _distanceField = distanceField; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::unordered_map optional_value; + if (_limit) { + optional_value.emplace(std::make_pair( + std::string("limit"), *DeepClone(*[reader parsedQueryValue:_limit]).release())); + } + + if (_distanceField) { + std::shared_ptr cpp_distance_field = [_distanceField cppExprWithReader:reader]; + optional_value.emplace( + std::make_pair(std::string("distance_field"), cpp_distance_field->to_proto())); + } + + FindNearestStage::DistanceMeasure::Measure measure_enum; + if ([_distanceMeasure isEqualToString:@"cosine"]) { + measure_enum = FindNearestStage::DistanceMeasure::COSINE; + } else if ([_distanceMeasure isEqualToString:@"dot_product"]) { + measure_enum = FindNearestStage::DistanceMeasure::DOT_PRODUCT; + } else { + measure_enum = FindNearestStage::DistanceMeasure::EUCLIDEAN; + } + + cpp_find_nearest = std::make_shared( + [_field cppExprWithReader:reader], [reader parsedQueryValue:_vectorValue], + FindNearestStage::DistanceMeasure(measure_enum), optional_value); + } + + isUserDataRead = YES; + return cpp_find_nearest; +} + +@end + +@implementation FIRSorStageBridge { + NSArray *_orderings; + Boolean isUserDataRead; + std::shared_ptr cpp_sort; +} + +- (id)initWithOrderings:(NSArray *)orderings { + self = [super init]; + if (self) { + _orderings = orderings; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::vector> cpp_orderings; + for (FIROrderingBridge *ordering in _orderings) { + cpp_orderings.push_back([ordering cppOrderingWithReader:reader]); + } + cpp_sort = std::make_shared(std::move(cpp_orderings)); + } + + isUserDataRead = YES; + return cpp_sort; +} + +@end + +@implementation FIRReplaceWithStageBridge { + FIRExprBridge *_expr; + Boolean isUserDataRead; + std::shared_ptr cpp_replace_with; +} + +- (id)initWithExpr:(FIRExprBridge *)expr { + self = [super init]; + if (self) { + _expr = expr; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + cpp_replace_with = std::make_shared([_expr cppExprWithReader:reader]); + } + + isUserDataRead = YES; + return cpp_replace_with; +} + +@end + +@implementation FIRSampleStageBridge { + int64_t _count; + double _percentage; + Boolean isUserDataRead; + NSString *type; + std::shared_ptr cpp_sample; +} + +- (id)initWithCount:(int64_t)count { + self = [super init]; + if (self) { + _count = count; + _percentage = 0; + type = @"count"; + isUserDataRead = NO; + } + return self; +} + +- (id)initWithPercentage:(double)percentage { + self = [super init]; + if (self) { + _percentage = percentage; + _count = 0; + type = @"percentage"; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + if ([type isEqualToString:@"count"]) { + cpp_sample = + std::make_shared(Sample::SampleMode(Sample::SampleMode::DOCUMENTS), _count, 0); + } else { + cpp_sample = + std::make_shared(Sample::SampleMode(Sample::SampleMode::PERCENT), 0, _percentage); + } + } + + isUserDataRead = YES; + return cpp_sample; +} + +@end + +@implementation FIRUnionStageBridge { + FIRPipelineBridge *_other; + Boolean isUserDataRead; + std::shared_ptr cpp_union_stage; +} + +- (id)initWithOther:(FIRPipelineBridge *)other { + self = [super init]; + if (self) { + _other = other; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + cpp_union_stage = std::make_shared([_other cppPipelineWithReader:reader]); + } + + isUserDataRead = YES; + return cpp_union_stage; +} + +@end + +@implementation FIRUnnestStageBridge { + FIRExprBridge *_field; + FIRExprBridge *_Nullable _index_field; + FIRExprBridge *_alias; + Boolean isUserDataRead; + std::shared_ptr cpp_unnest; +} + +- (id)initWithField:(FIRExprBridge *)field + alias:(FIRExprBridge *)alias + indexField:(FIRExprBridge *_Nullable)index_field { + self = [super init]; + if (self) { + _field = field; + _alias = alias; + _index_field = index_field; + isUserDataRead = NO; + } + return self; +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + absl::optional> cpp_index_field; + if (_index_field != nil) { + cpp_index_field = [_index_field cppExprWithReader:reader]; + } else { + cpp_index_field = absl::nullopt; + } + cpp_unnest = std::make_shared([_field cppExprWithReader:reader], + [_alias cppExprWithReader:reader], cpp_index_field); + } + + isUserDataRead = YES; + return cpp_unnest; +} + +@end + +@implementation FIRRawStageBridge { + NSString *_name; + NSArray *_params; + NSDictionary *_Nullable _options; + Boolean isUserDataRead; + std::shared_ptr cpp_generic_stage; +} + +- (id)initWithName:(NSString *)name + params:(NSArray *)params + options:(NSDictionary *_Nullable)options { + self = [super init]; + if (self) { + _name = name; + _params = params; + _options = options; + isUserDataRead = NO; + } + return self; +} + +- (firebase::firestore::google_firestore_v1_Value)convertIdToV1Value:(id)value + reader:(FSTUserDataReader *)reader { + if ([value isKindOfClass:[FIRExprBridge class]]) { + return [((FIRExprBridge *)value) cppExprWithReader:reader]->to_proto(); + } else if ([value isKindOfClass:[FIRAggregateFunctionBridge class]]) { + return [((FIRAggregateFunctionBridge *)value) cppExprWithReader:reader]->to_proto(); + } else if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = (NSDictionary *)value; + + std::unordered_map cpp_dictionary; + for (NSString *key in dictionary) { + if ([dictionary[key] isKindOfClass:[FIRExprBridge class]]) { + cpp_dictionary[MakeString(key)] = + [((FIRExprBridge *)dictionary[key]) cppExprWithReader:reader]->to_proto(); + } else if ([dictionary[key] isKindOfClass:[FIRAggregateFunctionBridge class]]) { + cpp_dictionary[MakeString(key)] = + [((FIRAggregateFunctionBridge *)dictionary[key]) cppExprWithReader:reader]->to_proto(); + } else { + ThrowInvalidArgument( + "Dictionary value must be an FIRExprBridge or FIRAggregateFunctionBridge."); + } + } + + firebase::firestore::google_firestore_v1_Value result; + result.which_value_type = google_firestore_v1_Value_map_value_tag; + + nanopb::SetRepeatedField( + &result.map_value.fields, &result.map_value.fields_count, cpp_dictionary, + [](const std::pair &entry) { + return firebase::firestore::_google_firestore_v1_MapValue_FieldsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second}; + }); + return result; + } else { + ThrowInvalidArgument("Invalid value to convert to google_firestore_v1_Value."); + } +} + +- (std::shared_ptr)cppStageWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::vector cpp_params; + for (id param in _params) { + cpp_params.push_back([self convertIdToV1Value:param reader:reader]); + } + + std::unordered_map> cpp_options; + if (_options) { + for (NSString *key in _options) { + cpp_options[MakeString(key)] = [_options[key] cppExprWithReader:reader]; + } + } + cpp_generic_stage = std::make_shared(MakeString(_name), std::move(cpp_params), + std::move(cpp_options)); + } + + isUserDataRead = YES; + return cpp_generic_stage; +} + +@end + +@interface __FIRPipelineSnapshotBridge () + +@property(nonatomic, strong, readwrite) NSArray<__FIRPipelineResultBridge *> *results; + +@end + +@implementation __FIRPipelineSnapshotBridge { + absl::optional snapshot_; + NSMutableArray<__FIRPipelineResultBridge *> *results_; +} + +- (id)initWithCppSnapshot:(api::PipelineSnapshot)snapshot { + self = [super init]; + if (self) { + snapshot_ = std::move(snapshot); + if (!snapshot_.has_value()) { + results_ = nil; + } else { + NSMutableArray<__FIRPipelineResultBridge *> *results = [NSMutableArray array]; + for (auto &result : snapshot_.value().results()) { + [results addObject:[[__FIRPipelineResultBridge alloc] + initWithCppResult:result + db:snapshot_.value().firestore()]]; + } + results_ = results; + } + } + + return self; +} + +- (NSArray<__FIRPipelineResultBridge *> *)results { + return results_; +} + +- (FIRTimestamp *)execution_time { + if (!snapshot_.has_value()) { + return nil; + } else { + return MakeFIRTimestamp(snapshot_.value().execution_time().timestamp()); + } +} + +@end + +@implementation __FIRPipelineResultBridge { + api::PipelineResult _result; + std::shared_ptr _db; +} + +- (nullable FIRDocumentReference *)reference { + if (!_result.internal_key().has_value()) return nil; + + return [[FIRDocumentReference alloc] initWithKey:_result.internal_key().value() firestore:_db]; +} + +- (nullable NSString *)documentID { + if (!_result.document_id().has_value()) { + return nil; + } + + return MakeNSString(_result.document_id().value()); +} + +- (nullable FIRTimestamp *)create_time { + if (!_result.create_time().has_value()) { + return nil; + } + + return MakeFIRTimestamp(_result.create_time().value().timestamp()); +} + +- (nullable FIRTimestamp *)update_time { + if (!_result.update_time().has_value()) { + return nil; + } + + return MakeFIRTimestamp(_result.update_time().value().timestamp()); +} + +- (id)initWithCppResult:(api::PipelineResult)result db:(std::shared_ptr)db { + self = [super init]; + if (self) { + _result = std::move(result); + _db = std::move(db); + } + + return self; +} + +- (NSDictionary *)data { + return [self dataWithServerTimestampBehavior:FIRServerTimestampBehaviorNone]; +} + +- (NSDictionary *)dataWithServerTimestampBehavior: + (FIRServerTimestampBehavior)serverTimestampBehavior { + absl::optional data = + _result.internal_value()->Get(); + if (!data) return [NSDictionary dictionary]; + + FSTUserDataWriter *dataWriter = + [[FSTUserDataWriter alloc] initWithFirestore:_db + serverTimestampBehavior:serverTimestampBehavior]; + NSDictionary *dictionary = [dataWriter convertedValue:*data]; + NSLog(@"Dictionary contents: %@", dictionary); + return dictionary; +} + +- (nullable id)get:(id)field { + return [self get:field serverTimestampBehavior:FIRServerTimestampBehaviorNone]; +} + +- (nullable id)get:(id)field + serverTimestampBehavior:(FIRServerTimestampBehavior)serverTimestampBehavior { + FieldPath fieldPath; + if ([field isKindOfClass:[NSString class]]) { + fieldPath = FieldPath::FromDotSeparatedString(MakeString(field)); + } else if ([field isKindOfClass:[FIRFieldPath class]]) { + fieldPath = ((FIRFieldPath *)field).internalValue; + } else { + ThrowInvalidArgument("Subscript key must be an NSString or FIRFieldPath."); + } + absl::optional fieldValue = + _result.internal_value()->Get(fieldPath); + if (!fieldValue) return nil; + FSTUserDataWriter *dataWriter = + [[FSTUserDataWriter alloc] initWithFirestore:_db + serverTimestampBehavior:serverTimestampBehavior]; + return [dataWriter convertedValue:*fieldValue]; +} + +@end + +@implementation FIRPipelineBridge { + NSArray *_stages; + FIRFirestore *firestore; + Boolean isUserDataRead; + std::shared_ptr cpp_pipeline; +} + +- (id)initWithStages:(NSArray *)stages db:(FIRFirestore *)db { + _stages = stages; + firestore = db; + isUserDataRead = NO; + return [super init]; +} + +- (void)executeWithCompletion:(void (^)(__FIRPipelineSnapshotBridge *_Nullable result, + NSError *_Nullable error))completion { + [self cppPipelineWithReader:firestore.dataReader]->execute( + [completion](StatusOr maybe_value) { + if (maybe_value.ok()) { + __FIRPipelineSnapshotBridge *bridge = [[__FIRPipelineSnapshotBridge alloc] + initWithCppSnapshot:std::move(maybe_value).ValueOrDie()]; + completion(bridge, nil); + } else { + completion(nil, MakeNSError(std::move(maybe_value).status())); + } + }); +} + +- (std::shared_ptr)cppPipelineWithReader:(FSTUserDataReader *)reader { + if (!isUserDataRead) { + std::vector> cpp_stages; + for (FIRStageBridge *stage in _stages) { + cpp_stages.push_back([stage cppStageWithReader:firestore.dataReader]); + } + cpp_pipeline = std::make_shared(cpp_stages, firestore.wrapped); + } + + isUserDataRead = YES; + return cpp_pipeline; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Public/FirebaseFirestore/FIRPipelineBridge.h b/Firestore/Source/Public/FirebaseFirestore/FIRPipelineBridge.h new file mode 100644 index 00000000000..e148637d48a --- /dev/null +++ b/Firestore/Source/Public/FirebaseFirestore/FIRPipelineBridge.h @@ -0,0 +1,253 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +#import "FIRFirestore.h" + +#import + +#import "FIRDocumentSnapshot.h" + +@class FIRTimestamp; +@class FIRVectorValue; +@class FIRPipelineBridge; +@class FIRFieldPath; + +NS_ASSUME_NONNULL_BEGIN + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(ExprBridge) +@interface FIRExprBridge : NSObject +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(FieldBridge) +@interface FIRFieldBridge : FIRExprBridge +- (id)initWithName:(NSString *)name; +- (id)initWithPath:(FIRFieldPath *)path; +- (NSString *)field_name; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(ConstantBridge) +@interface FIRConstantBridge : FIRExprBridge +- (id)init:(id)input; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(FunctionExprBridge) +@interface FIRFunctionExprBridge : FIRExprBridge +- (id)initWithName:(NSString *)name Args:(NSArray *)args; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(AggregateFunctionBridge) +@interface FIRAggregateFunctionBridge : NSObject +- (id)initWithName:(NSString *)name Args:(NSArray *)args; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(OrderingBridge) +@interface FIROrderingBridge : NSObject +- (id)initWithExpr:(FIRExprBridge *)expr Direction:(NSString *)direction; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(StageBridge) +@interface FIRStageBridge : NSObject +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(CollectionSourceStageBridge) +@interface FIRCollectionSourceStageBridge : FIRStageBridge + +- (id)initWithRef:(FIRCollectionReference *)ref firestore:(FIRFirestore *)db; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(DatabaseSourceStageBridge) +@interface FIRDatabaseSourceStageBridge : FIRStageBridge + +- (id)init; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(CollectionGroupSourceStageBridge) +@interface FIRCollectionGroupSourceStageBridge : FIRStageBridge + +- (id)initWithCollectionId:(NSString *)id; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(DocumentsSourceStageBridge) +@interface FIRDocumentsSourceStageBridge : FIRStageBridge + +- (id)initWithDocuments:(NSArray *)documents firestore:(FIRFirestore *)db; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(WhereStageBridge) +@interface FIRWhereStageBridge : FIRStageBridge + +- (id)initWithExpr:(FIRExprBridge *)expr; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(LimitStageBridge) +@interface FIRLimitStageBridge : FIRStageBridge + +- (id)initWithLimit:(NSInteger)value; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(OffsetStageBridge) +@interface FIROffsetStageBridge : FIRStageBridge + +- (id)initWithOffset:(NSInteger)value; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(AddFieldsStageBridge) +@interface FIRAddFieldsStageBridge : FIRStageBridge +- (id)initWithFields:(NSDictionary *)fields; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(RemoveFieldsStageBridge) +@interface FIRRemoveFieldsStageBridge : FIRStageBridge +- (id)initWithFields:(NSArray *)fields; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(SelectStageBridge) +@interface FIRSelectStageBridge : FIRStageBridge +- (id)initWithSelections:(NSDictionary *)selections; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(DistinctStageBridge) +@interface FIRDistinctStageBridge : FIRStageBridge +- (id)initWithGroups:(NSDictionary *)groups; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(AggregateStageBridge) +@interface FIRAggregateStageBridge : FIRStageBridge +- (id)initWithAccumulators:(NSDictionary *)accumulators + groups:(NSDictionary *)groups; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(FindNearestStageBridge) +@interface FIRFindNearestStageBridge : FIRStageBridge +- (id)initWithField:(FIRFieldBridge *)field + vectorValue:(FIRVectorValue *)vectorValue + distanceMeasure:(NSString *)distanceMeasure + limit:(NSNumber *_Nullable)limit + distanceField:(FIRExprBridge *_Nullable)distanceField; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(SortStageBridge) +@interface FIRSorStageBridge : FIRStageBridge +- (id)initWithOrderings:(NSArray *)orderings; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(ReplaceWithStageBridge) +@interface FIRReplaceWithStageBridge : FIRStageBridge +- (id)initWithExpr:(FIRExprBridge *)expr; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(SampleStageBridge) +@interface FIRSampleStageBridge : FIRStageBridge +- (id)initWithCount:(int64_t)count; +- (id)initWithPercentage:(double)percentage; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(UnionStageBridge) +@interface FIRUnionStageBridge : FIRStageBridge +- (id)initWithOther:(FIRPipelineBridge *)other; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(UnnestStageBridge) +@interface FIRUnnestStageBridge : FIRStageBridge +- (id)initWithField:(FIRExprBridge *)field + alias:(FIRExprBridge *)alias + indexField:(FIRExprBridge *_Nullable)index_field; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(RawStageBridge) +@interface FIRRawStageBridge : FIRStageBridge +- (id)initWithName:(NSString *)name + params:(NSArray *)params + options:(NSDictionary *_Nullable)options; +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(__PipelineResultBridge) +@interface __FIRPipelineResultBridge : NSObject + +@property(nonatomic, strong, readonly, nullable) FIRDocumentReference *reference; + +@property(nonatomic, copy, readonly, nullable) NSString *documentID; + +@property(nonatomic, strong, readonly, nullable) FIRTimestamp *create_time; + +@property(nonatomic, strong, readonly, nullable) FIRTimestamp *update_time; + +- (NSDictionary *)data; + +- (NSDictionary *)dataWithServerTimestampBehavior: + (FIRServerTimestampBehavior)serverTimestampBehavior; + +- (nullable id)get:(id)field; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(__PipelineSnapshotBridge) +@interface __FIRPipelineSnapshotBridge : NSObject + +@property(nonatomic, strong, readonly) NSArray<__FIRPipelineResultBridge *> *results; + +@property(nonatomic, strong, readonly) FIRTimestamp *execution_time; + +@end + +NS_SWIFT_SENDABLE +NS_SWIFT_NAME(PipelineBridge) +@interface FIRPipelineBridge : NSObject + +/** :nodoc: */ +- (id)initWithStages:(NSArray *)stages db:(FIRFirestore *)db; + +- (void)executeWithCompletion:(void (^)(__FIRPipelineSnapshotBridge *_Nullable result, + NSError *_Nullable error))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Public/FirebaseFirestore/FirebaseFirestore.h b/Firestore/Source/Public/FirebaseFirestore/FirebaseFirestore.h index 7fabad323c8..0f10968565a 100644 --- a/Firestore/Source/Public/FirebaseFirestore/FirebaseFirestore.h +++ b/Firestore/Source/Public/FirebaseFirestore/FirebaseFirestore.h @@ -32,6 +32,7 @@ #import "FIRListenerRegistration.h" #import "FIRLoadBundleTask.h" #import "FIRLocalCacheSettings.h" +#import "FIRPipelineBridge.h" #import "FIRQuery.h" #import "FIRQuerySnapshot.h" #import "FIRSnapshotListenOptions.h" diff --git a/Firestore/Swift/Source/ExprImpl.swift b/Firestore/Swift/Source/ExprImpl.swift new file mode 100644 index 00000000000..51a82966b86 --- /dev/null +++ b/Firestore/Swift/Source/ExprImpl.swift @@ -0,0 +1,598 @@ +// Copyright 2025 Google LLC +// +// 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. + +extension Expr { + func toBridge() -> ExprBridge { + return (self as! BridgeWrapper).bridge + } +} + +public extension Expr { + func `as`(_ name: String) -> ExprWithAlias { + return ExprWithAlias(self, name) + } + + // MARK: Arithmetic Operators + + func add(_ value: Expr) -> FunctionExpr { + return FunctionExpr("add", [self, value]) + } + + func add(_ value: Sendable) -> FunctionExpr { + return FunctionExpr("add", [self, Helper.sendableToExpr(value)]) + } + + func subtract(_ other: Expr) -> FunctionExpr { + return FunctionExpr("subtract", [self, other]) + } + + func subtract(_ other: Sendable) -> FunctionExpr { + return FunctionExpr("subtract", [self, Helper.sendableToExpr(other)]) + } + + func multiply(_ value: Expr) -> FunctionExpr { + return FunctionExpr("multiply", [self, value]) + } + + func multiply(_ value: Sendable) -> FunctionExpr { + return FunctionExpr("multiply", [self, Helper.sendableToExpr(value)]) + } + + func divide(_ other: Expr) -> FunctionExpr { + return FunctionExpr("divide", [self, other]) + } + + func divide(_ other: Sendable) -> FunctionExpr { + return FunctionExpr("divide", [self, Helper.sendableToExpr(other)]) + } + + func mod(_ other: Expr) -> FunctionExpr { + return FunctionExpr("mod", [self, other]) + } + + func mod(_ other: Sendable) -> FunctionExpr { + return FunctionExpr("mod", [self, Helper.sendableToExpr(other)]) + } + + // MARK: Array Operations + + func arrayConcat(_ secondArray: Expr, _ otherArrays: Expr...) -> FunctionExpr { + return FunctionExpr("array_concat", [self, secondArray] + otherArrays) + } + + func arrayConcat(_ secondArray: [Sendable], _ otherArrays: [Sendable]...) -> FunctionExpr { + let exprs = [self] + [Helper.sendableToExpr(secondArray)] + otherArrays + .map { Helper.sendableToExpr($0) } + return FunctionExpr("array_concat", exprs) + } + + func arrayContains(_ element: Expr) -> BooleanExpr { + return BooleanExpr("array_contains", [self, element]) + } + + func arrayContains(_ element: Sendable) -> BooleanExpr { + return BooleanExpr("array_contains", [self, Helper.sendableToExpr(element)]) + } + + func arrayContainsAll(_ values: [Expr]) -> BooleanExpr { + return BooleanExpr("array_contains_all", [self, Helper.array(values)]) + } + + func arrayContainsAll(_ values: [Sendable]) -> BooleanExpr { + return BooleanExpr("array_contains_all", [self, Helper.array(values)]) + } + + func arrayContainsAny(_ values: [Expr]) -> BooleanExpr { + return BooleanExpr("array_contains_any", [self, Helper.array(values)]) + } + + func arrayContainsAny(_ values: [Sendable]) -> BooleanExpr { + return BooleanExpr("array_contains_any", [self, Helper.array(values)]) + } + + func arrayLength() -> FunctionExpr { + return FunctionExpr("array_length", [self]) + } + + func arrayGet(_ offset: Int) -> FunctionExpr { + return FunctionExpr("array_get", [self, Helper.sendableToExpr(offset)]) + } + + func arrayGet(_ offsetExpr: Expr) -> FunctionExpr { + return FunctionExpr("array_get", [self, offsetExpr]) + } + + func gt(_ other: Expr) -> BooleanExpr { + return BooleanExpr("gt", [self, other]) + } + + func gt(_ other: Sendable) -> BooleanExpr { + let exprOther = Helper.sendableToExpr(other) + return BooleanExpr("gt", [self, exprOther]) + } + + // MARK: - Greater Than or Equal (gte) + + func gte(_ other: Expr) -> BooleanExpr { + return BooleanExpr("gte", [self, other]) + } + + func gte(_ other: Sendable) -> BooleanExpr { + let exprOther = Helper.sendableToExpr(other) + return BooleanExpr("gte", [self, exprOther]) + } + + // MARK: - Less Than (lt) + + func lt(_ other: Expr) -> BooleanExpr { + return BooleanExpr("lt", [self, other]) + } + + func lt(_ other: Sendable) -> BooleanExpr { + let exprOther = Helper.sendableToExpr(other) + return BooleanExpr("lt", [self, exprOther]) + } + + // MARK: - Less Than or Equal (lte) + + func lte(_ other: Expr) -> BooleanExpr { + return BooleanExpr("lte", [self, other]) + } + + func lte(_ other: Sendable) -> BooleanExpr { + let exprOther = Helper.sendableToExpr(other) + return BooleanExpr("lte", [self, exprOther]) + } + + // MARK: - Equal (eq) + + func eq(_ other: Expr) -> BooleanExpr { + return BooleanExpr("eq", [self, other]) + } + + func eq(_ other: Sendable) -> BooleanExpr { + let exprOther = Helper.sendableToExpr(other) + return BooleanExpr("eq", [self, exprOther]) + } + + func neq(_ other: Expr) -> BooleanExpr { + return BooleanExpr("neq", [self, other]) + } + + func neq(_ other: Sendable) -> BooleanExpr { + return BooleanExpr("neq", [self, Helper.sendableToExpr(other)]) + } + + func eqAny(_ others: [Expr]) -> BooleanExpr { + return BooleanExpr("eq_any", [self, Helper.array(others)]) + } + + func eqAny(_ others: [Sendable]) -> BooleanExpr { + return BooleanExpr("eq_any", [self, Helper.array(others)]) + } + + func notEqAny(_ others: [Expr]) -> BooleanExpr { + return BooleanExpr("not_eq_any", [self, Helper.array(others)]) + } + + func notEqAny(_ others: [Sendable]) -> BooleanExpr { + return BooleanExpr("not_eq_any", [self, Helper.array(others)]) + } + + // MARK: Checks + + // --- Added Type Check Operations --- + + func isNan() -> BooleanExpr { + return BooleanExpr("is_nan", [self]) + } + + func isNull() -> BooleanExpr { + return BooleanExpr("is_null", [self]) + } + + func exists() -> BooleanExpr { + return BooleanExpr("exists", [self]) + } + + func isError() -> BooleanExpr { + return BooleanExpr("is_error", [self]) + } + + func isAbsent() -> BooleanExpr { + return BooleanExpr("is_absent", [self]) + } + + func isNotNull() -> BooleanExpr { + return BooleanExpr("is_not_null", [self]) + } + + func isNotNan() -> BooleanExpr { + return BooleanExpr("is_not_nan", [self]) + } + + // --- Added String Operations --- + + func charLength() -> FunctionExpr { + return FunctionExpr("char_length", [self]) + } + + func like(_ pattern: String) -> BooleanExpr { + return BooleanExpr("like", [self, Helper.sendableToExpr(pattern)]) + } + + func like(_ pattern: Expr) -> BooleanExpr { + return BooleanExpr("like", [self, pattern]) + } + + func regexContains(_ pattern: String) -> BooleanExpr { + return BooleanExpr("regex_contains", [self, Helper.sendableToExpr(pattern)]) + } + + func regexContains(_ pattern: Expr) -> BooleanExpr { + return BooleanExpr("regex_contains", [self, pattern]) + } + + func regexMatch(_ pattern: String) -> BooleanExpr { + return BooleanExpr("regex_match", [self, Helper.sendableToExpr(pattern)]) + } + + func regexMatch(_ pattern: Expr) -> BooleanExpr { + return BooleanExpr("regex_match", [self, pattern]) + } + + func strContains(_ substring: String) -> BooleanExpr { + return BooleanExpr("str_contains", [self, Helper.sendableToExpr(substring)]) + } + + func strContains(_ expr: Expr) -> BooleanExpr { + return BooleanExpr("str_contains", [self, expr]) + } + + func startsWith(_ prefix: String) -> BooleanExpr { + return BooleanExpr("starts_with", [self, Helper.sendableToExpr(prefix)]) + } + + func startsWith(_ prefix: Expr) -> BooleanExpr { + return BooleanExpr("starts_with", [self, prefix]) + } + + func endsWith(_ suffix: String) -> BooleanExpr { + return BooleanExpr("ends_with", [self, Helper.sendableToExpr(suffix)]) + } + + func endsWith(_ suffix: Expr) -> BooleanExpr { + return BooleanExpr("ends_with", [self, suffix]) + } + + func lowercased() -> FunctionExpr { + return FunctionExpr("to_lower", [self]) + } + + func uppercased() -> FunctionExpr { + return FunctionExpr("to_upper", [self]) + } + + func trim() -> FunctionExpr { + return FunctionExpr("trim", [self]) + } + + func strConcat(_ secondString: Expr, _ otherStrings: Expr...) -> FunctionExpr { + return FunctionExpr("str_concat", [self, secondString] + otherStrings) + } + + func strConcat(_ secondString: String, _ otherStrings: String...) -> FunctionExpr { + let exprs = [self] + [Helper.sendableToExpr(secondString)] + otherStrings + .map { Helper.sendableToExpr($0) } + return FunctionExpr("str_concat", exprs) + } + + func reverse() -> FunctionExpr { + return FunctionExpr("reverse", [self]) + } + + func replaceFirst(_ find: String, _ replace: String) -> FunctionExpr { + return FunctionExpr( + "replace_first", + [self, Helper.sendableToExpr(find), Helper.sendableToExpr(replace)] + ) + } + + func replaceFirst(_ find: Expr, _ replace: Expr) -> FunctionExpr { + return FunctionExpr("replace_first", [self, find, replace]) + } + + func replaceAll(_ find: String, _ replace: String) -> FunctionExpr { + return FunctionExpr( + "replace_all", + [self, Helper.sendableToExpr(find), Helper.sendableToExpr(replace)] + ) + } + + func replaceAll(_ find: Expr, _ replace: Expr) -> FunctionExpr { + return FunctionExpr("replace_all", [self, find, replace]) + } + + func byteLength() -> FunctionExpr { + return FunctionExpr("byte_length", [self]) + } + + func substr(_ position: Int, _ length: Int? = nil) -> FunctionExpr { + let positionExpr = Helper.sendableToExpr(position) + if let length = length { + return FunctionExpr("substr", [self, positionExpr, Helper.sendableToExpr(length)]) + } else { + return FunctionExpr("substr", [self, positionExpr]) + } + } + + func substr(_ position: Expr, _ length: Expr? = nil) -> FunctionExpr { + if let length = length { + return FunctionExpr("substr", [self, position, length]) + } else { + return FunctionExpr("substr", [self, position]) + } + } + + // --- Added Map Operations --- + + func mapGet(_ subfield: String) -> FunctionExpr { + return FunctionExpr("map_get", [self, Constant(subfield)]) + } + + func mapRemove(_ key: String) -> FunctionExpr { + return FunctionExpr("map_remove", [self, Helper.sendableToExpr(key)]) + } + + func mapRemove(_ keyExpr: Expr) -> FunctionExpr { + return FunctionExpr("map_remove", [self, keyExpr]) + } + + func mapMerge(_ secondMap: [String: Sendable], + _ otherMaps: [String: Sendable]...) -> FunctionExpr { + let secondMapExpr = Helper.sendableToExpr(secondMap) + let otherMapExprs = otherMaps.map { Helper.sendableToExpr($0) } + return FunctionExpr("map_merge", [self, secondMapExpr] + otherMapExprs) + } + + func mapMerge(_ secondMap: Expr, _ otherMaps: Expr...) -> FunctionExpr { + return FunctionExpr("map_merge", [self, secondMap] + otherMaps) + } + + // --- Added Aggregate Operations (on Expr) --- + + func count() -> AggregateFunction { + return AggregateFunction("count", [self]) + } + + func sum() -> AggregateFunction { + return AggregateFunction("sum", [self]) + } + + func avg() -> AggregateFunction { + return AggregateFunction("avg", [self]) + } + + func minimum() -> AggregateFunction { + return AggregateFunction("minimum", [self]) + } + + func maximum() -> AggregateFunction { + return AggregateFunction("maximum", [self]) + } + + // MARK: Logical min/max + + func logicalMaximum(_ second: Expr, _ others: Expr...) -> FunctionExpr { + return FunctionExpr("logical_maximum", [self, second] + others) + } + + func logicalMaximum(_ second: Sendable, _ others: Sendable...) -> FunctionExpr { + let exprs = [self] + [Helper.sendableToExpr(second)] + others + .map { Helper.sendableToExpr($0) } + return FunctionExpr("logical_maximum", exprs) + } + + func logicalMinimum(_ second: Expr, _ others: Expr...) -> FunctionExpr { + return FunctionExpr("logical_minimum", [self, second] + others) + } + + func logicalMinimum(_ second: Sendable, _ others: Sendable...) -> FunctionExpr { + let exprs = [self] + [Helper.sendableToExpr(second)] + others + .map { Helper.sendableToExpr($0) } + return FunctionExpr("logical_minimum", exprs) + } + + // MARK: Vector Operations + + func vectorLength() -> FunctionExpr { + return FunctionExpr("vector_length", [self]) + } + + func cosineDistance(_ other: Expr) -> FunctionExpr { + return FunctionExpr("cosine_distance", [self, other]) + } + + func cosineDistance(_ other: VectorValue) -> FunctionExpr { + return FunctionExpr("cosine_distance", [self, Helper.sendableToExpr(other)]) + } + + func cosineDistance(_ other: [Double]) -> FunctionExpr { + return FunctionExpr("cosine_distance", [self, Helper.sendableToExpr(other)]) + } + + func dotProduct(_ other: Expr) -> FunctionExpr { + return FunctionExpr("dot_product", [self, other]) + } + + func dotProduct(_ other: VectorValue) -> FunctionExpr { + return FunctionExpr("dot_product", [self, Helper.sendableToExpr(other)]) + } + + func dotProduct(_ other: [Double]) -> FunctionExpr { + return FunctionExpr("dot_product", [self, Helper.sendableToExpr(other)]) + } + + func euclideanDistance(_ other: Expr) -> FunctionExpr { + return FunctionExpr("euclidean_distance", [self, other]) + } + + func euclideanDistance(_ other: VectorValue) -> FunctionExpr { + return FunctionExpr("euclidean_distance", [self, Helper.sendableToExpr(other)]) + } + + func euclideanDistance(_ other: [Double]) -> FunctionExpr { + return FunctionExpr("euclidean_distance", [self, Helper.sendableToExpr(other)]) + } + + func manhattanDistance(_ other: Expr) -> FunctionExpr { + return FunctionExpr("manhattan_distance", [self, other]) + } + + func manhattanDistance(_ other: VectorValue) -> FunctionExpr { + return FunctionExpr("manhattan_distance", [self, Helper.sendableToExpr(other)]) + } + + func manhattanDistance(_ other: [Double]) -> FunctionExpr { + return FunctionExpr("manhattan_distance", [self, Helper.sendableToExpr(other)]) + } + + // MARK: Timestamp operations + + func unixMicrosToTimestamp() -> FunctionExpr { + return FunctionExpr("unix_micros_to_timestamp", [self]) + } + + func timestampToUnixMicros() -> FunctionExpr { + return FunctionExpr("timestamp_to_unix_micros", [self]) + } + + func unixMillisToTimestamp() -> FunctionExpr { + return FunctionExpr("unix_millis_to_timestamp", [self]) + } + + func timestampToUnixMillis() -> FunctionExpr { + return FunctionExpr("timestamp_to_unix_millis", [self]) + } + + func unixSecondsToTimestamp() -> FunctionExpr { + return FunctionExpr("unix_seconds_to_timestamp", [self]) + } + + func timestampToUnixSeconds() -> FunctionExpr { + return FunctionExpr("timestamp_to_unix_seconds", [self]) + } + + func timestampAdd(_ unit: Expr, _ amount: Expr) -> FunctionExpr { + return FunctionExpr("timestamp_add", [self, unit, amount]) + } + + func timestampAdd(_ unit: TimeUnit, _ amount: Int) -> FunctionExpr { + return FunctionExpr( + "timestamp_add", + [self, Helper.sendableToExpr(unit), Helper.sendableToExpr(amount)] + ) + } + + func timestampSub(_ unit: Expr, _ amount: Expr) -> FunctionExpr { + return FunctionExpr("timestamp_sub", [self, unit, amount]) + } + + func timestampSub(_ unit: TimeUnit, _ amount: Int) -> FunctionExpr { + return FunctionExpr( + "timestamp_sub", + [self, Helper.sendableToExpr(unit), Helper.sendableToExpr(amount)] + ) + } + + // MARK: - Bitwise operations + + func bitAnd(_ otherBits: Int) -> FunctionExpr { + return FunctionExpr("bit_and", [self, Helper.sendableToExpr(otherBits)]) + } + + func bitAnd(_ otherBits: UInt8) -> FunctionExpr { + return FunctionExpr("bit_and", [self, Helper.sendableToExpr(otherBits)]) + } + + func bitAnd(_ bitsExpression: Expr) -> FunctionExpr { + return FunctionExpr("bit_and", [self, bitsExpression]) + } + + func bitOr(_ otherBits: Int) -> FunctionExpr { + return FunctionExpr("bit_or", [self, Helper.sendableToExpr(otherBits)]) + } + + func bitOr(_ otherBits: UInt8) -> FunctionExpr { + return FunctionExpr("bit_or", [self, Helper.sendableToExpr(otherBits)]) + } + + func bitOr(_ bitsExpression: Expr) -> FunctionExpr { + return FunctionExpr("bit_or", [self, bitsExpression]) + } + + func bitXor(_ otherBits: Int) -> FunctionExpr { + return FunctionExpr("bit_xor", [self, Helper.sendableToExpr(otherBits)]) + } + + func bitXor(_ otherBits: UInt8) -> FunctionExpr { + return FunctionExpr("bit_xor", [self, Helper.sendableToExpr(otherBits)]) + } + + func bitXor(_ bitsExpression: Expr) -> FunctionExpr { + return FunctionExpr("bit_xor", [self, bitsExpression]) + } + + func bitNot() -> FunctionExpr { + return FunctionExpr("bit_not", [self]) + } + + func bitLeftShift(_ y: Int) -> FunctionExpr { + return FunctionExpr("bit_left_shift", [self, Helper.sendableToExpr(y)]) + } + + func bitLeftShift(_ numberExpr: Expr) -> FunctionExpr { + return FunctionExpr("bit_left_shift", [self, numberExpr]) + } + + func bitRightShift(_ y: Int) -> FunctionExpr { + return FunctionExpr("bit_right_shift", [self, Helper.sendableToExpr(y)]) + } + + func bitRightShift(_ numberExpr: Expr) -> FunctionExpr { + return FunctionExpr("bit_right_shift", [self, numberExpr]) + } + + func documentId() -> FunctionExpr { + return FunctionExpr("document_id", [self]) + } + + func ifError(_ catchExpr: Expr) -> FunctionExpr { + return FunctionExpr("if_error", [self, catchExpr]) + } + + func ifError(_ catchValue: Sendable) -> FunctionExpr { + return FunctionExpr("if_error", [self, Helper.sendableToExpr(catchValue)]) + } + + // MARK: Sorting + + func ascending() -> Ordering { + return Ordering(expr: self, direction: .ascending) + } + + func descending() -> Ordering { + return Ordering(expr: self, direction: .descending) + } +} diff --git a/Firestore/Swift/Source/Helper/PipelineHelper.swift b/Firestore/Swift/Source/Helper/PipelineHelper.swift new file mode 100644 index 00000000000..0d0e6b55d59 --- /dev/null +++ b/Firestore/Swift/Source/Helper/PipelineHelper.swift @@ -0,0 +1,92 @@ +// Copyright 2025 Google LLC +// +// 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. + +enum Helper { + static func sendableToExpr(_ value: Sendable?) -> Expr { + guard let value = value else { + return Constant.nil + } + + if let exprValue = value as? Expr { + return exprValue + } else if let dictionaryValue = value as? [String: Sendable?] { + return map(dictionaryValue) + } else if let arrayValue = value as? [Sendable?] { + return array(arrayValue) + } else if let timeUnitValue = value as? TimeUnit { + return Constant(timeUnitValue.rawValue) + } else { + return Constant(value) + } + } + + static func selectablesToMap(selectables: [Selectable]) -> [String: Expr] { + let exprMap = selectables.reduce(into: [String: Expr]()) { result, selectable in + guard let value = selectable as? SelectableWrapper else { + fatalError("Selectable class must conform to SelectableWrapper.") + } + result[value.alias] = value.expr + } + return exprMap + } + + static func map(_ elements: [String: Sendable?]) -> FunctionExpr { + var result: [Expr] = [] + for (key, value) in elements { + result.append(Constant(key)) + result.append(sendableToExpr(value)) + } + return FunctionExpr("map", result) + } + + static func array(_ elements: [Sendable?]) -> FunctionExpr { + let transformedElements = elements.map { element in + sendableToExpr(element) + } + return FunctionExpr("array", transformedElements) + } + + // This function is used to convert Swift type into Objective-C type. + static func sendableToAnyObjectForRawStage(_ value: Sendable?) -> AnyObject { + guard let value = value, !(value is NSNull) else { + return Constant.nil.bridge + } + + if let exprValue = value as? Expr { + return exprValue.toBridge() + } else if let aggregateFunctionValue = value as? AggregateFunction { + return aggregateFunctionValue.toBridge() + } else if let dictionaryValue = value as? [String: Sendable?] { + let mappedValue: [String: Sendable] = dictionaryValue.mapValues { + if let aggFunc = $0 as? AggregateFunction { + return aggFunc.toBridge() + } + return sendableToExpr($0).toBridge() + } + return mappedValue as NSDictionary + } else { + return Constant(value).bridge + } + } + + static func convertObjCToSwift(_ objValue: Sendable) -> Sendable? { + switch objValue { + case is NSNull: + return nil + + default: + return objValue + } + } +} diff --git a/Firestore/Swift/Source/PipelineWrapper.swift b/Firestore/Swift/Source/PipelineWrapper.swift new file mode 100644 index 00000000000..a057c2e4ea2 --- /dev/null +++ b/Firestore/Swift/Source/PipelineWrapper.swift @@ -0,0 +1,26 @@ +// Copyright 2025 Google LLC +// +// 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. + +protocol BridgeWrapper { + var bridge: ExprBridge { get } +} + +protocol AggregateBridgeWrapper { + var bridge: AggregateFunctionBridge { get } +} + +protocol SelectableWrapper: Sendable { + var alias: String { get } + var expr: Expr { get } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Firestore+Pipeline.swift b/Firestore/Swift/Source/SwiftAPI/Firestore+Pipeline.swift new file mode 100644 index 00000000000..e35a9bceac5 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Firestore+Pipeline.swift @@ -0,0 +1,29 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE +import Foundation + +@objc public extension Firestore { + @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) + @nonobjc func pipeline() -> PipelineSource { + return PipelineSource(self) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/AggregateFunction.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/AggregateFunction.swift new file mode 100644 index 00000000000..6d7e05098a9 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/AggregateFunction.swift @@ -0,0 +1,40 @@ +// Copyright 2025 Google LLC +// +// 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. + +extension AggregateFunction { + func toBridge() -> AggregateFunctionBridge { + return (self as AggregateBridgeWrapper).bridge + } +} + +public class AggregateFunction: AggregateBridgeWrapper, @unchecked Sendable { + let bridge: AggregateFunctionBridge + + let functionName: String + let args: [Expr] + + public init(_ functionName: String, _ args: [Expr]) { + self.functionName = functionName + self.args = args + bridge = AggregateFunctionBridge( + name: functionName, + args: self.args.map { $0.toBridge() + } + ) + } + + public func `as`(_ name: String) -> AggregateWithAlias { + return AggregateWithAlias(aggregate: self, alias: name) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/AggregateWithAlias.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/AggregateWithAlias.swift new file mode 100644 index 00000000000..8a1871907c6 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/AggregateWithAlias.swift @@ -0,0 +1,18 @@ +// Copyright 2025 Google LLC +// +// 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. + +public struct AggregateWithAlias { + public let aggregate: AggregateFunction + public let alias: String +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/CountAll.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/CountAll.swift new file mode 100644 index 00000000000..064eb6d99bc --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Aggregation/CountAll.swift @@ -0,0 +1,19 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class CountAll: AggregateFunction, @unchecked Sendable { + public init() { + super.init("count", []) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/ArrayContains.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/ArrayContains.swift new file mode 100644 index 00000000000..7a70cfbc77b --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/ArrayContains.swift @@ -0,0 +1,19 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class ArrayContains: BooleanExpr, @unchecked Sendable { + public init(fieldName: String, values: Sendable...) { + super.init("array_contains", values.map { Helper.sendableToExpr($0) }) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Ascending.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Ascending.swift new file mode 100644 index 00000000000..e872b6e7f8a --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Ascending.swift @@ -0,0 +1,19 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class Ascending: Ordering, @unchecked Sendable { + public init(_ fieldName: String) { + super.init(expr: Field(fieldName), direction: .ascending) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Descending.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Descending.swift new file mode 100644 index 00000000000..584d7b7ada3 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Descending.swift @@ -0,0 +1,19 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class Descending: Ordering, @unchecked Sendable { + public init(_ fieldName: String) { + super.init(expr: Field(fieldName), direction: .descending) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/DistanceMeasure.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/DistanceMeasure.swift new file mode 100644 index 00000000000..6bd54e9e71b --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/DistanceMeasure.swift @@ -0,0 +1,47 @@ +// Copyright 2025 Google LLC +// +// 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. + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE + +import Foundation + +public struct DistanceMeasure: Sendable, Equatable, Hashable { + let kind: Kind + + enum Kind: String { + case euclidean + case cosine + case dotProduct = "dot_product" + } + + public static var euclidean: DistanceMeasure { + return self.init(kind: .euclidean) + } + + public static var cosine: DistanceMeasure { + return self.init(kind: .cosine) + } + + public static var dotProduct: DistanceMeasure { + return self.init(kind: .dotProduct) + } + + init(kind: Kind) { + self.kind = kind + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr.swift new file mode 100644 index 00000000000..d05c6a4c251 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr.swift @@ -0,0 +1,1554 @@ +// Copyright 2025 Google LLC +// +// 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. + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE +import Foundation + +// TODO: the implementation of `Expr` is not complete +public protocol Expr: Sendable { + /// Assigns an alias to this expression. + /// + /// Aliases are useful for renaming fields in the output of a stage or for giving meaningful + /// names to calculated values. + /// + /// ```swift + /// // Calculate total price and alias it "totalPrice" + /// Field("price").multiply(Field("quantity")).`as`("totalPrice") + /// ``` + /// + /// - Parameter name: The alias to assign to this expression. + /// - Returns: A new `ExprWithAlias` wrapping this expression with the alias. + func `as`(_ name: String) -> ExprWithAlias + + // --- Added Mathematical Operations --- + + /// Creates an expression that adds this expression to one or more other expressions. + /// Assumes `self` and all parameters evaluate to compatible types for addition (e.g., numbers, or + /// string/array concatenation if supported by the specific "add" implementation). + /// + /// ```swift + /// // Add the value of the 'quantity' field and the 'reserve' field. + /// Field("quantity").add(Field("reserve")) + /// + /// // Add multiple numeric fields + /// Field("subtotal").add(Field("tax"), Field("shipping")) + /// ``` + /// + /// - Parameter value: Expr` values to add. + /// - Returns: A new `FunctionExpr` representing the addition operation. + func add(_ value: Expr) -> FunctionExpr + + /// Creates an expression that adds this expression to one or more literal values. + /// Assumes `self` and all parameters evaluate to compatible types for addition. + /// + /// ```swift + /// // Add 5 to the 'count' field + /// Field("count").add(5) + /// + /// // Add multiple literal numbers + /// Field("score").add(10, 20, -5) + /// ``` + /// + /// - Parameter value: Expr` value to add. + /// - Returns: A new `FunctionExpr` representing the addition operation. + func add(_ value: Sendable) -> FunctionExpr + + /// Creates an expression that subtracts another expression from this expression. + /// Assumes `self` and `other` evaluate to numeric types. + /// + /// ```swift + /// // Subtract the 'discount' field from the 'price' field + /// Field("price").subtract(Field("discount")) + /// ``` + /// + /// - Parameter other: The `Expr` (evaluating to a number) to subtract from this expression. + /// - Returns: A new `FunctionExpr` representing the subtraction operation. + func subtract(_ other: Expr) -> FunctionExpr + + /// Creates an expression that subtracts a literal value from this expression. + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Subtract 20 from the value of the 'total' field + /// Field("total").subtract(20) + /// ``` + /// + /// - Parameter other: The `Sendable` literal (numeric) value to subtract from this expression. + /// - Returns: A new `FunctionExpr` representing the subtraction operation. + func subtract(_ other: Sendable) -> FunctionExpr + + /// Creates an expression that multiplies this expression by one or more other expressions. + /// Assumes `self` and all parameters evaluate to numeric types. + /// + /// ```swift + /// // Multiply the 'quantity' field by the 'price' field + /// Field("quantity").multiply(Field("price")) + /// + /// // Multiply 'rate' by 'time' and 'conversionFactor' fields + /// Field("rate").multiply(Field("time"), Field("conversionFactor")) + /// ``` + /// + /// - Parameter value: `Expr` value to multiply by. + /// - Returns: A new `FunctionExpr` representing the multiplication operation. + func multiply(_ value: Expr) -> FunctionExpr + + /// Creates an expression that multiplies this expression by one or more literal values. + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Multiply the 'score' by 1.1 + /// Field("score").multiply(1.1) + /// + /// // Multiply 'base' by 2 and then by 3.0 + /// Field("base").multiply(2, 3.0) + /// ``` + /// + /// - Parameter value: `Sendable` literal value to multiply by. + /// - Returns: A new `FunctionExpr` representing the multiplication operation. + func multiply(_ value: Sendable) -> FunctionExpr + + /// Creates an expression that divides this expression by another expression. + /// Assumes `self` and `other` evaluate to numeric types. + /// + /// ```swift + /// // Divide the 'total' field by the 'count' field + /// Field("total").divide(Field("count")) + /// ``` + /// + /// - Parameter other: The `Expr` (evaluating to a number) to divide by. + /// - Returns: A new `FunctionExpr` representing the division operation. + func divide(_ other: Expr) -> FunctionExpr + + /// Creates an expression that divides this expression by a literal value. + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Divide the 'value' field by 10 + /// Field("value").divide(10) + /// ``` + /// + /// - Parameter other: The `Sendable` literal (numeric) value to divide by. + /// - Returns: A new `FunctionExpr` representing the division operation. + func divide(_ other: Sendable) -> FunctionExpr + + /// Creates an expression that calculates the modulo (remainder) of dividing this expression by + /// another expression. + /// Assumes `self` and `other` evaluate to numeric types. + /// + /// ```swift + /// // Calculate the remainder of dividing the 'value' field by the 'divisor' field + /// Field("value").mod(Field("divisor")) + /// ``` + /// + /// - Parameter other: The `Expr` (evaluating to a number) to use as the divisor. + /// - Returns: A new `FunctionExpr` representing the modulo operation. + func mod(_ other: Expr) -> FunctionExpr + + /// Creates an expression that calculates the modulo (remainder) of dividing this expression by a + /// literal value. + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Calculate the remainder of dividing the 'value' field by 10 + /// Field("value").mod(10) + /// ``` + /// + /// - Parameter other: The `Sendable` literal (numeric) value to use as the divisor. + /// - Returns: A new `FunctionExpr` representing the modulo operation. + func mod(_ other: Sendable) -> FunctionExpr + + // --- Added Array Operations --- + + /// Creates an expression that concatenates an array expression (from `self`) with one or more + /// other array expressions. + /// Assumes `self` and all parameters evaluate to arrays. + /// + /// ```swift + /// // Combine the 'items' array with 'otherItems' and 'archiveItems' array fields. + /// Field("items").arrayConcat(Field("otherItems"), Field("archiveItems")) + /// ``` + /// - Parameter secondArray: An `Expr` (evaluating to an array) to concatenate. + /// - Parameter otherArrays: Optional additional `Expr` values (evaluating to arrays) to + /// concatenate. + /// - Returns: A new `FunctionExpr` representing the concatenated array. + func arrayConcat(_ secondArray: Expr, _ otherArrays: Expr...) -> FunctionExpr + + /// Creates an expression that concatenates an array expression (from `self`) with one or more + /// array literals. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Combine 'tags' (an array field) with ["new", "featured"] and ["urgent"] + /// Field("tags").arrayConcat(["new", "featured"], ["urgent"]) + /// ``` + /// - Parameter secondArray: An array literal of `Sendable` values to concatenate. + /// - Parameter otherArrays: Optional additional array literals of `Sendable` values to + /// concatenate. + /// - Returns: A new `FunctionExpr` representing the concatenated array. + func arrayConcat(_ secondArray: [Sendable], _ otherArrays: [Sendable]...) -> FunctionExpr + + /// Creates an expression that checks if an array (from `self`) contains a specific element + /// expression. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Check if 'sizes' contains the value from 'selectedSize' field + /// Field("sizes").arrayContains(Field("selectedSize")) + /// ``` + /// + /// - Parameter element: The `Expr` representing the element to search for in the array. + /// - Returns: A new `BooleanExpr` representing the 'array_contains' comparison. + func arrayContains(_ element: Expr) -> BooleanExpr + + /// Creates an expression that checks if an array (from `self`) contains a specific literal + /// element. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Check if 'colors' array contains "red" + /// Field("colors").arrayContains("red") + /// ``` + /// + /// - Parameter element: The `Sendable` literal element to search for in the array. + /// - Returns: A new `BooleanExpr` representing the 'array_contains' comparison. + func arrayContains(_ element: Sendable) -> BooleanExpr + + /// Creates an expression that checks if an array (from `self`) contains all the specified element + /// expressions. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Check if 'candidateSkills' contains all skills from 'requiredSkill1' and 'requiredSkill2' + /// fields + /// Field("candidateSkills").arrayContainsAll([Field("requiredSkill1"), Field("requiredSkill2")]) + /// ``` + /// + /// - Parameter values: A list of `Expr` elements to check for in the array represented + /// by `self`. + /// - Returns: A new `BooleanExpr` representing the 'array_contains_all' comparison. + func arrayContainsAll(_ values: [Expr]) -> BooleanExpr + + /// Creates an expression that checks if an array (from `self`) contains all the specified literal + /// elements. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Check if 'tags' contains both "urgent" and "review" + /// Field("tags").arrayContainsAll(["urgent", "review"]) + /// ``` + /// + /// - Parameter values: A list of `Sendable` literal elements to check for in the array + /// represented by `self`. + /// - Returns: A new `BooleanExpr` representing the 'array_contains_all' comparison. + func arrayContainsAll(_ values: [Sendable]) -> BooleanExpr + + /// Creates an expression that checks if an array (from `self`) contains any of the specified + /// element expressions. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Check if 'userGroups' contains any group from 'allowedGroup1' or 'allowedGroup2' fields + /// Field("userGroups").arrayContainsAny([Field("allowedGroup1"), Field("allowedGroup2")]) + /// ``` + /// + /// - Parameter values: A list of `Expr` elements to check for in the array represented + /// by `self`. + /// - Returns: A new `BooleanExpr` representing the 'array_contains_any' comparison. + func arrayContainsAny(_ values: [Expr]) -> BooleanExpr + + /// Creates an expression that checks if an array (from `self`) contains any of the specified + /// literal elements. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Check if 'categories' contains either "electronics" or "books" + /// Field("categories").arrayContainsAny(["electronics", "books"]) + /// ``` + /// + /// - Parameter values: A list of `Sendable` literal elements to check for in the array + /// represented by `self`. + /// - Returns: A new `BooleanExpr` representing the 'array_contains_any' comparison. + func arrayContainsAny(_ values: [Sendable]) -> BooleanExpr + + /// Creates an expression that calculates the length of an array. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Get the number of items in the 'cart' array + /// Field("cart").arrayLength() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the length of the array. + func arrayLength() -> FunctionExpr + + /// Creates an expression that accesses an element in an array (from `self`) at the specified + /// integer offset. + /// A negative offset starts from the end. If the offset is out of bounds, an error may be + /// returned during evaluation. + /// Assumes `self` evaluates to an array. + /// + /// ```swift + /// // Return the value in the 'tags' field array at index 1. + /// Field("tags").arrayGet(1) + /// // Return the last element in the 'tags' field array. + /// Field("tags").arrayGet(-1) + /// ``` + /// + /// - Parameter offset: The literal `Int` offset of the element to return. + /// - Returns: A new `FunctionExpr` representing the 'arrayGet' operation. + func arrayGet(_ offset: Int) -> FunctionExpr + + /// Creates an expression that accesses an element in an array (from `self`) at the offset + /// specified by an expression. + /// A negative offset starts from the end. If the offset is out of bounds, an error may be + /// returned during evaluation. + /// Assumes `self` evaluates to an array and `offsetExpr` evaluates to an integer. + /// + /// ```swift + /// // Return the value in the tags field array at index specified by field 'favoriteTagIndex'. + /// Field("tags").arrayGet(Field("favoriteTagIndex")) + /// ``` + /// + /// - Parameter offsetExpr: An `Expr` (evaluating to an Int) representing the offset of the + /// element to return. + /// - Returns: A new `FunctionExpr` representing the 'arrayGet' operation. + func arrayGet(_ offsetExpr: Expr) -> FunctionExpr + + // MARK: Equality with Sendable + + /// Creates an expression that checks if this expression is equal to any of the provided + /// expression values. + /// This is similar to an "IN" operator in SQL. + /// + /// ```swift + /// // Check if 'categoryID' field is equal to 'featuredCategory' or 'popularCategory' fields + /// Field("categoryID").eqAny([Field("featuredCategory"), Field("popularCategory")]) + /// ``` + /// + /// - Parameter others: A list of `Expr` values to check against. + /// - Returns: A new `BooleanExpr` representing the 'IN' comparison (eq_any). + func eqAny(_ others: [Expr]) -> BooleanExpr + + /// Creates an expression that checks if this expression is equal to any of the provided literal + /// values. + /// This is similar to an "IN" operator in SQL. + /// + /// ```swift + /// // Check if 'category' is "Electronics", "Books", or "Home Goods" + /// Field("category").eqAny(["Electronics", "Books", "Home Goods"]) + /// ``` + /// + /// - Parameter others: A list of `Sendable` literal values to check against. + /// - Returns: A new `BooleanExpr` representing the 'IN' comparison (eq_any). + func eqAny(_ others: [Sendable]) -> BooleanExpr + + /// Creates an expression that checks if this expression is not equal to any of the provided + /// expression values. + /// This is similar to a "NOT IN" operator in SQL. + /// + /// ```swift + /// // Check if 'statusValue' is not equal to 'archivedStatus' or 'deletedStatus' fields + /// Field("statusValue").notEqAny([Field("archivedStatus"), Field("deletedStatus")]) + /// ``` + /// + /// - Parameter others: A list of `Expr` values to check against. + /// - Returns: A new `BooleanExpr` representing the 'NOT IN' comparison (not_eq_any). + func notEqAny(_ others: [Expr]) -> BooleanExpr + + /// Creates an expression that checks if this expression is not equal to any of the provided + /// literal values. + /// This is similar to a "NOT IN" operator in SQL. + /// + /// ```swift + /// // Check if 'status' is neither "pending" nor "archived" + /// Field("status").notEqAny(["pending", "archived"]) + /// ``` + /// + /// - Parameter others: A list of `Sendable` literal values to check against. + /// - Returns: A new `BooleanExpr` representing the 'NOT IN' comparison (not_eq_any). + func notEqAny(_ others: [Sendable]) -> BooleanExpr + + // MARK: Checks + + /// Creates an expression that checks if this expression evaluates to 'NaN' (Not a Number). + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Check if the result of a calculation is NaN + /// Field("value").divide(0).isNan() + /// ``` + /// + /// - Returns: A new `BooleanExpr` representing the 'isNaN' check. + func isNan() -> BooleanExpr + + /// Creates an expression that checks if this expression evaluates to 'Null'. + /// + /// ```swift + /// // Check if the 'optionalField' is null + /// Field("optionalField").isNull() + /// ``` + /// + /// - Returns: A new `BooleanExpr` representing the 'isNull' check. + func isNull() -> BooleanExpr + + /// Creates an expression that checks if a field exists in the document. + /// + /// - Note: This typically only makes sense when `self` is a `Field` expression. + /// + /// ```swift + /// // Check if the document has a field named "phoneNumber" + /// Field("phoneNumber").exists() + /// ``` + /// + /// - Returns: A new `BooleanExpr` representing the 'exists' check. + func exists() -> BooleanExpr + + /// Creates an expression that checks if this expression produces an error during evaluation. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Check if accessing a non-existent array index causes an error + /// Field("myArray").arrayGet(100).isError() + /// ``` + /// + /// - Returns: A new `BooleanExpr` representing the 'isError' check. + func isError() -> BooleanExpr + + /// Creates an expression that returns `true` if the result of this expression + /// is absent (e.g., a field does not exist in a map). Otherwise, returns `false`, even if the + /// value is `null`. + /// + /// - Note: This API is in beta. + /// - Note: This typically only makes sense when `self` is a `Field` expression. + /// + /// ```swift + /// // Check if the field `value` is absent. + /// Field("value").isAbsent() + /// ``` + /// + /// - Returns: A new `BooleanExpr` representing the 'isAbsent' check. + func isAbsent() -> BooleanExpr + + /// Creates an expression that checks if the result of this expression is not null. + /// + /// ```swift + /// // Check if the value of the 'name' field is not null + /// Field("name").isNotNull() + /// ``` + /// + /// - Returns: A new `BooleanExpr` representing the 'isNotNull' check. + func isNotNull() -> BooleanExpr + + /// Creates an expression that checks if the results of this expression is NOT 'NaN' (Not a + /// Number). + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Check if the result of a calculation is NOT NaN + /// Field("value").divide(Field("count")).isNotNan() // Assuming count might be 0 + /// ``` + /// + /// - Returns: A new `BooleanExpr` representing the 'isNotNaN' check. + func isNotNan() -> BooleanExpr + + // MARK: String Operations + + /// Creates an expression that calculates the character length of a string in UTF-8. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Get the character length of the 'name' field in its UTF-8 form. + /// Field("name").charLength() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the length of the string. + func charLength() -> FunctionExpr + + /// Creates an expression that performs a case-sensitive string comparison using wildcards against + /// a literal pattern. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Check if the 'title' field contains the word "guide" (case-sensitive) + /// Field("title").like("%guide%") + /// ``` + /// + /// - Parameter pattern: The literal string pattern to search for. Use "%" as a wildcard. + /// - Returns: A new `FunctionExpr` representing the 'like' comparison. + func like(_ pattern: String) -> BooleanExpr + + /// Creates an expression that performs a case-sensitive string comparison using wildcards against + /// an expression pattern. + /// Assumes `self` evaluates to a string, and `pattern` evaluates to a string. + /// + /// ```swift + /// // Check if 'filename' matches a pattern stored in 'patternField' + /// Field("filename").like(Field("patternField")) + /// ``` + /// + /// - Parameter pattern: An `Expr` (evaluating to a string) representing the pattern to search + /// for. + /// - Returns: A new `FunctionExpr` representing the 'like' comparison. + func like(_ pattern: Expr) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) contains a specified regular + /// expression literal as a substring. + /// Uses RE2 syntax. Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Check if 'description' contains "example" (case-insensitive) + /// Field("description").regexContains("(?i)example") + /// ``` + /// + /// - Parameter pattern: The literal string regular expression to use for the search. + /// - Returns: A new `BooleanExpr` representing the 'regex_contains' comparison. + func regexContains(_ pattern: String) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) contains a specified regular + /// expression (from an expression) as a substring. + /// Uses RE2 syntax. Assumes `self` evaluates to a string, and `pattern` evaluates to a string. + /// + /// ```swift + /// // Check if 'logEntry' contains a pattern from 'errorPattern' field + /// Field("logEntry").regexContains(Field("errorPattern")) + /// ``` + /// + /// - Parameter pattern: An `Expr` (evaluating to a string) representing the regular expression to + /// use for the search. + /// - Returns: A new `BooleanExpr` representing the 'regex_contains' comparison. + func regexContains(_ pattern: Expr) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) matches a specified regular + /// expression literal entirely. + /// Uses RE2 syntax. Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Check if the 'email' field matches a valid email pattern + /// Field("email").regexMatch("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}") + /// ``` + /// + /// - Parameter pattern: The literal string regular expression to use for the match. + /// - Returns: A new `BooleanExpr` representing the regular expression match. + func regexMatch(_ pattern: String) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) matches a specified regular + /// expression (from an expression) entirely. + /// Uses RE2 syntax. Assumes `self` evaluates to a string, and `pattern` evaluates to a string. + /// + /// ```swift + /// // Check if 'input' matches the regex stored in 'validationRegex' + /// Field("input").regexMatch(Field("validationRegex")) + /// ``` + /// + /// - Parameter pattern: An `Expr` (evaluating to a string) representing the regular expression to + /// use for the match. + /// - Returns: A new `BooleanExpr` representing the regular expression match. + func regexMatch(_ pattern: Expr) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) contains a specified literal + /// substring (case-sensitive). + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Check if the 'description' field contains "example". + /// Field("description").strContains("example") + /// ``` + /// + /// - Parameter substring: The literal string substring to search for. + /// - Returns: A new `BooleanExpr` representing the 'str_contains' comparison. + func strContains(_ substring: String) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) contains a specified substring + /// from an expression (case-sensitive). + /// Assumes `self` evaluates to a string, and `expr` evaluates to a string. + /// + /// ```swift + /// // Check if the 'message' field contains the value of the 'keyword' field. + /// Field("message").strContains(Field("keyword")) + /// ``` + /// + /// - Parameter expr: An `Expr` (evaluating to a string) representing the substring to search for. + /// - Returns: A new `BooleanExpr` representing the 'str_contains' comparison. + func strContains(_ expr: Expr) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) starts with a given literal prefix + /// (case-sensitive). + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Check if the 'name' field starts with "Mr." + /// Field("name").startsWith("Mr.") + /// ``` + /// + /// - Parameter prefix: The literal string prefix to check for. + /// - Returns: A new `BooleanExpr` representing the 'starts_with' comparison. + func startsWith(_ prefix: String) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) starts with a given prefix from an + /// expression (case-sensitive). + /// Assumes `self` evaluates to a string, and `prefix` evaluates to a string. + /// + /// ```swift + /// // Check if 'fullName' starts with the value of 'firstName' + /// Field("fullName").startsWith(Field("firstName")) + /// ``` + /// + /// - Parameter prefix: An `Expr` (evaluating to a string) representing the prefix to check for. + /// - Returns: A new `BooleanExpr` representing the 'starts_with' comparison. + func startsWith(_ prefix: Expr) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) ends with a given literal suffix + /// (case-sensitive). + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Check if the 'filename' field ends with ".txt" + /// Field("filename").endsWith(".txt") + /// ``` + /// + /// - Parameter suffix: The literal string suffix to check for. + /// - Returns: A new `BooleanExpr` representing the 'ends_with' comparison. + func endsWith(_ suffix: String) -> BooleanExpr + + /// Creates an expression that checks if a string (from `self`) ends with a given suffix from an + /// expression (case-sensitive). + /// Assumes `self` evaluates to a string, and `suffix` evaluates to a string. + /// + /// ```swift + /// // Check if 'url' ends with the value of 'extension' field + /// Field("url").endsWith(Field("extension")) + /// ``` + /// + /// - Parameter suffix: An `Expr` (evaluating to a string) representing the suffix to check for. + /// - Returns: A new `BooleanExpr` representing the 'ends_with' comparison. + func endsWith(_ suffix: Expr) -> BooleanExpr + + /// Creates an expression that converts a string (from `self`) to lowercase. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Convert the 'name' field to lowercase + /// Field("name").lowercased() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the lowercase string. + func lowercased() -> FunctionExpr + + /// Creates an expression that converts a string (from `self`) to uppercase. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Convert the 'title' field to uppercase + /// Field("title").uppercased() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the uppercase string. + func uppercased() -> FunctionExpr + + /// Creates an expression that removes leading and trailing whitespace from a string (from + /// `self`). + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Trim whitespace from the 'userInput' field + /// Field("userInput").trim() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the trimmed string. + func trim() -> FunctionExpr + + /// Creates an expression that concatenates this string expression with other string expressions. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Combine 'part1', 'part2', and 'part3' fields + /// Field("part1").strConcat(Field("part2"), Field("part3")) + /// ``` + /// + /// - Parameter secondString: An `Expr` (evaluating to a string) to concatenate. + /// - Parameter otherStrings: Optional additional `Expr` (evaluating to strings) to concatenate. + /// - Returns: A new `FunctionExpr` representing the concatenated string. + func strConcat(_ secondString: Expr, _ otherStrings: Expr...) -> FunctionExpr + + /// Creates an expression that concatenates this string expression with other string literals. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Combine 'firstName', " ", and 'lastName' + /// Field("firstName").strConcat(" ", "lastName") + /// ``` + /// + /// - Parameter secondString: A string literal to concatenate. + /// - Parameter otherStrings: Optional additional string literals to concatenate. + /// - Returns: A new `FunctionExpr` representing the concatenated string. + func strConcat(_ secondString: String, _ otherStrings: String...) -> FunctionExpr + + /// Creates an expression that reverses this string expression. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Reverse the value of the 'myString' field. + /// Field("myString").reverse() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the reversed string. + func reverse() -> FunctionExpr + + /// Creates an expression that replaces the first occurrence of a literal substring within this + /// string expression with another literal substring. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Replace the first "hello" with "hi" in the 'message' field + /// Field("message").replaceFirst("hello", "hi") + /// ``` + /// + /// - Parameter find: The literal string substring to search for. + /// - Parameter replace: The literal string substring to replace the first occurrence with. + /// - Returns: A new `FunctionExpr` representing the string with the first occurrence replaced. + func replaceFirst(_ find: String, _ replace: String) -> FunctionExpr + + /// Creates an expression that replaces the first occurrence of a substring (from an expression) + /// within this string expression with another substring (from an expression). + /// Assumes `self` evaluates to a string, and `find`/`replace` evaluate to strings. + /// + /// ```swift + /// // Replace first occurrence of field 'findPattern' with field 'replacePattern' in 'text' + /// Field("text").replaceFirst(Field("findPattern"), Field("replacePattern")) + /// ``` + /// + /// - Parameter find: An `Expr` (evaluating to a string) for the substring to search for. + /// - Parameter replace: An `Expr` (evaluating to a string) for the substring to replace the first + /// occurrence with. + /// - Returns: A new `FunctionExpr` representing the string with the first occurrence replaced. + func replaceFirst(_ find: Expr, _ replace: Expr) -> FunctionExpr + + /// Creates an expression that replaces all occurrences of a literal substring within this string + /// expression with another literal substring. + /// Assumes `self` evaluates to a string. + /// + /// ```swift + /// // Replace all occurrences of " " with "_" in 'description' + /// Field("description").replaceAll(" ", "_") + /// ``` + /// + /// - Parameter find: The literal string substring to search for. + /// - Parameter replace: The literal string substring to replace all occurrences with. + /// - Returns: A new `FunctionExpr` representing the string with all occurrences replaced. + func replaceAll(_ find: String, _ replace: String) -> FunctionExpr + + /// Creates an expression that replaces all occurrences of a substring (from an expression) within + /// this string expression with another substring (from an expression). + /// Assumes `self` evaluates to a string, and `find`/`replace` evaluate to strings. + /// + /// ```swift + /// // Replace all occurrences of field 'target' with field 'replacement' in 'content' + /// Field("content").replaceAll(Field("target"), Field("replacement")) + /// ``` + /// + /// - Parameter find: An `Expr` (evaluating to a string) for the substring to search for. + /// - Parameter replace: An `Expr` (evaluating to a string) for the substring to replace all + /// occurrences with. + /// - Returns: A new `FunctionExpr` representing the string with all occurrences replaced. + func replaceAll(_ find: Expr, _ replace: Expr) -> FunctionExpr + + /// Creates an expression that calculates the length of this string or bytes expression in bytes. + /// Assumes `self` evaluates to a string or bytes. + /// + /// ```swift + /// // Calculate the length of the 'myString' field in bytes. + /// Field("myString").byteLength() + /// + /// // Calculate the size of the 'avatar' (Data/Bytes) field. + /// Field("avatar").byteLength() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the length in bytes. + func byteLength() -> FunctionExpr + + /// Creates an expression that returns a substring of this expression (String or Bytes) using + /// literal integers for position and optional length. + /// Indexing is 0-based. Assumes `self` evaluates to a string or bytes. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Get substring from index 5 with length 10 + /// Field("myString").substr(5, 10) + /// + /// // Get substring from 'myString' starting at index 3 to the end + /// Field("myString").substr(3, nil) + /// ``` + /// + /// - Parameter position: Literal `Int` index of the first character/byte. + /// - Parameter length: Optional literal `Int` length of the substring. If `nil`, goes to the end. + /// - Returns: A new `FunctionExpr` representing the substring. + func substr(_ position: Int, _ length: Int?) -> FunctionExpr + + /// Creates an expression that returns a substring of this expression (String or Bytes) using + /// expressions for position and optional length. + /// Indexing is 0-based. Assumes `self` evaluates to a string or bytes, and parameters evaluate to + /// integers. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Get substring from index calculated by Field("start") with length from Field("len") + /// Field("myString").substr(Field("start"), Field("len")) + /// + /// // Get substring from index calculated by Field("start") to the end + /// Field("myString").substr(Field("start"), nil) // Passing nil for optional Expr length + /// ``` + /// + /// - Parameter position: An `Expr` (evaluating to an Int) for the index of the first + /// character/byte. + /// - Parameter length: Optional `Expr` (evaluating to an Int) for the length of the substring. If + /// `nil`, goes to the end. + /// - Returns: A new `FunctionExpr` representing the substring. + func substr(_ position: Expr, _ length: Expr?) -> FunctionExpr + + // MARK: Map Operations + + /// Accesses a value from a map (object) field using the provided literal string key. + /// Assumes `self` evaluates to a Map. + /// + /// ```swift + /// // Get the 'city' value from the 'address' map field + /// Field("address").mapGet("city") + /// ``` + /// + /// - Parameter subfield: The literal string key to access in the map. + /// - Returns: A new `FunctionExpr` representing the value associated with the given key. + func mapGet(_ subfield: String) -> FunctionExpr + + /// Creates an expression that removes a key (specified by a literal string) from the map produced + /// by evaluating this expression. + /// Assumes `self` evaluates to a Map. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Removes the key 'baz' from the map held in field 'myMap' + /// Field("myMap").mapRemove("baz") + /// ``` + /// + /// - Parameter key: The literal string key to remove from the map. + /// - Returns: A new `FunctionExpr` representing the 'map_remove' operation. + func mapRemove(_ key: String) -> FunctionExpr + + /// Creates an expression that removes a key (specified by an expression) from the map produced by + /// evaluating this expression. + /// Assumes `self` evaluates to a Map, and `keyExpr` evaluates to a string. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Removes the key specified by field 'keyToRemove' from the map in 'settings' + /// Field("settings").mapRemove(Field("keyToRemove")) + /// ``` + /// + /// - Parameter keyExpr: An `Expr` (evaluating to a string) representing the key to remove from + /// the map. + /// - Returns: A new `FunctionExpr` representing the 'map_remove' operation. + func mapRemove(_ keyExpr: Expr) -> FunctionExpr + + /// Creates an expression that merges this map with multiple other map literals. + /// Assumes `self` evaluates to a Map. Later maps overwrite keys from earlier maps. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Merge 'settings' field with { "enabled": true } and another map literal { "priority": 1 } + /// Field("settings").mapMerge(["enabled": true], ["priority": 1]) + /// ``` + /// + /// - Parameter secondMap: A required second map (dictionary literal with `Sendable` values) to + /// merge. + /// - Parameter otherMaps: Optional additional maps (dictionary literals with `Sendable` values) + /// to merge. + /// - Returns: A new `FunctionExpr` representing the 'map_merge' operation. + func mapMerge(_ secondMap: [String: Sendable], _ otherMaps: [String: Sendable]...) -> FunctionExpr + + /// Creates an expression that merges this map with multiple other map expressions. + /// Assumes `self` and other arguments evaluate to Maps. Later maps overwrite keys from earlier + /// maps. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Merge 'baseSettings' field with 'userOverrides' field and 'adminConfig' field + /// Field("baseSettings").mapMerge(Field("userOverrides"), Field("adminConfig")) + /// ``` + /// + /// - Parameter secondMap: A required second `Expr` (evaluating to a Map) to merge. + /// - Parameter otherMaps: Optional additional `Expr` (evaluating to Maps) to merge. + /// - Returns: A new `FunctionExpr` representing the 'map_merge' operation. + func mapMerge(_ secondMap: Expr, _ otherMaps: Expr...) -> FunctionExpr + + // MARK: Aggregations + + /// Creates an aggregation that counts the number of stage inputs where this expression evaluates + /// to a valid, non-null value. + /// + /// ```swift + /// // Count the total number of products with a 'productId' + /// Field("productId").count().alias("totalProducts") + /// ``` + /// + /// - Returns: A new `AggregateFunction` representing the 'count' aggregation on this expression. + func count() -> AggregateFunction + + /// Creates an aggregation that calculates the sum of this numeric expression across multiple + /// stage inputs. + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Calculate the total revenue from a set of orders + /// Field("orderAmount").sum().alias("totalRevenue") + /// ``` + /// + /// - Returns: A new `AggregateFunction` representing the 'sum' aggregation. + func sum() -> AggregateFunction + + /// Creates an aggregation that calculates the average (mean) of this numeric expression across + /// multiple stage inputs. + /// Assumes `self` evaluates to a numeric type. + /// + /// ```swift + /// // Calculate the average age of users + /// Field("age").avg().alias("averageAge") + /// ``` + /// + /// - Returns: A new `AggregateFunction` representing the 'avg' aggregation. + func avg() -> AggregateFunction + + /// Creates an aggregation that finds the minimum value of this expression across multiple stage + /// inputs. + /// + /// ```swift + /// // Find the lowest price of all products + /// Field("price").minimum().alias("lowestPrice") + /// ``` + /// + /// - Returns: A new `AggregateFunction` representing the 'min' aggregation. + func minimum() -> AggregateFunction + + /// Creates an aggregation that finds the maximum value of this expression across multiple stage + /// inputs. + /// + /// ```swift + /// // Find the highest score in a leaderboard + /// Field("score").maximum().alias("highestScore") + /// ``` + /// + /// - Returns: A new `AggregateFunction` representing the 'max' aggregation. + func maximum() -> AggregateFunction + + // MARK: Logical min/max + + /// Creates an expression that returns the larger value between this expression and other + /// expressions, based on Firestore's value type ordering. + /// + /// ```swift + /// // Returns the largest of 'val1', 'val2', and 'val3' fields + /// Field("val1").logicalMaximum(Field("val2"), Field("val3")) + /// ``` + /// + /// - Parameter second: The second `Expr` to compare with. + /// - Parameter others: Optional additional `Expr` values to compare with. + /// - Returns: A new `FunctionExpr` representing the logical max operation. + func logicalMaximum(_ second: Expr, _ others: Expr...) -> FunctionExpr + + /// Creates an expression that returns the larger value between this expression and other literal + /// values, based on Firestore's value type ordering. + /// + /// ```swift + /// // Returns the largest of 'val1' (a field), 100, and 200.0 + /// Field("val1").logicalMaximum(100, 200.0) + /// ``` + /// + /// - Parameter second: The second literal `Sendable` value to compare with. + /// - Parameter others: Optional additional literal `Sendable` values to compare with. + /// - Returns: A new `FunctionExpr` representing the logical max operation. + func logicalMaximum(_ second: Sendable, _ others: Sendable...) -> FunctionExpr + + /// Creates an expression that returns the smaller value between this expression and other + /// expressions, based on Firestore's value type ordering. + /// + /// ```swift + /// // Returns the smallest of 'val1', 'val2', and 'val3' fields + /// Field("val1").logicalMinimum(Field("val2"), Field("val3")) + /// ``` + /// + /// - Parameter second: The second `Expr` to compare with. + /// - Parameter others: Optional additional `Expr` values to compare with. + /// - Returns: A new `FunctionExpr` representing the logical min operation. + func logicalMinimum(_ second: Expr, _ others: Expr...) -> FunctionExpr + + /// Creates an expression that returns the smaller value between this expression and other literal + /// values, based on Firestore's value type ordering. + /// + /// ```swift + /// // Returns the smallest of 'val1' (a field), 0, and -5.5 + /// Field("val1").logicalMinimum(0, -5.5) + /// ``` + /// + /// - Parameter second: The second literal `Sendable` value to compare with. + /// - Parameter others: Optional additional literal `Sendable` values to compare with. + /// - Returns: A new `FunctionExpr` representing the logical min operation. + func logicalMinimum(_ second: Sendable, _ others: Sendable...) -> FunctionExpr + + // MARK: Vector Operations + + /// Creates an expression that calculates the length (number of dimensions) of this Firestore + /// Vector expression. + /// Assumes `self` evaluates to a Vector. + /// + /// ```swift + /// // Get the vector length (dimension) of the field 'embedding'. + /// Field("embedding").vectorLength() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the length of the vector. + func vectorLength() -> FunctionExpr + + /// Calculates the cosine distance between this vector expression and another vector expression. + /// Assumes both `self` and `other` evaluate to Vectors. + /// + /// ```swift + /// // Cosine distance between 'userVector' field and 'itemVector' field + /// Field("userVector").cosineDistance(Field("itemVector")) + /// ``` + /// + /// - Parameter other: The other vector as an `Expr` to compare against. + /// - Returns: A new `FunctionExpr` representing the cosine distance. + func cosineDistance(_ other: Expr) -> FunctionExpr + + /// Calculates the cosine distance between this vector expression and another vector literal + /// (`VectorValue`). + /// Assumes `self` evaluates to a Vector. + /// + /// ```swift + /// // Cosine distance with a VectorValue + /// let targetVector = VectorValue(vector: [0.1, 0.2, 0.3]) + /// Field("docVector").cosineDistance(targetVector) + /// ``` + /// - Parameter other: The other vector as a `VectorValue` to compare against. + /// - Returns: A new `FunctionExpr` representing the cosine distance. + func cosineDistance(_ other: VectorValue) -> FunctionExpr + + /// Calculates the cosine distance between this vector expression and another vector literal + /// (`[Double]`). + /// Assumes `self` evaluates to a Vector. + /// + /// ```swift + /// // Cosine distance between 'location' field and a target location + /// Field("location").cosineDistance([37.7749, -122.4194]) + /// ``` + /// - Parameter other: The other vector as `[Double]` to compare against. + /// - Returns: A new `FunctionExpr` representing the cosine distance. + func cosineDistance(_ other: [Double]) -> FunctionExpr + + /// Calculates the dot product between this vector expression and another vector expression. + /// Assumes both `self` and `other` evaluate to Vectors. + /// + /// ```swift + /// // Dot product between 'vectorA' and 'vectorB' fields + /// Field("vectorA").dotProduct(Field("vectorB")) + /// ``` + /// + /// - Parameter other: The other vector as an `Expr` to calculate with. + /// - Returns: A new `FunctionExpr` representing the dot product. + func dotProduct(_ other: Expr) -> FunctionExpr + + /// Calculates the dot product between this vector expression and another vector literal + /// (`VectorValue`). + /// Assumes `self` evaluates to a Vector. + /// + /// ```swift + /// // Dot product with a VectorValue + /// let weightVector = VectorValue(vector: [0.5, -0.5]) + /// Field("features").dotProduct(weightVector) + /// ``` + /// - Parameter other: The other vector as a `VectorValue` to calculate with. + /// - Returns: A new `FunctionExpr` representing the dot product. + func dotProduct(_ other: VectorValue) -> FunctionExpr + + /// Calculates the dot product between this vector expression and another vector literal + /// (`[Double]`). + /// Assumes `self` evaluates to a Vector. + /// + /// ```swift + /// // Dot product between a feature vector and a target vector literal + /// Field("features").dotProduct([0.5, 0.8, 0.2]) + /// ``` + /// - Parameter other: The other vector as `[Double]` to calculate with. + /// - Returns: A new `FunctionExpr` representing the dot product. + func dotProduct(_ other: [Double]) -> FunctionExpr + + /// Calculates the Euclidean distance between this vector expression and another vector + /// expression. + /// Assumes both `self` and `other` evaluate to Vectors. + /// + /// ```swift + /// // Euclidean distance between 'pointA' and 'pointB' fields + /// Field("pointA").euclideanDistance(Field("pointB")) + /// ``` + /// + /// - Parameter other: The other vector as an `Expr` to compare against. + /// - Returns: A new `FunctionExpr` representing the Euclidean distance. + func euclideanDistance(_ other: Expr) -> FunctionExpr + + /// Calculates the Euclidean distance between this vector expression and another vector literal + /// (`VectorValue`). + /// Assumes `self` evaluates to a Vector. + /// + /// ```swift + /// let targetPoint = VectorValue(vector: [1.0, 2.0]) + /// Field("currentLocation").euclideanDistance(targetPoint) + /// ``` + /// - Parameter other: The other vector as a `VectorValue` to compare against. + /// - Returns: A new `FunctionExpr` representing the Euclidean distance. + func euclideanDistance(_ other: VectorValue) -> FunctionExpr + + /// Calculates the Euclidean distance between this vector expression and another vector literal + /// (`[Double]`). + /// Assumes `self` evaluates to a Vector. + /// + /// ```swift + /// // Euclidean distance between 'location' field and a target location literal + /// Field("location").euclideanDistance([37.7749, -122.4194]) + /// ``` + /// - Parameter other: The other vector as `[Double]` to compare against. + /// - Returns: A new `FunctionExpr` representing the Euclidean distance. + func euclideanDistance(_ other: [Double]) -> FunctionExpr + + /// Calculates the Manhattan (L1) distance between this vector expression and another vector + /// expression. + /// Assumes both `self` and `other` evaluate to Vectors. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Manhattan distance between 'vector1' field and 'vector2' field + /// Field("vector1").manhattanDistance(Field("vector2")) + /// ``` + /// + /// - Parameter other: The other vector as an `Expr` to compare against. + /// - Returns: A new `FunctionExpr` representing the Manhattan distance. + func manhattanDistance(_ other: Expr) -> FunctionExpr + + /// Calculates the Manhattan (L1) distance between this vector expression and another vector + /// literal (`VectorValue`). + /// Assumes `self` evaluates to a Vector. + /// - Note: This API is in beta. + /// ```swift + /// let referencePoint = VectorValue(vector: [5.0, 10.0]) + /// Field("dataPoint").manhattanDistance(referencePoint) + /// ``` + /// - Parameter other: The other vector as a `VectorValue` to compare against. + /// - Returns: A new `FunctionExpr` representing the Manhattan distance. + func manhattanDistance(_ other: VectorValue) -> FunctionExpr + + /// Calculates the Manhattan (L1) distance between this vector expression and another vector + /// literal (`[Double]`). + /// Assumes `self` evaluates to a Vector. + /// - Note: This API is in beta. + /// + /// ```swift + /// // Manhattan distance between 'point' field and a target point + /// Field("point").manhattanDistance([10.0, 20.0]) + /// ``` + /// - Parameter other: The other vector as `[Double]` to compare against. + /// - Returns: A new `FunctionExpr` representing the Manhattan distance. + func manhattanDistance(_ other: [Double]) -> FunctionExpr + + // MARK: Timestamp operations + + /// Creates an expression that interprets this expression (evaluating to a number) as microseconds + /// since the Unix epoch and returns a timestamp. + /// Assumes `self` evaluates to a number. + /// + /// ```swift + /// // Interpret 'microseconds' field as microseconds since epoch. + /// Field("microseconds").unixMicrosToTimestamp() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the timestamp. + func unixMicrosToTimestamp() -> FunctionExpr + + /// Creates an expression that converts this timestamp expression to the number of microseconds + /// since the Unix epoch. Assumes `self` evaluates to a Timestamp. + /// + /// ```swift + /// // Convert 'timestamp' field to microseconds since epoch. + /// Field("timestamp").timestampToUnixMicros() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the number of microseconds. + func timestampToUnixMicros() -> FunctionExpr + + /// Creates an expression that interprets this expression (evaluating to a number) as milliseconds + /// since the Unix epoch and returns a timestamp. + /// Assumes `self` evaluates to a number. + /// + /// ```swift + /// // Interpret 'milliseconds' field as milliseconds since epoch. + /// Field("milliseconds").unixMillisToTimestamp() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the timestamp. + func unixMillisToTimestamp() -> FunctionExpr + + /// Creates an expression that converts this timestamp expression to the number of milliseconds + /// since the Unix epoch. Assumes `self` evaluates to a Timestamp. + /// + /// ```swift + /// // Convert 'timestamp' field to milliseconds since epoch. + /// Field("timestamp").timestampToUnixMillis() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the number of milliseconds. + func timestampToUnixMillis() -> FunctionExpr + + /// Creates an expression that interprets this expression (evaluating to a number) as seconds + /// since the Unix epoch and returns a timestamp. + /// Assumes `self` evaluates to a number. + /// + /// ```swift + /// // Interpret 'seconds' field as seconds since epoch. + /// Field("seconds").unixSecondsToTimestamp() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the timestamp. + func unixSecondsToTimestamp() -> FunctionExpr + + /// Creates an expression that converts this timestamp expression to the number of seconds + /// since the Unix epoch. Assumes `self` evaluates to a Timestamp. + /// + /// ```swift + /// // Convert 'timestamp' field to seconds since epoch. + /// Field("timestamp").timestampToUnixSeconds() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the number of seconds. + func timestampToUnixSeconds() -> FunctionExpr + + /// Creates an expression that adds a specified amount of time to this timestamp expression, + /// where unit and amount are provided as expressions. + /// Assumes `self` evaluates to a Timestamp, `unit` evaluates to a unit string, and `amount` + /// evaluates to an integer. + /// + /// ```swift + /// // Add duration from 'unitField'/'amountField' to 'timestamp' + /// Field("timestamp").timestampAdd(Field("unitField"), Field("amountField")) + /// ``` + /// + /// - Parameter unit: An `Expr` evaluating to the unit of time string (e.g., "day", "hour"). + /// Valid units are 'microsecond', 'millisecond', 'second', 'minute', 'hour', + /// 'day'. + /// - Parameter amount: An `Expr` evaluating to the amount (Int) of the unit to add. + /// - Returns: A new `FunctionExpr` representing the resulting timestamp. + func timestampAdd(_ unit: Expr, _ amount: Expr) -> FunctionExpr + + /// Creates an expression that adds a specified amount of time to this timestamp expression, + /// where unit and amount are provided as literals. + /// Assumes `self` evaluates to a Timestamp. + /// + /// ```swift + /// // Add 1 day to the 'timestamp' field. + /// Field("timestamp").timestampAdd(.day, 1) + /// ``` + /// + /// - Parameter unit: The `TimeUnit` enum representing the unit of time. + /// - Parameter amount: The literal `Int` amount of the unit to add. + /// - Returns: A new `FunctionExpr` representing the resulting timestamp. + func timestampAdd(_ unit: TimeUnit, _ amount: Int) -> FunctionExpr + + /// Creates an expression that subtracts a specified amount of time from this timestamp + /// expression, + /// where unit and amount are provided as expressions. + /// Assumes `self` evaluates to a Timestamp, `unit` evaluates to a unit string, and `amount` + /// evaluates to an integer. + /// + /// ```swift + /// // Subtract duration from 'unitField'/'amountField' from 'timestamp' + /// Field("timestamp").timestampSub(Field("unitField"), Field("amountField")) + /// ``` + /// + /// - Parameter unit: An `Expr` evaluating to the unit of time string (e.g., "day", "hour"). + /// Valid units are 'microsecond', 'millisecond', 'second', 'minute', 'hour', + /// 'day'. + /// - Parameter amount: An `Expr` evaluating to the amount (Int) of the unit to subtract. + /// - Returns: A new `FunctionExpr` representing the resulting timestamp. + func timestampSub(_ unit: Expr, _ amount: Expr) -> FunctionExpr + + /// Creates an expression that subtracts a specified amount of time from this timestamp + /// expression, + /// where unit and amount are provided as literals. + /// Assumes `self` evaluates to a Timestamp. + /// + /// ```swift + /// // Subtract 1 day from the 'timestamp' field. + /// Field("timestamp").timestampSub(.day, 1) + /// ``` + /// + /// - Parameter unit: The `TimeUnit` enum representing the unit of time. + /// - Parameter amount: The literal `Int` amount of the unit to subtract. + /// - Returns: A new `FunctionExpr` representing the resulting timestamp. + func timestampSub(_ unit: TimeUnit, _ amount: Int) -> FunctionExpr + + // MARK: - Bitwise operations + + /// Creates an expression applying bitwise AND between this expression and an integer literal. + /// Assumes `self` evaluates to an Integer or Bytes. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Bitwise AND of 'flags' field and 0xFF + /// Field("flags").bitAnd(0xFF) + /// ``` + /// + /// - Parameter otherBits: The integer literal operand. + /// - Returns: A new `FunctionExpr` representing the bitwise AND operation. + func bitAnd(_ otherBits: Int) -> FunctionExpr + + /// Creates an expression applying bitwise AND between this expression and a UInt8 literal (often + /// for byte masks). + /// Assumes `self` evaluates to an Integer or Bytes. + /// - Note: This API is in beta. + /// ```swift + /// // Bitwise AND of 'byteFlags' field and a byte mask + /// Field("byteFlags").bitAnd(0b00001111 as UInt8) + /// ``` + /// - Parameter otherBits: The UInt8 literal operand. + /// - Returns: A new `FunctionExpr` representing the bitwise AND operation. + func bitAnd(_ otherBits: UInt8) -> FunctionExpr + + /// Creates an expression applying bitwise AND between this expression and another expression. + /// Assumes `self` and `bitsExpression` evaluate to Integer or Bytes. + /// - Note: This API is in beta. + /// + /// ```swift + /// // Bitwise AND of 'mask1' and 'mask2' fields + /// Field("mask1").bitAnd(Field("mask2")) + /// ``` + /// - Parameter bitsExpression: The other `Expr` operand. + /// - Returns: A new `FunctionExpr` representing the bitwise AND operation. + func bitAnd(_ bitsExpression: Expr) -> FunctionExpr + + /// Creates an expression applying bitwise OR between this expression and an integer literal. + /// Assumes `self` evaluates to an Integer or Bytes. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Bitwise OR of 'flags' field and 0x01 + /// Field("flags").bitOr(0x01) + /// ``` + /// + /// - Parameter otherBits: The integer literal operand. + /// - Returns: A new `FunctionExpr` representing the bitwise OR operation. + func bitOr(_ otherBits: Int) -> FunctionExpr + + /// Creates an expression applying bitwise OR between this expression and a UInt8 literal. + /// Assumes `self` evaluates to an Integer or Bytes. + /// - Note: This API is in beta. + /// ```swift + /// // Set specific bits in 'controlByte' + /// Field("controlByte").bitOr(0b10000001 as UInt8) + /// ``` + /// - Parameter otherBits: The UInt8 literal operand. + /// - Returns: A new `FunctionExpr` representing the bitwise OR operation. + func bitOr(_ otherBits: UInt8) -> FunctionExpr + + /// Creates an expression applying bitwise OR between this expression and another expression. + /// Assumes `self` and `bitsExpression` evaluate to Integer or Bytes. + /// - Note: This API is in beta. + /// + /// ```swift + /// // Bitwise OR of 'permissionSet1' and 'permissionSet2' fields + /// Field("permissionSet1").bitOr(Field("permissionSet2")) + /// ``` + /// - Parameter bitsExpression: The other `Expr` operand. + /// - Returns: A new `FunctionExpr` representing the bitwise OR operation. + func bitOr(_ bitsExpression: Expr) -> FunctionExpr + + /// Creates an expression applying bitwise XOR between this expression and an integer literal. + /// Assumes `self` evaluates to an Integer or Bytes. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Bitwise XOR of 'toggle' field and 0xFFFF + /// Field("toggle").bitXor(0xFFFF) + /// ``` + /// + /// - Parameter otherBits: The integer literal operand. + /// - Returns: A new `FunctionExpr` representing the bitwise XOR operation. + func bitXor(_ otherBits: Int) -> FunctionExpr + + /// Creates an expression applying bitwise XOR between this expression and a UInt8 literal. + /// Assumes `self` evaluates to an Integer or Bytes. + /// - Note: This API is in beta. + /// ```swift + /// // Toggle bits in 'statusByte' using a XOR mask + /// Field("statusByte").bitXor(0b01010101 as UInt8) + /// ``` + /// - Parameter otherBits: The UInt8 literal operand. + /// - Returns: A new `FunctionExpr` representing the bitwise XOR operation. + func bitXor(_ otherBits: UInt8) -> FunctionExpr + + /// Creates an expression applying bitwise XOR between this expression and another expression. + /// Assumes `self` and `bitsExpression` evaluate to Integer or Bytes. + /// - Note: This API is in beta. + /// + /// ```swift + /// // Bitwise XOR of 'key1' and 'key2' fields (assuming Bytes) + /// Field("key1").bitXor(Field("key2")) + /// ``` + /// - Parameter bitsExpression: The other `Expr` operand. + /// - Returns: A new `FunctionExpr` representing the bitwise XOR operation. + func bitXor(_ bitsExpression: Expr) -> FunctionExpr + + /// Creates an expression applying bitwise NOT to this expression. + /// Assumes `self` evaluates to an Integer or Bytes. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Bitwise NOT of 'mask' field + /// Field("mask").bitNot() + /// ``` + /// + /// - Returns: A new `FunctionExpr` representing the bitwise NOT operation. + func bitNot() -> FunctionExpr + + /// Creates an expression applying bitwise left shift to this expression by a literal number of + /// bits. + /// Assumes `self` evaluates to Integer or Bytes. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Left shift 'value' field by 2 bits + /// Field("value").bitLeftShift(2) + /// ``` + /// + /// - Parameter y: The number of bits (Int literal) to shift by. + /// - Returns: A new `FunctionExpr` representing the bitwise left shift operation. + func bitLeftShift(_ y: Int) -> FunctionExpr + + /// Creates an expression applying bitwise left shift to this expression by a number of bits + /// specified by an expression. + /// Assumes `self` evaluates to Integer or Bytes, and `numberExpr` evaluates to an Integer. + /// - Note: This API is in beta. + /// + /// ```swift + /// // Left shift 'data' by number of bits in 'shiftCount' field + /// Field("data").bitLeftShift(Field("shiftCount")) + /// ``` + /// - Parameter numberExpr: An `Expr` (evaluating to an Int) for the number of bits to shift by. + /// - Returns: A new `FunctionExpr` representing the bitwise left shift operation. + func bitLeftShift(_ numberExpr: Expr) -> FunctionExpr + + /// Creates an expression applying bitwise right shift to this expression by a literal number of + /// bits. + /// Assumes `self` evaluates to Integer or Bytes. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Right shift 'value' field by 4 bits + /// Field("value").bitRightShift(4) + /// ``` + /// + /// - Parameter y: The number of bits (Int literal) to shift by. + /// - Returns: A new `FunctionExpr` representing the bitwise right shift operation. + func bitRightShift(_ y: Int) -> FunctionExpr + + /// Creates an expression applying bitwise right shift to this expression by a number of bits + /// specified by an expression. + /// Assumes `self` evaluates to Integer or Bytes, and `numberExpr` evaluates to an Integer. + /// - Note: This API is in beta. + /// + /// ```swift + /// // Right shift 'data' by number of bits in 'shiftCount' field + /// Field("data").bitRightShift(Field("shiftCount")) + /// ``` + /// - Parameter numberExpr: An `Expr` (evaluating to an Int) for the number of bits to shift by. + /// - Returns: A new `FunctionExpr` representing the bitwise right shift operation. + func bitRightShift(_ numberExpr: Expr) -> FunctionExpr + + /// Creates an expression that returns the result of `catchExpr` if this expression produces an + /// error during evaluation, + /// otherwise returns the result of this expression. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Try dividing 'a' by 'b', return field 'fallbackValue' on error (e.g., division by zero) + /// Field("a").divide(Field("b")).ifError(Field("fallbackValue")) + /// ``` + /// + /// - Parameter catchExpr: The `Expr` to evaluate and return if this expression errors. + /// - Returns: A new `FunctionExpr` representing the 'ifError' operation. + func ifError(_ catchExpr: Expr) -> FunctionExpr + + /// Creates an expression that returns the literal `catchValue` if this expression produces an + /// error during evaluation, + /// otherwise returns the result of this expression. + /// + /// - Note: This API is in beta. + /// + /// ```swift + /// // Get first item in 'title' array, or return "Default Title" if error (e.g., empty array) + /// Field("title").arrayGet(0).ifError("Default Title") + /// ``` + /// + /// - Parameter catchValue: The literal `Sendable` value to return if this expression errors. + /// - Returns: A new `FunctionExpr` representing the 'ifError' operation. + func ifError(_ catchValue: Sendable) -> FunctionExpr + + // MARK: Sorting + + /// Creates an `Ordering` object that sorts documents in ascending order based on this expression. + /// + /// ```swift + /// // Sort documents by the 'name' field in ascending order + /// firestore.pipeline().collection("users") + /// .sort(Field("name").ascending()) + /// ``` + /// + /// - Returns: A new `Ordering` instance for ascending sorting. + func ascending() -> Ordering + + /// Creates an `Ordering` object that sorts documents in descending order based on this + /// expression. + /// + /// ```swift + /// // Sort documents by the 'createdAt' field in descending order + /// firestore.pipeline().collection("users") + /// .sort(Field("createdAt").descending()) + /// ``` + /// + /// - Returns: A new `Ordering` instance for descending sorting. + func descending() -> Ordering +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/ArrayExpression.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/ArrayExpression.swift new file mode 100644 index 00000000000..e1f5d749c5f --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/ArrayExpression.swift @@ -0,0 +1,24 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class ArrayExpression: FunctionExpr, @unchecked Sendable { + var result: [Expr] = [] + public init(_ elements: [Sendable]) { + for element in elements { + result.append(Helper.sendableToExpr(element)) + } + + super.init("array", result) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/Constant.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/Constant.swift new file mode 100644 index 00000000000..8f6b3709892 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/Constant.swift @@ -0,0 +1,87 @@ +// Copyright 2025 Google LLC +// +// 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. + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE + +public struct Constant: Expr, BridgeWrapper, @unchecked Sendable { + let bridge: ExprBridge + + let value: Any? + + // Initializer for optional values (including nil) + init(_ value: Any?) { + self.value = value + if value == nil { + bridge = ConstantBridge(NSNull()) + } else { + bridge = ConstantBridge(value!) + } + } + + // Initializer for integer + public init(_ value: Int) { + self.init(value as Any) + } + + // Initializer for double + public init(_ value: Double) { + self.init(value as Any) + } + + // Initializer for strings + public init(_ value: String) { + self.init(value as Any) + } + + // Initializer for boolean values + public init(_ value: Bool) { + self.init(value as Any) + } + + // Initializer for Bytes + public init(_ value: Data) { + self.init(value as Any) + } + + // Initializer for GeoPoint values + public init(_ value: GeoPoint) { + self.init(value as Any) + } + + // Initializer for Timestamp values + public init(_ value: Timestamp) { + self.init(value as Any) + } + + // Initializer for Date values + public init(_ value: Date) { + self.init(value as Any) + } + + // Initializer for DocumentReference + public init(_ value: DocumentReference) { + self.init(value as Any) + } + + // Initializer for vector values + public init(_ value: VectorValue) { + self.init(value as Any) + } + + public static let `nil` = Constant(nil) +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/DocumentId.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/DocumentId.swift new file mode 100644 index 00000000000..70c621d8cbd --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/DocumentId.swift @@ -0,0 +1,19 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class DocumentId: Field, @unchecked Sendable { + public init() { + super.init("__name__") + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/Field.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/Field.swift new file mode 100644 index 00000000000..99dc7e1b21d --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/Field.swift @@ -0,0 +1,40 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class Field: ExprBridge, Expr, Selectable, BridgeWrapper, SelectableWrapper, + @unchecked Sendable { + let bridge: ExprBridge + + var alias: String + + var expr: Expr { + return self + } + + public let fieldName: String + + public init(_ name: String) { + let fieldBridge = FieldBridge(name: name) + bridge = fieldBridge + fieldName = fieldBridge.field_name() + alias = fieldName + } + + public init(_ path: FieldPath) { + let fieldBridge = FieldBridge(path: path) + bridge = fieldBridge + fieldName = fieldBridge.field_name() + alias = fieldName + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr.swift new file mode 100644 index 00000000000..533f6a5ef51 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr.swift @@ -0,0 +1,30 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class FunctionExpr: Expr, BridgeWrapper, @unchecked Sendable { + let bridge: ExprBridge + + let functionName: String + let agrs: [Expr] + + public init(_ functionName: String, _ agrs: [Expr]) { + self.functionName = functionName + self.agrs = agrs + bridge = FunctionExprBridge( + name: functionName, + args: self.agrs.map { $0.toBridge() + } + ) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr/BooleanExpr.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr/BooleanExpr.swift new file mode 100644 index 00000000000..701276d51f7 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr/BooleanExpr.swift @@ -0,0 +1,46 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class BooleanExpr: FunctionExpr, @unchecked Sendable { + override public init(_ functionName: String, _ agrs: [Expr]) { + super.init(functionName, agrs) + } + + public func countIf() -> AggregateFunction { + return AggregateFunction("count_if", [self]) + } + + public func then(_ thenExpr: Expr, else elseExpr: Expr) -> FunctionExpr { + return FunctionExpr("cond", [self, thenExpr, elseExpr]) + } + + public static func && (lhs: BooleanExpr, + rhs: @autoclosure () throws -> BooleanExpr) rethrows -> BooleanExpr { + try BooleanExpr("and", [lhs, rhs()]) + } + + public static func || (lhs: BooleanExpr, + rhs: @autoclosure () throws -> BooleanExpr) rethrows -> BooleanExpr { + try BooleanExpr("or", [lhs, rhs()]) + } + + public static func ^ (lhs: BooleanExpr, + rhs: @autoclosure () throws -> BooleanExpr) rethrows -> BooleanExpr { + try BooleanExpr("xor", [lhs, rhs()]) + } + + public static prefix func ! (lhs: BooleanExpr) -> BooleanExpr { + return BooleanExpr("not", [lhs]) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr/RandomExpr.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr/RandomExpr.swift new file mode 100644 index 00000000000..5ea39db81fc --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/FunctionExpr/RandomExpr.swift @@ -0,0 +1,19 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class RandomExpr: FunctionExpr, @unchecked Sendable { + public init() { + super.init("rand", []) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/MapExpression.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/MapExpression.swift new file mode 100644 index 00000000000..93d9bb4859b --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Expr/MapExpression.swift @@ -0,0 +1,25 @@ +// Copyright 2025 Google LLC +// +// 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. + +public class MapExpression: FunctionExpr, @unchecked Sendable { + var result: [Expr] = [] + public init(_ elements: [String: Sendable]) { + for element in elements { + result.append(Constant(element.key)) + result.append(Helper.sendableToExpr(element.value)) + } + + super.init("map", result) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/ExprWithAlias.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/ExprWithAlias.swift new file mode 100644 index 00000000000..247427f2fd8 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/ExprWithAlias.swift @@ -0,0 +1,24 @@ +// Copyright 2025 Google LLC +// +// 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. + +public struct ExprWithAlias: Selectable, SelectableWrapper, Sendable { + public var alias: String + + public var expr: Expr + + init(_ expr: Expr, _ alias: String) { + self.alias = alias + self.expr = expr + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Ordering.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Ordering.swift new file mode 100644 index 00000000000..9659e95e682 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Ordering.swift @@ -0,0 +1,50 @@ +/* + * Copyright 2024 Google LLC + * + * 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. + */ + +public class Ordering: @unchecked Sendable { + let expr: Expr + let direction: Direction + let bridge: OrderingBridge + + init(expr: Expr, direction: Direction) { + self.expr = expr + self.direction = direction + bridge = OrderingBridge(expr: expr.toBridge(), direction: direction.rawValue) + } +} + +public struct Direction: Sendable, Equatable, Hashable { + let kind: Kind + let rawValue: String + + enum Kind: String { + case ascending + case descending + } + + public static var ascending: Direction { + return self.init(kind: .ascending, rawValue: "ascending") + } + + public static var descending: Direction { + return self.init(kind: .descending, rawValue: "descending") + } + + init(kind: Kind, rawValue: String) { + self.kind = kind + self.rawValue = rawValue + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Pipeline.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Pipeline.swift new file mode 100644 index 00000000000..6c2a6e34053 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Pipeline.swift @@ -0,0 +1,729 @@ +// Copyright 2025 Google LLC +// +// 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. + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE +import Foundation + +/// The `Pipeline` class provides a flexible and expressive framework for building complex data +/// transformation and query pipelines for Firestore. +/// +/// A pipeline takes data sources, such as Firestore collections or collection groups, and applies +/// a series of stages that are chained together. Each stage takes the output from the previous +/// stage +/// (or the data source) and produces an output for the next stage (or as the final output of the +/// pipeline). +/// +/// Expressions can be used within each stage to filter and transform data through the stage. +/// +/// NOTE: The chained stages do not prescribe exactly how Firestore will execute the pipeline. +/// Instead, Firestore only guarantees that the result is the same as if the chained stages were +/// executed in order. +/// +/// ## Usage Examples +/// +/// The following examples assume you have a `Firestore` instance named `db`. +/// +/// ```swift +/// import FirebaseFirestore +/// +/// // Example 1: Select specific fields and rename 'rating' to 'bookRating'. +/// // Assumes `Field("rating").as("bookRating")` is a valid `Selectable` expression. +/// do { +/// let results1 = try await db.pipeline().collection("books") +/// .select(Field("title"), Field("author"), Field("rating").as("bookRating")) +/// .execute() +/// print("Results 1: \(results1.documents)") +/// } catch { +/// print("Error in example 1: \(error)") +/// } +/// +/// // Example 2: Filter documents where 'genre' is "Science Fiction" and 'published' is after 1950. +/// // Assumes `Function.eq`, `Function.gt`, and `Function.and` create `BooleanExpr`. +/// do { +/// let results2 = try await db.pipeline().collection("books") +/// .where(Function.and( +/// Function.eq(Field("genre"), "Science Fiction"), +/// Function.gt(Field("published"), 1950) +/// )) +/// .execute() +/// print("Results 2: \(results2.documents)") +/// } catch { +/// print("Error in example 2: \(error)") +/// } +/// +/// // Example 3: Calculate the average rating of books published after 1980. +/// // Assumes `avg()` creates an `Accumulator` and `AggregateWithAlias` is used correctly. +/// do { +/// let results3 = try await db.pipeline().collection("books") +/// .where(Function.gt(Field("published"), 1980)) +/// .aggregate(AggregateWithas(avg(Field("rating")), alias: "averageRating")) +/// .execute() +/// print("Results 3: \(results3.documents)") +/// } catch { +/// print("Error in example 3: \(error)") +/// } +/// ``` +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +public struct Pipeline: @unchecked Sendable { + private var stages: [Stage] + let bridge: PipelineBridge + let db: Firestore + + init(stages: [Stage], db: Firestore) { + self.stages = stages + self.db = db + bridge = PipelineBridge(stages: stages.map { $0.bridge }, db: db) + } + + /// Executes the defined pipeline and returns a `PipelineSnapshot` containing the results. + /// + /// This method asynchronously sends the pipeline definition to Firestore for execution. + /// The resulting documents, transformed and filtered by the pipeline stages, are returned + /// within a `PipelineSnapshot`. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume a pipeline is already configured. + /// do { + /// let snapshot = try await pipeline.execute() + /// // Process snapshot.documents + /// print("Pipeline executed successfully: \(snapshot.documents)") + /// } catch { + /// print("Pipeline execution failed: \(error)") + /// } + /// ``` + /// + /// - Throws: An error if the pipeline execution fails on the backend. + /// - Returns: A `PipelineSnapshot` containing the result of the pipeline execution. + public func execute() async throws -> PipelineSnapshot { + return try await withCheckedThrowingContinuation { continuation in + self.bridge.execute { result, error in + if let error { + continuation.resume(throwing: error) + } else { + continuation.resume(returning: PipelineSnapshot(result!, pipeline: self)) + } + } + } + } + + /// Adds new fields to outputs from previous stages. + /// + /// This stage allows you to compute values on-the-fly based on existing data from previous + /// stages or constants. You can use this to create new fields or overwrite existing ones + /// (if there is a name overlap). + /// + /// The added fields are defined using `Selectable`s, which can be: + /// - `Field`: References an existing document field. + /// - `Function`: Performs a calculation using functions like `Function.add` or + /// `Function.multiply`, + /// typically with an assigned alias (e.g., `Function.multiply(Field("price"), + /// 1.1).as("priceWithTax")`). + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline from a collection. + /// let updatedPipeline = pipeline.addFields( + /// Field("rating").as("bookRating"), // Rename 'rating' to 'bookRating'. + /// Function.add(5, Field("quantity")).as("totalQuantityPlusFive") // Calculate + /// 'totalQuantityPlusFive'. + /// ) + /// // let results = try await updatedPipeline.execute() + /// ``` + /// + /// - Parameter field: The first field to add to the documents, specified as a `Selectable`. + /// - Parameter additionalFields: Optional additional fields to add, specified as `Selectable`s. + /// - Returns: A new `Pipeline` object with this stage appended. + public func addFields(_ field: Selectable, _ additionalFields: Selectable...) -> Pipeline { + let fields = [field] + additionalFields + return Pipeline(stages: stages + [AddFields(fields: fields)], db: db) + } + + /// Removes fields from outputs of previous stages. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// let updatedPipeline = pipeline.removeFields(Field("confidentialData"), Field("internalNotes")) + /// // let results = try await updatedPipeline.execute() + /// ``` + /// + /// - Parameter field: The first field to remove, specified as a `Field` instance. + /// - Parameter additionalFields: Optional additional fields to remove. + /// - Returns: A new `Pipeline` object with this stage appended. + public func removeFields(_ field: Field, _ additionalFields: Field...) -> Pipeline { + return Pipeline( + stages: stages + [RemoveFieldsStage(fields: [field] + additionalFields)], + db: db + ) + } + + /// Removes fields from outputs of previous stages using field names. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// // Removes fields 'rating' and 'cost' from the previous stage outputs. + /// let updatedPipeline = pipeline.removeFields("rating", "cost") + /// // let results = try await updatedPipeline.execute() + /// ``` + /// + /// - Parameter field: The name of the first field to remove. + /// - Parameter additionalFields: Optional additional field names to remove. + /// - Returns: A new `Pipeline` object with this stage appended. + public func removeFields(_ field: String, _ additionalFields: String...) -> Pipeline { + return Pipeline( + stages: stages + [RemoveFieldsStage(fields: [field] + additionalFields)], + db: db + ) + } + + /// Selects or creates a set of fields from the outputs of previous stages. + /// + /// The selected fields are defined using `Selectable` expressions, which can be: + /// - `String`: Name of an existing field (implicitly converted to `Field`). + /// - `Field`: References an existing field. + /// - `Function`: Represents the result of a function with an assigned alias + /// (e.g., `Function.toUppercase(Field("address")).as("upperAddress")`). + /// + /// If no selections are provided, the output of this stage is typically empty. + /// Use `addFields` if only additions are desired without replacing the existing document + /// structure. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// let projectedPipeline = pipeline.select( + /// Field("firstName"), + /// Field("lastName"), + /// Function.toUppercase(Field("address")).as("upperAddress") + /// ) + /// // let results = try await projectedPipeline.execute() + /// ``` + /// + /// - Parameter selection: The first field to include in the output documents, specified as a + /// `Selectable`. + /// - Parameter additionalSelections: Optional additional fields to include, specified as + /// `Selectable`s. + /// - Returns: A new `Pipeline` object with this stage appended. + public func select(_ selection: Selectable, _ additionalSelections: Selectable...) -> Pipeline { + let selections = [selection] + additionalSelections + return Pipeline( + stages: stages + [Select(selections: selections)], + db: db + ) + } + + /// Selects a set of fields from the outputs of previous stages using field names. + /// + /// The selected fields are specified by their names. If no selections are provided, + /// the output of this stage is typically empty. Use `addFields` if only additions are desired. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// let projectedPipeline = pipeline.select("title", "author", "yearPublished") + /// // let results = try await projectedPipeline.execute() + /// ``` + /// + /// - Parameter selection: The name of the first field to include in the output documents. + /// - Parameter additionalSelections: Optional additional field names to include. + /// - Returns: A new `Pipeline` object with this stage appended. + public func select(_ selection: String, _ additionalSelections: String...) -> Pipeline { + let selections = ([selection] + additionalSelections).map { Field($0) } + return Pipeline( + stages: stages + [Select(selections: selections)], + db: db + ) + } + + public func select(_ selections: [Selectable]) -> Pipeline { + return Pipeline( + stages: stages + [Select(selections: selections)], + db: db + ) + } + + /// Filters documents from previous stages, including only those matching the specified + /// `BooleanExpr`. + /// + /// This stage applies conditions similar to a "WHERE" clause in SQL. + /// Filter documents based on field values using `BooleanExpr` implementations, such as: + /// - Field comparators: `Function.eq`, `Function.lt` (less than), `Function.gt` (greater than). + /// - Logical operators: `Function.and`, `Function.or`, `Function.not`. + /// - Advanced functions: `Function.regexMatch`, `Function.arrayContains`. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// let filteredPipeline = pipeline.where( + /// Field("rating").gt(4.0) // Rating greater than 4.0. + /// && Field("genre").eq("Science Fiction") // Genre is "Science Fiction". + /// ) + /// // let results = try await filteredPipeline.execute() + /// ``` + /// + /// - Parameter condition: The `BooleanExpr` to apply. + /// - Returns: A new `Pipeline` object with this stage appended. + public func `where`(_ condition: BooleanExpr) -> Pipeline { + return Pipeline(stages: stages + [Where(condition: condition)], db: db) + } + + /// Skips the first `offset` number of documents from the results of previous stages. + /// + /// A negative input number might count back from the end of the result set, + /// depending on backend behavior. This stage is useful for pagination, + /// typically used with `limit` to control page size. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline, possibly sorted. + /// // Retrieve the second page of 20 results (skip first 20, limit to next 20). + /// let pagedPipeline = pipeline + /// .sort(Ascending("published")) // Example sort. + /// .offset(20) // Skip the first 20 results. + /// .limit(20) // Take the next 20 results. + /// // let results = try await pagedPipeline.execute() + /// ``` + /// + /// - Parameter offset: The number of documents to skip (a `Int32` value). + /// - Returns: A new `Pipeline` object with this stage appended. + public func offset(_ offset: Int32) -> Pipeline { + return Pipeline(stages: stages + [Offset(offset)], db: db) + } + + /// Limits the maximum number of documents returned by previous stages to `limit`. + /// + /// A negative input number might count back from the end of the result set, + /// depending on backend behavior. This stage helps retrieve a controlled subset of data. + /// It's often used for: + /// - **Pagination:** With `offset` to retrieve specific pages. + /// - **Limiting Data Retrieval:** To improve performance with large collections. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// // Limit results to the top 10 highest-rated books. + /// let topTenPipeline = pipeline + /// .sort(Descending(Field("rating"))) + /// .limit(10) + /// // let results = try await topTenPipeline.execute() + /// ``` + /// + /// - Parameter limit: The maximum number of documents to return (a `Int32` value). + /// - Returns: A new `Pipeline` object with this stage appended. + public func limit(_ limit: Int32) -> Pipeline { + return Pipeline(stages: stages + [Limit(limit)], db: db) + } + + /// Returns a set of distinct documents based on specified grouping field names. + /// + /// This stage ensures that only unique combinations of values for the specified + /// group fields are included from the previous stage's output. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// // Get a list of unique author and genre combinations. + /// let distinctAuthorsGenresPipeline = pipeline.distinct("author", "genre") + /// // To further select only the author: + /// // .select("author") + /// // let results = try await distinctAuthorsGenresPipeline.execute() + /// ``` + /// + /// - Parameter group: The name of the first field for distinct value combinations. + /// - Parameter additionalGroups: Optional additional field names. + /// - Returns: A new `Pipeline` object with this stage appended. + public func distinct(_ group: String, _ additionalGroups: String...) -> Pipeline { + let selections = ([group] + additionalGroups).map { Field($0) } + return Pipeline(stages: stages + [Distinct(groups: selections)], db: db) + } + + /// Returns a set of distinct documents based on specified `Selectable` expressions. + /// + /// This stage ensures unique combinations of values from evaluated `Selectable` + /// expressions (e.g., `Field` or `Function` results). + /// + /// `Selectable` expressions can be: + /// - `Field`: A reference to an existing document field. + /// - `Function`: The result of a function with an alias (e.g., + /// `Function.toUppercase(Field("author")).as("authorName")`). + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// // Get unique uppercase author names and genre combinations. + /// let distinctPipeline = pipeline.distinct( + /// Field("author").uppercased().as("authorName"), + /// Field("genre") + /// ) + /// // To select only the transformed author name: + /// // .select(Field("authorName")) + /// // let results = try await distinctPipeline.execute() + /// ``` + /// + /// - Parameter group: The first `Selectable` expression to consider. + /// - Parameter additionalGroups: Optional additional `Selectable` expressions. + /// - Returns: A new `Pipeline` object with this stage appended. + public func distinct(_ group: Selectable, _ additionalGroups: Selectable...) -> Pipeline { + let groups = [group] + additionalGroups + return Pipeline(stages: stages + [Distinct(groups: groups)], db: db) + } + + /// Performs aggregation operations on all documents from previous stages. + /// + /// Computes aggregate values (e.g., sum, average, count) over the entire set of documents + /// from the previous stage. Aggregations are defined using `AggregateWithAlias`, + /// which pairs an `Accumulator` (e.g., `avg(Field("price"))`) with a result field name. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume pipeline from a "books" collection. + /// // Calculate the average rating and total number of books. + /// let aggregatedPipeline = pipeline.aggregate( + /// AggregateWithas(aggregate: avg(Field("rating")), alias: "averageRating"), + /// AggregateWithas(aggregate: countAll(), alias: "totalBooks") + /// ) + /// // let results = try await aggregatedPipeline.execute() + /// // results.documents might be: [["averageRating": 4.2, "totalBooks": 150]] + /// ``` + /// + /// - Parameter accumulator: The first `AggregateWithAlias` expression. + /// - Parameter additionalAccumulators: Optional additional `AggregateWithAlias` expressions. + /// - Returns: A new `Pipeline` object with this stage appended. + public func aggregate(_ accumulator: AggregateWithAlias, + _ additionalAccumulators: AggregateWithAlias...) -> Pipeline { + return Pipeline( + stages: stages + [Aggregate( + accumulators: [accumulator] + additionalAccumulators, + groups: nil // No grouping: aggregate over all documents. + )], + db: db + ) + } + + /// Performs optionally grouped aggregation operations on documents from previous stages. + /// + /// Calculates aggregate values, optionally grouping documents by fields or `Selectable` + /// expressions. + /// - **Grouping:** Defined by the `groups` parameter. Each unique combination of values + /// from these `Selectable`s forms a group. If `groups` is `nil` or empty, + /// all documents form a single group. + /// - **Accumulators:** An array of `AggregateWithAlias` defining operations + /// (e.g., sum, average) within each group. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume pipeline from "books" collection. + /// // Calculate the average rating for each genre. + /// let groupedAggregationPipeline = pipeline.aggregate( + /// [AggregateWithas(aggregate: avg(Field("rating")), alias: "avg_rating")], + /// groups: [Field("genre")] // Group by the "genre" field. + /// ) + /// // let results = try await groupedAggregationPipeline.execute() + /// // results.documents might be: + /// // [ + /// // ["genre": "SciFi", "avg_rating": 4.5], + /// // ["genre": "Fantasy", "avg_rating": 4.2] + /// // ] + /// ``` + /// + /// - Parameters: + /// - accumulator: An array of `AggregateWithAlias` expressions for calculations. + /// - groups: Optional array of `Selectable` expressions for grouping. If `nil` or empty, + /// aggregates across all documents. + /// - Returns: A new `Pipeline` object with this stage appended. + public func aggregate(_ accumulator: [AggregateWithAlias], + groups: [Selectable]? = nil) -> Pipeline { + return Pipeline(stages: stages + [Aggregate(accumulators: accumulator, groups: groups)], db: db) + } + + /// Performs optionally grouped aggregation operations using field names for grouping. + /// + /// Similar to the other `aggregate` method, but `groups` are specified as an array of `String` + /// field names. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume pipeline from "books" collection. + /// // Count books for each publisher. + /// let groupedByPublisherPipeline = pipeline.aggregate( + /// [AggregateWithas(aggregate: countAll(), alias: "book_count")], + /// groups: ["publisher"] // Group by the "publisher" field name. + /// ) + /// // let results = try await groupedByPublisherPipeline.execute() + /// // results.documents might be: + /// // [ + /// // ["publisher": "Penguin", "book_count": 50], + /// // ["publisher": "HarperCollins", "book_count": 35] + /// // ] + /// ``` + /// + /// - Parameters: + /// - accumulator: An array of `AggregateWithAlias` expressions. + /// - groups: An optional array of `String` field names for grouping. + /// - Returns: A new `Pipeline` object with this stage appended. + public func aggregate(_ accumulator: [AggregateWithAlias], + groups: [String]? = nil) -> Pipeline { + let selectables = groups?.map { Field($0) } + return Pipeline( + stages: stages + [Aggregate(accumulators: accumulator, groups: selectables)], + db: db + ) + } + + /// Performs a vector similarity search, ordering results by similarity. + /// + /// Returns up to `limit` documents, from most to least similar based on vector embeddings. + /// The distance can optionally be included in a specified field. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume pipeline from a collection with vector embeddings. + /// let queryVector: [Double] = [0.1, 0.2, ..., 0.8] // Example query vector. + /// let nearestNeighborsPipeline = pipeline.findNearest( + /// field: Field("embedding_field"), // Field containing the vector. + /// vectorValue: queryVector, // Query vector for comparison. + /// distanceMeasure: .COSINE, // Distance metric. + /// limit: 10, // Return top 10 nearest neighbors. + /// distanceField: "similarityScore" // Optional: field for distance score. + /// ) + /// // let results = try await nearestNeighborsPipeline.execute() + /// ``` + /// + /// - Parameters: + /// - field: The `Field` containing vector embeddings. + /// - vectorValue: An array of `Double` representing the query vector. + /// - distanceMeasure: The `DistanceMeasure` (e.g., `.EUCLIDEAN`, `.COSINE`) for comparison. + /// - limit: Optional. Maximum number of similar documents to return. + /// - distanceField: Optional. Name for a new field to store the calculated distance. + /// - Returns: A new `Pipeline` object with this stage appended. + public func findNearest(field: Field, + vectorValue: [Double], + distanceMeasure: DistanceMeasure, + limit: Int? = nil, + distanceField: String? = nil) -> Pipeline { + return Pipeline( + stages: stages + [ + FindNearest( + field: field, + vectorValue: vectorValue, + distanceMeasure: distanceMeasure, + limit: limit, + distanceField: distanceField + ), + ], + db: db + ) + } + + /// Sorts documents from previous stages based on one or more `Ordering` criteria. + /// + /// Specify multiple `Ordering` instances for multi-field sorting (ascending/descending). + /// If documents are equal by one criterion, the next is used. If all are equal, + /// relative order is unspecified. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// // Sort books by rating (descending), then by title (ascending). + /// let sortedPipeline = pipeline.sort( + /// Ascending("rating"), + /// Descending("title") // or Field("title").ascending() for ascending. + /// ) + /// // let results = try await sortedPipeline.execute() + /// ``` + /// + /// - Parameter ordering: The primary `Ordering` criterion. + /// - Parameter additionalOrdering: Optional additional `Ordering` criteria for secondary sorting, + /// etc. + /// - Returns: A new `Pipeline` object with this stage appended. + public func sort(_ ordering: Ordering, _ additionalOrdering: Ordering...) -> Pipeline { + let orderings = [ordering] + additionalOrdering + return Pipeline(stages: stages + [Sort(orderings: orderings)], db: db) + } + + /// Fully overwrites document fields with those from a nested map identified by an `Expr`. + /// + /// "Promotes" a map value (dictionary) from a field to become the new root document. + /// Each key-value pair from the map specified by `expr` becomes a field-value pair + /// in the output document, discarding original document fields. + /// + /// ```swift + /// // Assume input document: + /// // { "id": "user123", "profile": { "name": "Alex", "age": 30 }, "status": "active" } + /// // let pipeline: Pipeline = ... + /// + /// // Replace document with the contents of the 'profile' map. + /// let replacedPipeline = pipeline.replace(with: Field("profile")) + /// + /// // let results = try await replacedPipeline.execute() + /// // Output document would be: { "name": "Alex", "age": 30 } + /// ``` + /// + /// - Parameter expr: The `Expr` (typically a `Field`) that resolves to the nested map. + /// - Returns: A new `Pipeline` object with this stage appended. + public func replace(with expr: Expr) -> Pipeline { + return Pipeline(stages: stages + [ReplaceWith(expr: expr)], db: db) + } + + /// Fully overwrites document fields with those from a nested map identified by a field name. + /// + /// "Promotes" a map value (dictionary) from a field to become the new root document. + /// Each key-value pair from the map in `fieldName` becomes a field-value pair + /// in the output document, discarding original document fields. + /// + /// ```swift + /// // Assume input document: + /// // { "id": "user123", "details": { "role": "admin", "department": "tech" }, "joined": + /// "2023-01-15" } + /// // let pipeline: Pipeline = ... + /// + /// // Replace document with the contents of the 'details' map. + /// let replacedPipeline = pipeline.replace(with: "details") + /// + /// // let results = try await replacedPipeline.execute() + /// // Output document would be: { "role": "admin", "department": "tech" } + /// ``` + /// + /// - Parameter fieldName: The name of the field containing the nested map. + /// - Returns: A new `Pipeline` object with this stage appended. + public func replace(with fieldName: String) -> Pipeline { + return Pipeline(stages: stages + [ReplaceWith(expr: Field(fieldName))], db: db) + } + + /// Performs pseudo-random sampling of input documents, returning a specific count. + /// + /// Filters documents pseudo-randomly. `count` specifies the approximate number + /// to return. The actual number may vary and isn't guaranteed if the input set + /// is smaller than `count`. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume pipeline from a large collection. + /// // Sample 25 books, if available. + /// let sampledPipeline = pipeline.sample(count: 25) + /// // let results = try await sampledPipeline.execute() + /// ``` + /// + /// - Parameter count: The target number of documents to sample (a `Int64` value). + /// - Returns: A new `Pipeline` object with this stage appended. + public func sample(count: Int64) -> Pipeline { + return Pipeline(stages: stages + [Sample(count: count)], db: db) + } + + /// Performs pseudo-random sampling of input documents, returning a percentage. + /// + /// Filters documents pseudo-randomly. `percentage` (0.0 to 1.0) specifies + /// the approximate fraction of documents to return from the input set. + /// + /// ```swift + /// // let pipeline: Pipeline = ... // Assume initial pipeline. + /// // Sample 50% of books. + /// let sampledPipeline = pipeline.sample(percentage: 0.5) + /// // let results = try await sampledPipeline.execute() + /// ``` + /// + /// - Parameter percentage: The percentage of documents to sample (e.g., 0.5 for 50%; a `Double` + /// value). + /// - Returns: A new `Pipeline` object with this stage appended. + public func sample(percentage: Double) -> Pipeline { + return Pipeline(stages: stages + [Sample(percentage: percentage)], db: db) + } + + /// Performs a union of all documents from this pipeline and another, including duplicates. + /// + /// Passes through documents from this pipeline's previous stage and also those from + /// the `other` pipeline's previous stage. The order of emitted documents is undefined. + /// Both pipelines should ideally have compatible document structures. + /// + /// ```swift + /// // let db: Firestore = ... + /// // let booksPipeline = db.collection("books").pipeline().select("title", "category") + /// // let magazinesPipeline = db.collection("magazines").pipeline().select("title", + /// Field("topic").as("category")) + /// + /// // Emit documents from both "books" and "magazines" collections. + /// let combinedPipeline = booksPipeline.union(magazinesPipeline) + /// // let results = try await combinedPipeline.execute() + /// ``` + /// + /// - Parameter other: The other `Pipeline` whose documents will be unioned. + /// - Returns: A new `Pipeline` object with this stage appended. + public func union(_ other: Pipeline) -> Pipeline { + return Pipeline(stages: stages + [Union(other: other)], db: db) + } + + /// Takes an array field from input documents and outputs a new document for each element. + /// + /// For each input document, this stage emits zero or more augmented documents based on + /// an array field specified by `field` (a `Selectable`). The `Selectable` for `field` + /// **must** have an alias; this alias becomes the field name in the output document + /// containing the unnested element. + /// + /// The original field containing the array is effectively replaced by the array element + /// under the new alias name in each output document. Other fields from the original document + /// are typically preserved. + /// + /// If `indexField` is provided, a new field with this name is added, containing the + /// zero-based index of the element within its original array. + /// + /// Behavior for non-array values or empty arrays depends on the backend. + /// + /// ```swift + /// // Assume input document: + /// // { "title": "The Hitchhiker's Guide", "authors": ["Douglas Adams", "Eoin Colfer"] } + /// // let pipeline: Pipeline = ... + /// + /// // Unnest 'authors'. Each author becomes a new document with the author in a "authorName" + /// field. + /// let unnestedPipeline = pipeline.unnest(Field("authors").as("authorName"), indexField: + /// "authorIndex") + /// + /// // let results = try await unnestedPipeline.execute() + /// // Possible Output (other fields like "title" are preserved): + /// // { "title": "The Hitchhiker's Guide", "authorName": "Douglas Adams", "authorIndex": 0 } + /// // { "title": "The Hitchhiker's Guide", "authorName": "Eoin Colfer", "authorIndex": 1 } + /// ``` + /// + /// - Parameters: + /// - field: A `Selectable` resolving to an array field. **Must include an alias** + /// (e.g., `Field("myArray").as("arrayElement")`) to name the output field. + /// - indexField: Optional. If provided, this string names a new field for the element's + /// zero-based index from the original array. + /// - Returns: A new `Pipeline` object with this stage appended. + public func unnest(_ field: Selectable, indexField: String? = nil) -> Pipeline { + return Pipeline(stages: stages + [Unnest(field: field, indexField: indexField)], db: db) + } + + /// Adds a generic stage to the pipeline by specifying its name and parameters. + /// + /// Use this to call backend-supported stages not yet strongly-typed in the SDK. + /// This method does not offer compile-time type safety for stage parameters; + /// the caller must ensure correct name, order, and types. + /// + /// Parameters in `params` and `options` are typically primitive types, `Field`, + /// `Function`, `Expr`, or arrays/dictionaries thereof. + /// + /// ```swift + /// // let pipeline: Pipeline = ... + /// // Example: Assuming a hypothetical backend stage "customFilterV2". + /// let genericPipeline = pipeline.rawStage( + /// name: "customFilterV2", + /// params: [Field("userScore"), 80], // Ordered parameters. + /// options: ["mode": "strict", "logLevel": 2] // Optional named parameters. + /// ) + /// // let results = try await genericPipeline.execute() + /// ``` + /// + /// - Parameters: + /// - name: The unique name of the stage (as recognized by the backend). + /// - params: An array of ordered, `Sendable` parameters for the stage. + /// - options: Optional dictionary of named, `Sendable` parameters. + /// - Returns: A new `Pipeline` object with this stage appended. + public func rawStage(name: String, params: [Sendable?], + options: [String: Sendable]? = nil) -> Pipeline { + return Pipeline( + stages: stages + [RawStage(name: name, params: params, options: options)], + db: db + ) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineResult.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineResult.swift new file mode 100644 index 00000000000..67e55663268 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineResult.swift @@ -0,0 +1,70 @@ +// Copyright 2025 Google LLC +// +// 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. + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE +import Foundation + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +public struct PipelineResult: @unchecked Sendable { + let bridge: __PipelineResultBridge + + init(_ bridge: __PipelineResultBridge) { + self.bridge = bridge + ref = self.bridge.reference + id = self.bridge.documentID + data = self.bridge.data().mapValues { Helper.convertObjCToSwift($0) } + createTime = self.bridge.create_time + updateTime = self.bridge.update_time + } + + /// The reference of the document, if the query returns the `__name__` field. + public let ref: DocumentReference? + + /// The ID of the document for which this `PipelineResult` contains data, if available. + public let id: String? + + /// The time the document was created, if available. + public let createTime: Timestamp? + + /// The time the document was last updated when the snapshot was generated. + public let updateTime: Timestamp? + + /// Retrieves all fields in the result as a dictionary. + public let data: [String: Sendable?] + + /// Retrieves the field specified by `fieldPath`. + /// - Parameter fieldPath: The field path (e.g., "foo" or "foo.bar"). + /// - Returns: The data at the specified field location or `nil` if no such field exists. + public func get(_ fieldName: String) -> Sendable? { + return Helper.convertObjCToSwift(bridge.get(fieldName)) + } + + /// Retrieves the field specified by `fieldPath`. + /// - Parameter fieldPath: The field path (e.g., "foo" or "foo.bar"). + /// - Returns: The data at the specified field location or `nil` if no such field exists. + public func get(_ fieldPath: FieldPath) -> Sendable? { + return Helper.convertObjCToSwift(bridge.get(fieldPath)) + } + + /// Retrieves the field specified by `fieldPath`. + /// - Parameter fieldPath: The field path (e.g., "foo" or "foo.bar"). + /// - Returns: The data at the specified field location or `nil` if no such field exists. + public func get(_ field: Field) -> Sendable? { + return Helper.convertObjCToSwift(bridge.get(field.fieldName)) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineSnapshot.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineSnapshot.swift new file mode 100644 index 00000000000..a260cc55cee --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineSnapshot.swift @@ -0,0 +1,41 @@ +// Copyright 2025 Google LLC +// +// 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. + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE +import Foundation + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +public struct PipelineSnapshot: Sendable { + /// The Pipeline on which `execute()` was called to obtain this `PipelineSnapshot`. + public let pipeline: Pipeline + + /// An array of all the results in the `PipelineSnapshot`. + public let results: [PipelineResult] + + /// The time at which the pipeline producing this result was executed. + public let executionTime: Timestamp + + let bridge: __PipelineSnapshotBridge + + init(_ bridge: __PipelineSnapshotBridge, pipeline: Pipeline) { + self.bridge = bridge + self.pipeline = pipeline + executionTime = self.bridge.execution_time + results = self.bridge.results.map { PipelineResult($0) } + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineSource.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineSource.swift new file mode 100644 index 00000000000..6a0026340a2 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/PipelineSource.swift @@ -0,0 +1,60 @@ +// Copyright 2025 Google LLC +// +// 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. + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +public struct PipelineSource: @unchecked Sendable { + let db: Firestore + + init(_ db: Firestore) { + self.db = db + } + + public func collection(_ path: String) -> Pipeline { + return Pipeline(stages: [CollectionSource(collection: db.collection(path), db: db)], db: db) + } + + public func collection(_ ref: CollectionReference) -> Pipeline { + let collectionStage = CollectionSource(collection: ref, db: db) + return Pipeline(stages: [collectionStage], db: db) + } + + public func collectionGroup(_ collectionId: String) -> Pipeline { + return Pipeline( + stages: [CollectionGroupSource(collectionId: collectionId)], + db: db + ) + } + + public func database() -> Pipeline { + return Pipeline(stages: [DatabaseSource()], db: db) + } + + public func documents(_ docs: [DocumentReference]) -> Pipeline { + return Pipeline(stages: [DocumentsSource(docs: docs, db: db)], db: db) + } + + public func documents(_ paths: [String]) -> Pipeline { + let docs = paths.map { db.document($0) } + let documentsStage = DocumentsSource(docs: docs, db: db) + return Pipeline(stages: [documentsStage], db: db) + } + + public func create(from query: Query) -> Pipeline { + return Pipeline(stages: [QuerySource(query: query)], db: db) + } + + public func create(from aggregateQuery: AggregateQuery) -> Pipeline { + return Pipeline(stages: [AggregateQuerySource(aggregateQuery: aggregateQuery)], db: db) + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/RealtimePipeline.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/RealtimePipeline.swift new file mode 100644 index 00000000000..de1a709d44d --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/RealtimePipeline.swift @@ -0,0 +1,15 @@ +// Copyright 2025 Google LLC +// +// 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. + +public struct RealtimePipeline: @unchecked Sendable {} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/Selectable.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/Selectable.swift new file mode 100644 index 00000000000..a9c655f4e6a --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/Selectable.swift @@ -0,0 +1,15 @@ +// Copyright 2025 Google LLC +// +// 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. + +public protocol Selectable: Sendable {} diff --git a/Firestore/Swift/Source/SwiftAPI/Pipeline/TimeUnit.swift b/Firestore/Swift/Source/SwiftAPI/Pipeline/TimeUnit.swift new file mode 100644 index 00000000000..0b8aa112db8 --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Pipeline/TimeUnit.swift @@ -0,0 +1,37 @@ +// Copyright 2025 Google LLC +// +// 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. + +public struct TimeUnit: Sendable, Equatable, Hashable { + enum Kind: String { + case microsecond + case millisecond + case second + case minute + case hour + case day + } + + public static let microsecond = TimeUnit(kind: .microsecond) + public static let millisecond = TimeUnit(kind: .millisecond) + public static let second = TimeUnit(kind: .second) + public static let minute = TimeUnit(kind: .minute) + public static let hour = TimeUnit(kind: .hour) + public static let day = TimeUnit(kind: .day) + + public let rawValue: String + + init(kind: Kind) { + rawValue = kind.rawValue + } +} diff --git a/Firestore/Swift/Source/SwiftAPI/Stages.swift b/Firestore/Swift/Source/SwiftAPI/Stages.swift new file mode 100644 index 00000000000..9f6d071d9ff --- /dev/null +++ b/Firestore/Swift/Source/SwiftAPI/Stages.swift @@ -0,0 +1,363 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +import Foundation + +#if SWIFT_PACKAGE + @_exported import FirebaseFirestoreInternalWrapper +#else + @_exported import FirebaseFirestoreInternal +#endif // SWIFT_PACKAGE + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +protocol Stage { + var name: String { get } + var bridge: StageBridge { get } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class CollectionSource: Stage { + let name: String = "collection" + + let bridge: StageBridge + private var collection: CollectionReference + private let db: Firestore + + init(collection: CollectionReference, db: Firestore) { + self.collection = collection + self.db = db + bridge = CollectionSourceStageBridge(ref: collection, firestore: db) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class CollectionGroupSource: Stage { + let name: String = "collectionId" + + let bridge: StageBridge + private var collectionId: String + + init(collectionId: String) { + self.collectionId = collectionId + bridge = CollectionGroupSourceStageBridge(collectionId: collectionId) + } +} + +// Represents the entire database as a source. +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class DatabaseSource: Stage { + let name: String = "database" + let bridge: StageBridge + + init() { + bridge = DatabaseSourceStageBridge() + } +} + +// Represents a list of document references as a source. +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class DocumentsSource: Stage { + let name: String = "documents" + let bridge: StageBridge + private var docs: [DocumentReference] + private let db: Firestore + + // Initialize with an array of String paths + init(docs: [DocumentReference], db: Firestore) { + self.docs = docs + self.db = db + bridge = DocumentsSourceStageBridge(documents: docs, firestore: db) + } +} + +// Represents an existing Query as a source. +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class QuerySource: Stage { + let name: String = "query" + let bridge: StageBridge + private var query: Query + + init(query: Query) { + self.query = query + bridge = DatabaseSourceStageBridge() + // TODO: bridge = QuerySourceStageBridge(query: query.query) + } +} + +// Represents an existing AggregateQuery as a source. +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class AggregateQuerySource: Stage { + let name: String = "aggregateQuery" + let bridge: StageBridge + private var aggregateQuery: AggregateQuery + + init(aggregateQuery: AggregateQuery) { + self.aggregateQuery = aggregateQuery + bridge = DatabaseSourceStageBridge() + // TODO: bridge = AggregateQuerySourceStageBridge(aggregateQuery: aggregateQuery.query) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Where: Stage { + let name: String = "where" + + let bridge: StageBridge + private var condition: BooleanExpr + + init(condition: BooleanExpr) { + self.condition = condition + bridge = WhereStageBridge(expr: condition.toBridge()) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Limit: Stage { + let name: String = "limit" + + let bridge: StageBridge + private var limit: Int32 + + init(_ limit: Int32) { + self.limit = limit + bridge = LimitStageBridge(limit: NSInteger(limit)) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Offset: Stage { + let name: String = "offset" + + let bridge: StageBridge + private var offset: Int32 + + init(_ offset: Int32) { + self.offset = offset + bridge = OffsetStageBridge(offset: NSInteger(offset)) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class AddFields: Stage { + let name: String = "addFields" + let bridge: StageBridge + private var fields: [Selectable] + + init(fields: [Selectable]) { + self.fields = fields + let objc_accumulators = fields.reduce(into: [String: ExprBridge]()) { + result, + field + in + let seletable = field as! SelectableWrapper + result[seletable.alias] = seletable.expr.toBridge() + } + bridge = AddFieldsStageBridge(fields: objc_accumulators) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class RemoveFieldsStage: Stage { + let name: String = "removeFields" + let bridge: StageBridge + private var fields: [String] + + init(fields: [String]) { + self.fields = fields + bridge = RemoveFieldsStageBridge(fields: fields) + } + + init(fields: [Field]) { + self.fields = fields.map { $0.fieldName } + bridge = RemoveFieldsStageBridge(fields: self.fields) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Select: Stage { + let name: String = "select" + let bridge: StageBridge + private var selections: [Selectable] + + init(selections: [Selectable]) { + self.selections = selections + let map = Helper.selectablesToMap(selectables: selections) + bridge = SelectStageBridge(selections: map + .mapValues { Helper.sendableToExpr($0).toBridge() }) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Distinct: Stage { + let name: String = "distinct" + let bridge: StageBridge + private var groups: [Selectable] + + init(groups: [Selectable]) { + self.groups = groups + let map = Helper.selectablesToMap(selectables: groups) + bridge = DistinctStageBridge(groups: map + .mapValues { Helper.sendableToExpr($0).toBridge() }) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Aggregate: Stage { + let name: String = "aggregate" + let bridge: StageBridge + private var accumulators: [AggregateWithAlias] + private var groups: [String: Expr] = [:] + + init(accumulators: [AggregateWithAlias], groups: [Selectable]?) { + self.accumulators = accumulators + if groups != nil { + self.groups = Helper.selectablesToMap(selectables: groups!) + } + let map = accumulators + .reduce(into: [String: AggregateFunctionBridge]()) { result, accumulator in + result[accumulator.alias] = accumulator.aggregate.bridge + } + bridge = AggregateStageBridge( + accumulators: map, + groups: self.groups.mapValues { Helper.sendableToExpr($0).toBridge() } + ) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class FindNearest: Stage { + let name: String = "findNearest" + let bridge: StageBridge + private var field: Field + private var vectorValue: [Double] + private var distanceMeasure: DistanceMeasure + private var limit: Int? + private var distanceField: String? + + init(field: Field, + vectorValue: [Double], + distanceMeasure: DistanceMeasure, + limit: Int? = nil, + distanceField: String? = nil) { + self.field = field + self.vectorValue = vectorValue + self.distanceMeasure = distanceMeasure + self.limit = limit + self.distanceField = distanceField + bridge = FindNearestStageBridge( + field: field.bridge as! FieldBridge, + vectorValue: VectorValue(vectorValue), + distanceMeasure: distanceMeasure.kind.rawValue, + limit: limit as NSNumber?, + distanceField: distanceField.map { Field($0).toBridge() } ?? nil + ) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Sort: Stage { + let name: String = "sort" + let bridge: StageBridge + private var orderings: [Ordering] + + init(orderings: [Ordering]) { + self.orderings = orderings + bridge = SortStageBridge(orderings: orderings.map { $0.bridge }) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class ReplaceWith: Stage { + let name: String = "replaceWith" + let bridge: StageBridge + private var expr: Expr + + init(expr: Expr) { + self.expr = expr + bridge = ReplaceWithStageBridge(expr: expr.toBridge()) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Sample: Stage { + let name: String = "sample" + let bridge: StageBridge + private var count: Int64? + private var percentage: Double? + + init(count: Int64) { + self.count = count + percentage = nil + bridge = SampleStageBridge(count: count) + } + + init(percentage: Double) { + self.percentage = percentage + count = nil + bridge = SampleStageBridge(percentage: percentage) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Union: Stage { + let name: String = "union" + let bridge: StageBridge + private var other: Pipeline + + init(other: Pipeline) { + self.other = other + bridge = UnionStageBridge(other: other.bridge) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class Unnest: Stage { + let name: String = "unnest" + let bridge: StageBridge + private var alias: Expr + private var field: Expr + private var indexField: String? + + init(field: Selectable, indexField: String? = nil) { + let seletable = field as! SelectableWrapper + self.field = seletable.expr + alias = Field(seletable.alias) + self.indexField = indexField + + bridge = UnnestStageBridge( + field: self.field.toBridge(), + alias: alias.toBridge(), + indexField: indexField.map { Field($0).toBridge() } ?? nil + ) + } +} + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class RawStage: Stage { + let name: String + let bridge: StageBridge + private var params: [Sendable?] + private var options: [String: Sendable]? + + init(name: String, params: [Sendable?], options: [String: Sendable]? = nil) { + self.name = name + self.params = params + self.options = options + let bridgeParams = params.map { Helper.sendableToAnyObjectForRawStage($0) } + let bridgeOptions = options?.mapValues { Helper.sendableToExpr($0).toBridge() } + bridge = RawStageBridge(name: name, params: bridgeParams, options: bridgeOptions) + } +} diff --git a/Firestore/Swift/Tests/Integration/PipelineApiTests.swift b/Firestore/Swift/Tests/Integration/PipelineApiTests.swift new file mode 100644 index 00000000000..f712cceca1f --- /dev/null +++ b/Firestore/Swift/Tests/Integration/PipelineApiTests.swift @@ -0,0 +1,404 @@ +// Copyright 2025 Google LLC +// +// 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. + +import Foundation +import XCTest + +import FirebaseFirestore + +final class PipelineTests: FSTIntegrationTestCase { + override func setUp() { + FSTIntegrationTestCase.switchToEnterpriseMode() + super.setUp() + } + + func testCreatePipeline() async throws { + let pipelineSource: PipelineSource = db.pipeline() + + let pipeline: Pipeline = pipelineSource.documents( + [db.collection("foo").document("bar"), db.document("foo/baz")] + ) + let _: Pipeline = pipelineSource.collection("foo") + let _: Pipeline = pipelineSource.collectionGroup("foo") + let _: Pipeline = pipelineSource.database() + + let query: Query = db.collection("foo").limit(to: 2) + let _: Pipeline = pipelineSource.create(from: query) + + let aggregateQuery = db.collection("foo").count + let _: Pipeline = pipelineSource.create(from: aggregateQuery) + + let _: PipelineSnapshot = try await pipeline.execute() + } + + func testWhereStage() async throws { + _ = db.pipeline().collection("books") + .where( + Field("rating").gt(4.0) && Field("genre").eq("Science Fiction") || ArrayContains( + fieldName: "fieldName", + values: "rating" + ) + ) + } + + func testAddFieldStage() async throws { + // Input + // { title: 'title1', price: 10, discount: 0.8 }, + // { title: 'title2', price: 12, discount: 1.0 }, + // { title: 'title3', price: 5, discount: 0.66 } + + // An expression that will compute price from the value of msrp field and discount field + let priceExpr: FunctionExpr = Field("msrp").multiply(Field("discount")) + + // An expression becomes a Selectable when given an alias. In this case + // the alias is 'salePrice' + let priceSelectableExpr: Selectable = priceExpr.as("salePrice") + + _ = db.pipeline().collection("books") + .addFields( + priceSelectableExpr // Add field `salePrice` based computed from msrp and discount + ) + + // We don't expect customers to separate the Expression definition from the + // Pipeline definition. This was shown above so readers of this doc can see + // the different types involved. The cleaner way to write the code above + // is to inline the Expr definition + _ = db.pipeline().collection("books") + .addFields( + Field("msrp").multiply(Field("discount")).as("salePrice"), + Field("author") + ) + + // Output + // { title: 'title1', price: 10, discount: 0.8, salePrice: 8.0}, + // { title: 'title2', price: 12, discount: 1.0, salePrice: 12.0 }, + // { title: 'title3', price: 5, discount: 0.66, salePrice: 3.30 } + } + + func testRemoveFieldsStage() async throws { + // removes field 'rating' and 'cost' from the previous stage outputs. + _ = db.pipeline().collection("books").removeFields("rating", "cost") + + // removes field 'rating'. + _ = db.pipeline().collection("books").removeFields(Field("rating")) + } + + func testSelectStage() async throws { + // Input + // { title: 'title1', price: 10, discount: 0.8 }, + // { title: 'title2', price: 12, discount: 1.0 }, + // { title: 'title3', price: 5, discount: 0.66 } + + // Overload for string and Selectable + _ = db.pipeline().collection("books") + .select( + Field("title"), // Field class inheritates Selectable + Field("msrp").multiply(Field("discount")).as("salePrice") + ) + + _ = db.pipeline().collection("books").select("title", "author") + + // Output + // { title: 'title1', salePrice: 8.0}, + // { title: 'title2', salePrice: 12.0 }, + // { title: 'title3', salePrice: 3.30 } + } + + func testSortStage() async throws { + // Sort books by rating in descending order, and then by title in ascending order for books + // with the same rating + _ = db.pipeline().collection("books") + .sort( + Field("rating").descending(), + Ascending("title") // alternative API offered + ) + } + + func testLimitStage() async throws { + // Limit the results to the top 10 highest-rated books + _ = db.pipeline().collection("books") + .sort(Field("rating").descending()) + .limit(10) + } + + func testOffsetStage() async throws { + // Retrieve the second page of 20 results + _ = db.pipeline().collection("books") + .sort(Field("published").descending()) + .offset(20) // Skip the first 20 results. Note that this must come + // before .limit(...) unlike in Query where the order did not matter. + .limit(20) // Take the next 20 results + } + + func testDistinctStage() async throws { + // Input + // { author: 'authorA', genre: 'genreA', title: 'title1' }, + // { author: 'authorb', genre: 'genreB', title: 'title2' }, + // { author: 'authorB', genre: 'genreB', title: 'title3' } + + // Get a list of unique author names in uppercase and genre combinations. + _ = db.pipeline().collection("books") + .distinct( + Field("author").uppercased().as("authorName"), + Field("genre") + ) + + // Output + // { authorName: 'AUTHORA', genre: 'genreA' }, + // { authorName: 'AUTHORB', genre: 'genreB' } + } + + func testAggregateStage() async throws { + // Input + // { genre: 'genreA', title: 'title1', rating: 5.0 }, + // { genre: 'genreB', title: 'title2', rating: 1.5 }, + // { genre: 'genreB', title: 'title3', rating: 2.5 } + + // Calculate the average rating and the total number of books + _ = db.pipeline().collection("books") + .aggregate( + Field("rating").avg().as("averageRating"), + CountAll().as("totalBooks") + ) + + // Output + // { totalBooks: 3, averageRating: 3.0 } + + // Input + // { genre: 'genreA', title: 'title1', rating: 5.0 }, + // { genre: 'genreB', title: 'title2', rating: 1.5 }, + // { genre: 'genreB', title: 'title3', rating: 2.5 } + + // Calculate the average rating and the total number of books and group by field 'genre' + _ = db.pipeline().collection("books") + .aggregate([ + Field("rating").avg().as("averageRating"), + CountAll().as("totalBooks"), + ], + groups: ["genre"]) + + // Output + // { genre: 'genreA', totalBooks: 1, averageRating: 5.0 } + // { genre: 'genreB', totalBooks: 2, averageRating: 2.0 } + } + + func testFindNearestStage() async throws { + _ = db.pipeline().collection("books").findNearest( + field: Field("embedding"), + vectorValue: [5.0], + distanceMeasure: .cosine, + limit: 3) + } + + func testReplaceStage() async throws { + // Input. + // { +// "name": "John Doe Jr.", +// "parents": { +// "father": "John Doe Sr.", +// "mother": "Jane Doe" +// } + // } + + // Emit field parents as the document. + _ = db.pipeline().collection("people") + .replace(with: Field("parents")) + + // Output + // { +// "father": "John Doe Sr.", +// "mother": "Jane Doe" + // } + } + + func testSampleStage() async throws { + // Sample 25 books, if the collection contains at least 25 documents + _ = db.pipeline().collection("books").sample(count: 10) + + // Sample 10 percent of the collection of books + _ = db.pipeline().collection("books").sample(percentage: 10) + } + + func testUnionStage() async throws { + // Emit documents from books collection and magazines collection. + _ = db.pipeline().collection("books") + .union(db.pipeline().collection("magazines")) + } + + func testUnnestStage() async throws { + // Input: + // { "title": "The Hitchhiker's Guide to the Galaxy", "tags": [ "comedy", "space", "adventure" + // ], ... } + + // Emit a book document for each tag of the book. + _ = db.pipeline().collection("books") + .unnest(Field("tags").as("tag")) + + // Output: + // { "title": "The Hitchhiker's Guide to the Galaxy", "tag": "comedy", tags: [...], ... } + // { "title": "The Hitchhiker's Guide to the Galaxy", "tag": "space", tags: [...], ... } + // { "title": "The Hitchhiker's Guide to the Galaxy", "tag": "adventure", tags: [...], ... } + + // Emit a book document for each tag of the book mapped to its' index in the array. + _ = db.pipeline().collection("books") + .unnest(Field("tags").as("tag"), indexField: "index") + + // Output: + // { "title": "The Hitchhiker's Guide to the Galaxy", "tag": "comedy", index: 0, tags: [...], + // ... } + // { "title": "The Hitchhiker's Guide to the Galaxy", "tag": "space", index: 1, tags: [...], ... + // } + // { "title": "The Hitchhiker's Guide to the Galaxy", "tag": "adventure", index: 2, tags: [...], + // ... } + } + + func testRawStage() async throws { + // Assume we don't have a built-in "where" stage, the customer could still + // add this stage by calling rawStage, passing the name of the stage "where", + // and providing positional argument values. + _ = db.pipeline().collection("books") + .rawStage(name: "where", + params: [Field("published").lt(1900)]) + .select("title", "author") + + // In cases where the stage also supports named argument values, then these can be + // provided with a third argument that maps the argument name to value. + // Note that these named arguments are always optional in the stage definition. + _ = db.pipeline().collection("books") + .rawStage(name: "where", + params: [Field("published").lt(1900)], + options: ["someOptionalParamName": "the argument value for this param"]) + .select("title", "author") + } + + func testField() async throws { + // An expression that will return the value of the field `name` in the document + let nameField = Field("name") + + // An expression that will return the value of the field `description` in the document + // Field is a sub-type of Expr, so we can also declare our var of type Expr + let descriptionField: Expr = Field("description") + + // USAGE: anywhere an Expr type is accepted + // Use a field in a pipeline + _ = db.pipeline().collection("books") + .addFields( + Field("rating").as("bookRating") // Duplicate field 'rating' as 'bookRating' + ) + + // One special Field value is conveniently exposed as static function to help the user reference + // reserved field values of __name__. + _ = db.pipeline().collection("books") + .addFields( + DocumentId() + ) + } + + func testConstant() async throws { + // A constant for a number + let three = Constant(3) + + // A constant for a string + let name = Constant("Expressions API") + + // Const is a sub-type of Expr, so we can also declare our var of type Expr + let nothing: Expr = Constant.nil + + // USAGE: Anywhere an Expr type is accepted + // Add field `fromTheLibraryOf: 'Rafi'` to every document in the collection. + _ = db.pipeline().collection("books") + .addFields(Constant("Rafi").as("fromTheLibraryOf")) + } + + func testFunctionExpr() async throws { + let secondsField = Field("seconds") + + // Create a FunctionExpr using the multiply function to compute milliseconds + let milliseconds: FunctionExpr = secondsField.multiply(1000) + + // A firestore function is also a sub-type of Expr + let myExpr: Expr = milliseconds + } + + func testBooleanExpr() async throws { + let isApple: BooleanExpr = Field("type").eq("apple") + + // USAGE: stage where requires an expression of type BooleanExpr + let allAppleOptions: Pipeline = db.pipeline().collection("fruitOptions").where(isApple) + } + + func testSelectableExpr() async throws { + let secondsField = Field("seconds") + + // Create a selectable from our milliseconds expression. + let millisecondsSelectable: Selectable = secondsField.multiply(1000).as("milliseconds") + + // USAGE: stages addFields and select accept expressions of type Selectable + // Add (or overwrite) the 'milliseconds` field to each of our documents using the + // `.addFields(...)` stage. + _ = db.pipeline().collection("lapTimes") + .addFields(secondsField.multiply(1000).as("milliseconds")) + + // NOTE: Field implements Selectable, the alias is the same as the name + let secondsSelectable: Selectable = secondsField + } + + func testAggregateExpr() async throws { + let lapTimeSum: AggregateFunction = Field("seconds").sum() + + let lapTimeSumTarget: AggregateWithAlias = lapTimeSum.as("totalTrackTime") + + // USAGE: stage aggregate accepts expressions of type AggregateWithAlias + // A pipeline that will return one document with one field `totalTrackTime` that + // is the sum of all laps ever taken on the track. + _ = db.pipeline().collection("lapTimes") + .aggregate(lapTimeSum.as("totalTrackTime")) + } + + func testOrdering() async throws { + let fastestToSlowest: Ordering = Field("seconds").ascending() + + // USAGE: stage sort accepts objects of type Ordering + // Use this ordering to sort our lap times collection from fastest to slowest + _ = db.pipeline().collection("lapTimes").sort(fastestToSlowest) + } + + func testExpr() async throws { + // An expression that computes the area of a circle + // by chaining together two calls to the multiply function + let radiusField: Expr = Field("radius") + let radiusSq: Expr = radiusField.multiply(Field("radius")) + let areaExpr: Expr = radiusSq.multiply(3.14) + + // Or define this expression in one clean, fluent statement + let areaOfCircle: Selectable = Field("radius") + .multiply(Field("radius")) + .multiply(3.14) + .as("area") + + // And pass the expression to a Pipeline for evaluation + _ = db.pipeline().collection("circles").addFields(areaOfCircle) + } + + func testGeneric() async throws { + // This is the same of the logicalMin('price', 0)', if it did not exist + let myLm = FunctionExpr("logicalMin", [Field("price"), Constant(0)]) + + // Create a generic BooleanExpr for use where BooleanExpr is required + let myEq = BooleanExpr("eq", [Field("price"), Constant(10)]) + + // Create a generic AggregateFunction for use where AggregateFunction is required + let mySum = AggregateFunction("sum", [Field("price")]) + } +} diff --git a/Firestore/Swift/Tests/Integration/PipelineTests.swift b/Firestore/Swift/Tests/Integration/PipelineTests.swift new file mode 100644 index 00000000000..f05a7dcc9eb --- /dev/null +++ b/Firestore/Swift/Tests/Integration/PipelineTests.swift @@ -0,0 +1,3165 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +import FirebaseCore +import FirebaseFirestore +import Foundation +import XCTest + +private let bookDocs: [String: [String: Sendable]] = [ + "book1": [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "genre": "Science Fiction", + "published": 1979, + "rating": 4.2, + "tags": ["comedy", "space", "adventure"], + "awards": ["hugo": true, "nebula": false, "others": ["unknown": ["year": 1980]]], // Corrected + "nestedField": ["level.1": ["level.2": true]], + "embedding": VectorValue([10, 1, 1, 1, 1, 1, 1, 1, 1, 1]), + ], + "book2": [ + "title": "Pride and Prejudice", + "author": "Jane Austen", + "genre": "Romance", + "published": 1813, + "rating": 4.5, + "tags": ["classic", "social commentary", "love"], + "awards": ["none": true], + "embedding": VectorValue([1, 10, 1, 1, 1, 1, 1, 1, 1, 1]), // Added + ], + "book3": [ + "title": "One Hundred Years of Solitude", + "author": "Gabriel García Márquez", + "genre": "Magical Realism", + "published": 1967, + "rating": 4.3, + "tags": ["family", "history", "fantasy"], + "awards": ["nobel": true, "nebula": false], + "embedding": VectorValue([1, 1, 10, 1, 1, 1, 1, 1, 1, 1]), + ], + "book4": [ + "title": "The Lord of the Rings", + "author": "J.R.R. Tolkien", + "genre": "Fantasy", + "published": 1954, + "rating": 4.7, + "tags": ["adventure", "magic", "epic"], + "awards": ["hugo": false, "nebula": false], + "remarks": NSNull(), // Added + "cost": Double.nan, // Added + "embedding": VectorValue([1, 1, 1, 10, 1, 1, 1, 1, 1, 1]), // Added + ], + "book5": [ + "title": "The Handmaid's Tale", + "author": "Margaret Atwood", + "genre": "Dystopian", + "published": 1985, + "rating": 4.1, + "tags": ["feminism", "totalitarianism", "resistance"], + "awards": ["arthur c. clarke": true, "booker prize": false], + "embedding": VectorValue([1, 1, 1, 1, 10, 1, 1, 1, 1, 1]), // Added + ], + "book6": [ + "title": "Crime and Punishment", + "author": "Fyodor Dostoevsky", + "genre": "Psychological Thriller", + "published": 1866, + "rating": 4.3, + "tags": ["philosophy", "crime", "redemption"], + "awards": ["none": true], + "embedding": VectorValue([1, 1, 1, 1, 1, 10, 1, 1, 1, 1]), // Added + ], + "book7": [ + "title": "To Kill a Mockingbird", + "author": "Harper Lee", + "genre": "Southern Gothic", + "published": 1960, + "rating": 4.2, + "tags": ["racism", "injustice", "coming-of-age"], + "awards": ["pulitzer": true], + "embedding": VectorValue([1, 1, 1, 1, 1, 1, 10, 1, 1, 1]), // Added + ], + "book8": [ + "title": "1984", + "author": "George Orwell", + "genre": "Dystopian", + "published": 1949, + "rating": 4.2, + "tags": ["surveillance", "totalitarianism", "propaganda"], + "awards": ["prometheus": true], + "embedding": VectorValue([1, 1, 1, 1, 1, 1, 1, 10, 1, 1]), // Added + ], + "book9": [ + "title": "The Great Gatsby", + "author": "F. Scott Fitzgerald", + "genre": "Modernist", + "published": 1925, + "rating": 4.0, + "tags": ["wealth", "american dream", "love"], + "awards": ["none": true], + "embedding": VectorValue([1, 1, 1, 1, 1, 1, 1, 1, 10, 1]), // Added + ], + "book10": [ + "title": "Dune", + "author": "Frank Herbert", + "genre": "Science Fiction", + "published": 1965, + "rating": 4.6, + "tags": ["politics", "desert", "ecology"], + "awards": ["hugo": true, "nebula": true], + "embedding": VectorValue([1, 1, 1, 1, 1, 1, 1, 1, 1, 10]), // Added + ], +] + +@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *) +class PipelineIntegrationTests: FSTIntegrationTestCase { + override func setUp() { + FSTIntegrationTestCase.switchToEnterpriseMode() + super.setUp() + } + + func testEmptyResults() async throws { + let collRef = collectionRef( + withDocuments: bookDocs + ) + let db = collRef.firestore + + let snapshot = try await db + .pipeline() + .collection(collRef.path) + .limit(0) + .execute() + + TestHelper.compare(pipelineSnapshot: snapshot, expectedCount: 0) + } + + func testFullResults() async throws { + let collRef = collectionRef( + withDocuments: bookDocs + ) + let db = collRef.firestore + + let snapshot = try await db + .pipeline() + .collection(collRef.path) + .execute() + + TestHelper.compare(pipelineSnapshot: snapshot, expectedIDs: [ + "book1", "book10", "book2", "book3", "book4", + "book5", "book6", "book7", "book8", "book9", + ], enforceOrder: false) + } + + func testReturnsExecutionTime() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline().collection(collRef.path) + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, bookDocs.count, "Should fetch all documents") + + let executionTimeValue = snapshot.executionTime.dateValue().timeIntervalSince1970 + + XCTAssertGreaterThan(executionTimeValue, 0, "Execution time should be positive and not zero") + } + + func testReturnsExecutionTimeForEmptyQuery() async throws { + let collRef = + collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline().collection(collRef.path).limit(0) + let snapshot = try await pipeline.execute() + + TestHelper.compare(pipelineSnapshot: snapshot, expectedCount: 0) + + let executionTimeValue = snapshot.executionTime.dateValue().timeIntervalSince1970 + XCTAssertGreaterThan(executionTimeValue, 0, "Execution time should be positive and not zero") + } + + func testReturnsCreateAndUpdateTimeForEachDocument() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + let pipeline = db.pipeline().collection(collRef.path) + var snapshot = try await pipeline.execute() + + XCTAssertEqual( + snapshot.results.count, + bookDocs.count, + "Initial fetch should return all documents" + ) + for doc in snapshot.results { + XCTAssertNotNil( + doc.createTime, + "Document \(String(describing: doc.id)) should have createTime" + ) + XCTAssertNotNil( + doc.updateTime, + "Document \(String(describing: doc.id)) should have updateTime" + ) + if let createTime = doc.createTime, let updateTime = doc.updateTime { + let createTimestamp = createTime.dateValue().timeIntervalSince1970 + let updateTimestamp = updateTime.dateValue().timeIntervalSince1970 + + XCTAssertEqual(createTimestamp, + updateTimestamp, + "Initial createTime and updateTime should be equal for \(String(describing: doc.id))") + } + } + + // Update documents + let batch = db.batch() + for doc in snapshot.results { + batch + .updateData( + ["newField": "value"], + forDocument: doc.ref! + ) + } + + try await batch.commit() + + snapshot = try await pipeline.execute() + XCTAssertEqual( + snapshot.results.count, + bookDocs.count, + "Fetch after update should return all documents" + ) + + for doc in snapshot.results { + XCTAssertNotNil( + doc.createTime, + "Document \(String(describing: doc.id)) should still have createTime after update" + ) + XCTAssertNotNil( + doc.updateTime, + "Document \(String(describing: doc.id)) should still have updateTime after update" + ) + if let createTime = doc.createTime, let updateTime = doc.updateTime { + let createTimestamp = createTime.dateValue().timeIntervalSince1970 + let updateTimestamp = updateTime.dateValue().timeIntervalSince1970 + + XCTAssertLessThan(createTimestamp, + updateTimestamp, + "updateTime (\(updateTimestamp)) should be after createTime (\(createTimestamp)) for \(String(describing: doc.id))") + } + } + } + + func testReturnsExecutionTimeForAggregateQuery() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .aggregate(Field("rating").avg().as("avgRating")) + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Aggregate query should return a single result") + + let executionTimeValue = snapshot.executionTime.dateValue().timeIntervalSince1970 + XCTAssertGreaterThan(executionTimeValue, 0, "Execution time should be positive") + } + + func testTimestampsAreNilForAggregateQueryResults() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .aggregate( + [Field("rating").avg().as("avgRating")], + groups: ["genre"] + ) // Make sure 'groupBy' and 'average' are correct + let snapshot = try await pipeline.execute() + + // There are 8 unique genres in bookDocs + XCTAssertEqual(snapshot.results.count, 8, "Should return one result per genre") + + for doc in snapshot.results { + XCTAssertNil( + doc.createTime, + "createTime should be nil for aggregate result (docID: \(String(describing: doc.id)), data: \(doc.data))" + ) + XCTAssertNil( + doc.updateTime, + "updateTime should be nil for aggregate result (docID: \(String(describing: doc.id)), data: \(doc.data))" + ) + } + } + + func testSupportsCollectionReferenceAsSource() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline().collection(collRef) + let snapshot = try await pipeline.execute() + + TestHelper.compare(pipelineSnapshot: snapshot, expectedCount: bookDocs.count) + } + + func testSupportsListOfDocumentReferencesAsSource() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let docRefs: [DocumentReference] = [ + collRef.document("book1"), + collRef.document("book2"), + collRef.document("book3"), + ] + let pipeline = db.pipeline().documents(docRefs) + let snapshot = try await pipeline.execute() + + TestHelper + .compare( + pipelineSnapshot: snapshot, + expectedIDs: ["book1", "book2", "book3"], + enforceOrder: false + ) + } + + func testSupportsListOfDocumentPathsAsSource() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let docPaths: [String] = [ + collRef.document("book1").path, + collRef.document("book2").path, + collRef.document("book3").path, + ] + let pipeline = db.pipeline().documents(docPaths) + let snapshot = try await pipeline.execute() + + TestHelper + .compare( + pipelineSnapshot: snapshot, + expectedIDs: ["book1", "book2", "book3"], + enforceOrder: false + ) + } + + func testRejectsCollectionReferenceFromAnotherDB() async throws { + let db1 = firestore() + + let db2 = Firestore.firestore(app: db1.app, database: "db2") + + let collRefDb2 = db2.collection("foo") + + XCTAssertTrue(FSTNSExceptionUtil.testForException({ + _ = db1.pipeline().collection(collRefDb2) + }, reasonContains: "Invalid CollectionReference")) + } + + func testRejectsDocumentReferenceFromAnotherDB() async throws { + let db1 = firestore() + + let db2 = Firestore.firestore(app: db1.app, database: "db2") + + let docRefDb2 = db2.collection("foo").document("bar") + + XCTAssertTrue(FSTNSExceptionUtil.testForException({ + _ = db1.pipeline().documents([docRefDb2]) + }, reasonContains: "Invalid DocumentReference")) + } + + func testSupportsCollectionGroupAsSource() async throws { + let db = firestore() + + let rootCollForTest = collectionRef() + + let randomSubCollectionId = String(UUID().uuidString.prefix(8)) + + // Create parent documents first to ensure they exist before creating subcollections. + let doc1Ref = rootCollForTest.document("book1").collection(randomSubCollectionId) + .document("translation") + try await doc1Ref.setData(["order": 1]) + + let doc2Ref = rootCollForTest.document("book2").collection(randomSubCollectionId) + .document("translation") + try await doc2Ref.setData(["order": 2]) + + let pipeline = db.pipeline() + .collectionGroup(randomSubCollectionId) + .sort(Field("order").ascending()) + + let snapshot = try await pipeline.execute() + + // Assert that only the two documents from the targeted subCollectionId are fetched, in the + // correct order. + TestHelper + .compare( + pipelineSnapshot: snapshot, + expectedIDs: [doc1Ref.documentID, doc2Ref.documentID], + enforceOrder: true + ) + } + + func testSupportsDatabaseAsSource() async throws { + let db = firestore() + let testRootCol = collectionRef() // Provides a unique root path for this test + + let randomIDValue = UUID().uuidString.prefix(8) + + // Document 1 + let collADocRef = testRootCol.document("docA") // Using specific IDs for clarity in debugging + try await collADocRef.setData(["order": 1, "randomId": randomIDValue, "name": "DocInCollA"]) + + // Document 2 + let collBDocRef = testRootCol.document("docB") // Using specific IDs for clarity in debugging + try await collBDocRef.setData(["order": 2, "randomId": randomIDValue, "name": "DocInCollB"]) + + // Document 3 (control, should not be fetched by the main query due to different randomId) + let collCDocRef = testRootCol.document("docC") + try await collCDocRef.setData([ + "order": 3, + "randomId": "\(UUID().uuidString)", + "name": "DocInCollC", + ]) + + // Document 4 (control, no randomId, should not be fetched) + let collDDocRef = testRootCol.document("docD") + try await collDDocRef.setData(["order": 4, "name": "DocInCollDNoRandomId"]) + + // Document 5 (control, correct randomId but in a sub-sub-collection to test depth) + // This also helps ensure the database() query scans deeply. + let subSubCollDocRef = testRootCol.document("parentForSubSub").collection("subSubColl") + .document("docE") + try await subSubCollDocRef.setData([ + "order": 0, + "randomId": randomIDValue, + "name": "DocInSubSubColl", + ]) + + let pipeline = db.pipeline() + .database() // Source is the entire database + .where(Field("randomId").eq(randomIDValue)) + .sort(Ascending("order")) + let snapshot = try await pipeline.execute() + + // We expect 3 documents: docA, docB, and docE (from sub-sub-collection) + XCTAssertEqual( + snapshot.results.count, + 3, + "Should fetch the three documents with the correct randomId" + ) + // Order should be docE (order 0), docA (order 1), docB (order 2) + TestHelper + .compare( + pipelineSnapshot: snapshot, + expectedIDs: [subSubCollDocRef.documentID, collADocRef.documentID, collBDocRef.documentID], + enforceOrder: true + ) + } + + func testAcceptsAndReturnsAllSupportedDataTypes() async throws { + let db = firestore() + let randomCol = collectionRef() // Ensure a unique collection for the test + + // Add a dummy document to the collection. + // A pipeline query with .select against an empty collection might not behave as expected. + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let refDate = Date(timeIntervalSince1970: 1_678_886_400) + let refTimestamp = Timestamp(date: refDate) + + let constantsFirst: [Selectable] = [ + Constant(1).as("number"), + Constant("a string").as("string"), + Constant(true).as("boolean"), + Constant.nil.as("nil"), + Constant(GeoPoint(latitude: 0.1, longitude: 0.2)).as("geoPoint"), + Constant(refTimestamp).as("timestamp"), + Constant(refDate).as("date"), // Firestore will convert this to a Timestamp + Constant(Data([1, 2, 3, 4, 5, 6, 7, 0])).as("bytes"), + Constant(db.document("foo/bar")).as("documentReference"), + Constant(VectorValue([1, 2, 3])).as("vectorValue"), + ] + + let constantsSecond: [Selectable] = [ + MapExpression([ + "number": 1, + "string": "a string", + "boolean": true, + "nil": Constant.nil, + "geoPoint": GeoPoint(latitude: 0.1, longitude: 0.2), + "timestamp": refTimestamp, + "date": refDate, + "bytesArray": Data([1, 2, 3, 4, 5, 6, 7, 0]), + "documentReference": Constant(db.document("foo/bar")), + "vectorValue": VectorValue([1, 2, 3]), + "map": [ + "number": 2, + "string": "b string", + ], + "array": [1, "c string"], + ]).as("map"), + ArrayExpression([ + 1000, + "another string", + false, + Constant.nil, + GeoPoint(latitude: 10.1, longitude: 20.2), + Timestamp(date: Date(timeIntervalSince1970: 1_700_000_000)), // Different timestamp + Date(timeIntervalSince1970: 1_700_000_000), // Different date + Data([11, 22, 33]), + db.document("another/doc"), + VectorValue([7, 8, 9]), + [ + "nestedInArrayMapKey": "value", + "anotherNestedKey": refTimestamp, + ], + [2000, "deep nested array string"], + ]).as("array"), + ] + + let expectedResultsMap: [String: Sendable?] = [ + "number": 1, + "string": "a string", + "boolean": true, + "nil": nil, + "geoPoint": GeoPoint(latitude: 0.1, longitude: 0.2), + "timestamp": refTimestamp, + "date": refTimestamp, // Dates are converted to Timestamps + "bytes": Data([1, 2, 3, 4, 5, 6, 7, 0]), + "documentReference": db.document("foo/bar"), + "vectorValue": VectorValue([1, 2, 3]), + "map": [ + "number": 1, + "string": "a string", + "boolean": true, + "nil": nil, + "geoPoint": GeoPoint(latitude: 0.1, longitude: 0.2), + "timestamp": refTimestamp, + "date": refTimestamp, + "bytesArray": Data([1, 2, 3, 4, 5, 6, 7, 0]), + "documentReference": db.document("foo/bar"), + "vectorValue": VectorValue([1, 2, 3]), + "map": [ + "number": 2, + "string": "b string", + ], + "array": [1, "c string"], + ], + "array": [ + 1000, + "another string", + false, + nil, + GeoPoint(latitude: 10.1, longitude: 20.2), + Timestamp(date: Date(timeIntervalSince1970: 1_700_000_000)), + Timestamp(date: Date(timeIntervalSince1970: 1_700_000_000)), // Dates are converted + Data([11, 22, 33]), + db.document("another/doc"), + VectorValue([7, 8, 9]), + [ + "nestedInArrayMapKey": "value", + "anotherNestedKey": refTimestamp, + ], + [2000, "deep nested array string"], + ], + ] + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select( + constantsFirst + constantsSecond + ) + let snapshot = try await pipeline.execute() + + TestHelper.compare(pipelineResult: snapshot.results.first!, expected: expectedResultsMap) + } + + func testAcceptsAndReturnsNil() async throws { + let db = firestore() + let randomCol = collectionRef() // Ensure a unique collection for the test + + // Add a dummy document to the collection. + // A pipeline query with .select against an empty collection might not behave as expected. + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let constantsFirst: [Selectable] = [ + Constant.nil.as("nil"), + ] + + let expectedResultsMap: [String: Sendable?] = [ + "nil": nil, + ] + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select( + constantsFirst + ) + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1) + TestHelper.compare(pipelineResult: snapshot.results.first!, expected: expectedResultsMap) + } + + func testConvertsArraysAndPlainObjectsToFunctionValues() async throws { + let collRef = collectionRef(withDocuments: bookDocs) // Uses existing bookDocs + let db = collRef.firestore + + // Expected data for "The Lord of the Rings" + let expectedTitle = "The Lord of the Rings" + let expectedAuthor = "J.R.R. Tolkien" + let expectedGenre = "Fantasy" + let expectedPublished = 1954 + let expectedRating = 4.7 + let expectedTags = ["adventure", "magic", "epic"] + let expectedAwards: [String: Sendable] = ["hugo": false, "nebula": false] + + let metadataArrayElements: [Sendable] = [ + 1, + 2, + expectedGenre, + expectedRating * 10, + [expectedTitle], + ["published": expectedPublished], + ] + + let metadataMapElements: [String: Sendable] = [ + "genre": expectedGenre, + "rating": expectedRating * 10, + "nestedArray": [expectedTitle], + "nestedMap": ["published": expectedPublished], + ] + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) // This should pick "The Lord of the Rings" (rating 4.7) + .select( + Field("title"), + Field("author"), + Field("genre"), + Field("rating"), + Field("published"), + Field("tags"), + Field("awards") + ) + .addFields( + ArrayExpression([ + 1, + 2, + Field("genre"), + Field("rating").multiply(10), + ArrayExpression([Field("title")]), + MapExpression(["published": Field("published")]), + ]).as("metadataArray"), + MapExpression([ + "genre": Field("genre"), + "rating": Field("rating").multiply(10), + "nestedArray": ArrayExpression([Field("title")]), + "nestedMap": MapExpression(["published": Field("published")]), + ]).as("metadata") + ) + .where( + Field("metadataArray").eq(metadataArrayElements) && + Field("metadata").eq(metadataMapElements) + ) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + if let resultDoc = snapshot.results.first { + let expectedFullDoc: [String: Sendable?] = [ + "title": expectedTitle, + "author": expectedAuthor, + "genre": expectedGenre, + "published": expectedPublished, + "rating": expectedRating, + "tags": expectedTags, + "awards": expectedAwards, + "metadataArray": metadataArrayElements, + "metadata": metadataMapElements, + ] + + TestHelper.compare(pipelineResult: resultDoc, expected: expectedFullDoc) + } else { + XCTFail("No document retrieved") + } + } + + func testSupportsAggregate() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + var pipeline = db.pipeline() + .collection(collRef.path) + .aggregate(CountAll().as("count")) + var snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Count all should return a single aggregate document") + if let result = snapshot.results.first { + TestHelper.compare(pipelineResult: result, expected: ["count": bookDocs.count]) + } else { + XCTFail("No result for count all aggregation") + } + + pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("genre").eq("Science Fiction")) + .aggregate( + CountAll().as("count"), + Field("rating").avg().as("avgRating"), + Field("rating").maximum().as("maxRating") + ) + snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Filtered aggregate should return a single document") + if let result = snapshot.results.first { + let expectedAggValues: [String: Sendable] = [ + "count": 2, + "avgRating": 4.4, + "maxRating": 4.6, + ] + TestHelper.compare(pipelineResult: result, expected: expectedAggValues) + } else { + XCTFail("No result for filtered aggregation") + } + } + + func testRejectsGroupsWithoutAccumulators() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let dummyDocRef = collRef.document("dummyDocForRejectTest") + try await dummyDocRef.setData(["field": "value"]) + + do { + _ = try await db.pipeline() + .collection(collRef.path) + .where(Field("published").lt(1900)) + .aggregate([], groups: ["genre"]) + .execute() + + XCTFail( + "The pipeline should have thrown an error for groups without accumulators, but it did not." + ) + + } catch { + XCTAssert(true, "Successfully caught expected error for groups without accumulators.") + } + } + + func testReturnsGroupAndAccumulateResults() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("published").lt(1984)) + .aggregate( + [Field("rating").avg().as("avgRating")], + groups: ["genre"] + ) + .where(Field("avgRating").gt(4.3)) + .sort(Field("avgRating").descending()) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual( + snapshot.results.count, + 3, + "Should return 3 documents after grouping and filtering." + ) + + let expectedResultsArray: [[String: Sendable]] = [ + ["avgRating": 4.7, "genre": "Fantasy"], + ["avgRating": 4.5, "genre": "Romance"], + ["avgRating": 4.4, "genre": "Science Fiction"], + ] + + TestHelper + .compare(pipelineSnapshot: snapshot, expected: expectedResultsArray, enforceOrder: true) + } + + func testReturnsMinMaxCountAndCountAllAccumulations() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .aggregate( + Field("cost").count().as("booksWithCost"), + CountAll().as("count"), + Field("rating").maximum().as("maxRating"), + Field("published").minimum().as("minPublished") + ) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Aggregate should return a single document") + + let expectedValues: [String: Sendable] = [ + "booksWithCost": 1, + "count": bookDocs.count, + "maxRating": 4.7, + "minPublished": 1813, + ] + + if let result = snapshot.results.first { + TestHelper.compare(pipelineResult: result, expected: expectedValues) + } else { + XCTFail("No result for min/max/count/countAll aggregation") + } + } + + func testReturnsCountIfAccumulation() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let expectedCount = 3 + let expectedResults: [String: Sendable] = ["count": expectedCount] + let condition = Field("rating").gt(4.3) + + var pipeline = db.pipeline() + .collection(collRef.path) + .aggregate(condition.countIf().as("count")) + var snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "countIf aggregate should return a single document") + if let result = snapshot.results.first { + TestHelper.compare(pipelineResult: result, expected: expectedResults) + } else { + XCTFail("No result for countIf aggregation") + } + } + + func testDistinctStage() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .distinct(Field("genre"), Field("author")) + .sort(Field("genre").ascending(), Field("author").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["genre": "Dystopian", "author": "George Orwell"], + ["genre": "Dystopian", "author": "Margaret Atwood"], + ["genre": "Fantasy", "author": "J.R.R. Tolkien"], + ["genre": "Magical Realism", "author": "Gabriel García Márquez"], + ["genre": "Modernist", "author": "F. Scott Fitzgerald"], + ["genre": "Psychological Thriller", "author": "Fyodor Dostoevsky"], + ["genre": "Romance", "author": "Jane Austen"], + ["genre": "Science Fiction", "author": "Douglas Adams"], + ["genre": "Science Fiction", "author": "Frank Herbert"], + ["genre": "Southern Gothic", "author": "Harper Lee"], + ] + + XCTAssertEqual(snapshot.results.count, expectedResults.count, "Snapshot results count mismatch") + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testSelectStage() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select(Field("title"), Field("author")) + .sort(Field("author").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy", "author": "Douglas Adams"], + ["title": "The Great Gatsby", "author": "F. Scott Fitzgerald"], + ["title": "Dune", "author": "Frank Herbert"], + ["title": "Crime and Punishment", "author": "Fyodor Dostoevsky"], + ["title": "One Hundred Years of Solitude", "author": "Gabriel García Márquez"], + ["title": "1984", "author": "George Orwell"], + ["title": "To Kill a Mockingbird", "author": "Harper Lee"], + ["title": "The Lord of the Rings", "author": "J.R.R. Tolkien"], + ["title": "Pride and Prejudice", "author": "Jane Austen"], + ["title": "The Handmaid's Tale", "author": "Margaret Atwood"], + ] + + XCTAssertEqual( + snapshot.results.count, + expectedResults.count, + "Snapshot results count mismatch for select stage." + ) + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testAddFieldStage() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select(Field("title"), Field("author")) + .addFields(Constant("bar").as("foo")) + .sort(Field("author").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy", "author": "Douglas Adams", "foo": "bar"], + ["title": "The Great Gatsby", "author": "F. Scott Fitzgerald", "foo": "bar"], + ["title": "Dune", "author": "Frank Herbert", "foo": "bar"], + ["title": "Crime and Punishment", "author": "Fyodor Dostoevsky", "foo": "bar"], + ["title": "One Hundred Years of Solitude", "author": "Gabriel García Márquez", "foo": "bar"], + ["title": "1984", "author": "George Orwell", "foo": "bar"], + ["title": "To Kill a Mockingbird", "author": "Harper Lee", "foo": "bar"], + ["title": "The Lord of the Rings", "author": "J.R.R. Tolkien", "foo": "bar"], + ["title": "Pride and Prejudice", "author": "Jane Austen", "foo": "bar"], + ["title": "The Handmaid's Tale", "author": "Margaret Atwood", "foo": "bar"], + ] + + XCTAssertEqual( + snapshot.results.count, + expectedResults.count, + "Snapshot results count mismatch for addField stage." + ) + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testRemoveFieldsStage() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select(Field("title"), Field("author")) + .sort(Field("author").ascending()) // Sort before removing the 'author' field + .removeFields(Field("author")) + + let snapshot = try await pipeline.execute() + + // Expected results are sorted by author, but only contain the title + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy"], // Douglas Adams + ["title": "The Great Gatsby"], // F. Scott Fitzgerald + ["title": "Dune"], // Frank Herbert + ["title": "Crime and Punishment"], // Fyodor Dostoevsky + ["title": "One Hundred Years of Solitude"], // Gabriel García Márquez + ["title": "1984"], // George Orwell + ["title": "To Kill a Mockingbird"], // Harper Lee + ["title": "The Lord of the Rings"], // J.R.R. Tolkien + ["title": "Pride and Prejudice"], // Jane Austen + ["title": "The Handmaid's Tale"], // Margaret Atwood + ] + + XCTAssertEqual( + snapshot.results.count, + expectedResults.count, + "Snapshot results count mismatch for removeFields stage." + ) + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testWhereStageWithAndConditions() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + // Test Case 1: Two AND conditions + var pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("rating").gt(4.5) + && Field("genre").eqAny(["Science Fiction", "Romance", "Fantasy"])) + var snapshot = try await pipeline.execute() + var expectedIDs = ["book10", "book4"] // Dune (SF, 4.6), LOTR (Fantasy, 4.7) + TestHelper.compare(pipelineSnapshot: snapshot, expectedIDs: expectedIDs, enforceOrder: false) + + // Test Case 2: Three AND conditions + pipeline = db.pipeline() + .collection(collRef.path) + .where( + Field("rating").gt(4.5) + && Field("genre").eqAny(["Science Fiction", "Romance", "Fantasy"]) + && Field("published").lt(1965) + ) + snapshot = try await pipeline.execute() + expectedIDs = ["book4"] // LOTR (Fantasy, 4.7, published 1954) + TestHelper.compare(pipelineSnapshot: snapshot, expectedIDs: expectedIDs, enforceOrder: false) + } + + func testWhereStageWithOrAndXorConditions() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + // Test Case 1: OR conditions + var pipeline = db.pipeline() + .collection(collRef.path) + .where( + Field("genre").eq("Romance") + || Field("genre").eq("Dystopian") + || Field("genre").eq("Fantasy") + ) + .select(Field("title")) + .sort(Field("title").ascending()) + + var snapshot = try await pipeline.execute() + var expectedResults: [[String: Sendable]] = [ + ["title": "1984"], // Dystopian + ["title": "Pride and Prejudice"], // Romance + ["title": "The Handmaid's Tale"], // Dystopian + ["title": "The Lord of the Rings"], // Fantasy + ] + + XCTAssertEqual( + snapshot.results.count, + expectedResults.count, + "Snapshot results count mismatch for OR conditions." + ) + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + + // Test Case 2: XOR conditions + // XOR is true if an odd number of its arguments are true. + pipeline = db.pipeline() + .collection(collRef.path) + .where( + Field("genre").eq("Romance") // Book2 (T), Book5 (F), Book4 (F), Book8 (F) + ^ Field("genre").eq("Dystopian") // Book2 (F), Book5 (T), Book4 (F), Book8 (T) + ^ Field("genre").eq("Fantasy") // Book2 (F), Book5 (F), Book4 (T), Book8 (F) + ^ Field("published").eq(1949) // Book2 (F), Book5 (F), Book4 (F), Book8 (T) + ) + .select(Field("title")) + .sort(Field("title").ascending()) + + snapshot = try await pipeline.execute() + + expectedResults = [ + ["title": "Pride and Prejudice"], + ["title": "The Handmaid's Tale"], + ["title": "The Lord of the Rings"], + ] + + XCTAssertEqual( + snapshot.results.count, + expectedResults.count, + "Snapshot results count mismatch for XOR conditions." + ) + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testSortOffsetAndLimitStages() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("author").ascending()) + .offset(5) + .limit(3) + .select("title", "author") + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "1984", "author": "George Orwell"], + ["title": "To Kill a Mockingbird", "author": "Harper Lee"], + ["title": "The Lord of the Rings", "author": "J.R.R. Tolkien"], + ] + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + // MARK: - Generic Stage Tests + + func testRawStageSelectFields() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let expectedSelectedData: [String: Sendable] = [ + "title": "1984", + "metadata": ["author": "George Orwell"], + ] + + let selectParameters: [Sendable] = + [ + [ + "title": Field("title"), + "metadata": ["author": Field("author")], + ], + ] + + let pipeline = db.pipeline() + .collection(collRef.path) + .rawStage(name: "select", params: selectParameters) + .sort(Field("title").ascending()) + .limit(1) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [expectedSelectedData], + enforceOrder: true + ) + } + + func testCanAddFields() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("author").ascending()) + .limit(1) + .select("title", "author") + .rawStage( + name: "add_fields", + params: [ + [ + "display": Field("title").strConcat( + Constant(" - "), + Field("author") + ), + ], + ] + ) + + let snapshot = try await pipeline.execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "display": "The Hitchhiker's Guide to the Galaxy - Douglas Adams", + ], + ], + enforceOrder: false + ) + } + + func testCanPerformDistinctQuery() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select("title", "author", "rating") + .rawStage( + name: "distinct", + params: [ + ["rating": Field("rating")], + ] + ) + .sort(Field("rating").descending()) + + let snapshot = try await pipeline.execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + ["rating": 4.7], + ["rating": 4.6], + ["rating": 4.5], + ["rating": 4.3], + ["rating": 4.2], + ["rating": 4.1], + ["rating": 4.0], + ], + enforceOrder: true + ) + } + + func testCanPerformAggregateQuery() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let emptySendableDictionary: [String: Sendable?] = [:] + + let pipeline = db.pipeline() + .collection(collRef.path) + .select("title", "author", "rating") + .rawStage( + name: "aggregate", + params: [ + [ + "averageRating": Field("rating").avg(), + ], + emptySendableDictionary, + ] + ) + + let snapshot = try await pipeline.execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + [ + "averageRating": 4.3100000000000005, + ], + ], + enforceOrder: true + ) + } + + func testCanFilterWithWhere() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select("title", "author") + .rawStage( + name: "where", + params: [Field("author").eq("Douglas Adams")] + ) + + let snapshot = try await pipeline.execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + ], + ], + enforceOrder: false + ) + } + + func testCanLimitOffsetAndSort() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select("title", "author") + .rawStage( + name: "sort", + params: [ + [ + "direction": "ascending", + "expression": Field("author"), + ], + ] + ) + .rawStage(name: "offset", params: [3]) + .rawStage(name: "limit", params: [1]) + + let snapshot = try await pipeline.execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + [ + "author": "Fyodor Dostoevsky", + "title": "Crime and Punishment", + ], + ], + enforceOrder: false + ) + } + + // MARK: - Replace Stage Test + + func testReplaceStagePromoteAwardsAndAddFlag() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("The Hitchhiker's Guide to the Galaxy")) + .replace(with: "awards") + + let snapshot = try await pipeline.execute() + + TestHelper.compare(pipelineSnapshot: snapshot, expectedCount: 1) + + let expectedBook1Transformed: [String: Sendable?] = [ + "hugo": true, + "nebula": false, + "others": ["unknown": ["year": 1980]], + ] + + TestHelper + .compare( + pipelineSnapshot: snapshot, + expected: [expectedBook1Transformed], + enforceOrder: false + ) + } + + func testReplaceWithExprResult() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("The Hitchhiker's Guide to the Galaxy")) + .replace(with: + MapExpression([ + "foo": "bar", + "baz": MapExpression([ + "title": Field("title"), + ]), + ])) + + let snapshot = try await pipeline.execute() + + let expectedResults: [String: Sendable?] = [ + "foo": "bar", + "baz": ["title": "The Hitchhiker's Guide to the Galaxy"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: [expectedResults], enforceOrder: false) + } + + // MARK: - Sample Stage Tests + + func testSampleStageLimit3() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sample(count: 3) + + let snapshot = try await pipeline.execute() + + TestHelper + .compare(pipelineSnapshot: snapshot, expectedCount: 3) + } + + func testSampleStageLimitPercentage60Average() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + var avgSize = 0.0 + let numIterations = 20 + for _ in 0 ..< numIterations { + let snapshot = try await db + .pipeline() + .collection(collRef.path) + .sample(percentage: 0.6) + .execute() + avgSize += Double(snapshot.results.count) + } + avgSize /= Double(numIterations) + XCTAssertEqual(avgSize, 6.0, accuracy: 1.0, "Average size should be close to 6") + } + + // MARK: - Union Stage Test + + func testUnionStageCombineAuthors() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .union(db.pipeline() + .collection(collRef.path)) + .sort(Field(FieldPath.documentID()).ascending()) + + let snapshot = try await pipeline.execute() + + let books = [ + "book1", + "book1", + "book10", + "book10", + "book2", + "book2", + "book3", + "book3", + "book4", + "book4", + "book5", + "book5", + "book6", + "book6", + "book7", + "book7", + "book8", + "book8", + "book9", + "book9", + ] + TestHelper.compare(pipelineSnapshot: snapshot, expectedIDs: books, enforceOrder: false) + } + + func testUnnestStage() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("The Hitchhiker's Guide to the Galaxy")) + .unnest(Field("tags").as("tag"), indexField: "tagsIndex") + .select( + "title", + "author", + "genre", + "published", + "rating", + "tags", + "tag", + "awards", + "nestedField" + ) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable?]] = [ + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "genre": "Science Fiction", + "published": 1979, + "rating": 4.2, + "tags": ["comedy", "space", "adventure"], + "tag": "comedy", + "awards": ["hugo": true, "nebula": false, "others": ["unknown": ["year": 1980]]], + "nestedField": ["level.1": ["level.2": true]], + ], + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "genre": "Science Fiction", + "published": 1979, + "rating": 4.2, + "tags": ["comedy", "space", "adventure"], + "tag": "space", + "awards": ["hugo": true, "nebula": false, "others": ["unknown": ["year": 1980]]], + "nestedField": ["level.1": ["level.2": true]], + ], + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "genre": "Science Fiction", + "published": 1979, + "rating": 4.2, + "tags": ["comedy", "space", "adventure"], + "tag": "adventure", + "awards": ["hugo": true, "nebula": false, "others": ["unknown": ["year": 1980]]], + "nestedField": ["level.1": ["level.2": true]], + ], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: false) + } + + func testUnnestExpr() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("The Hitchhiker's Guide to the Galaxy")) + .unnest(ArrayExpression([1, 2, 3]).as("copy")) + .select( + "title", + "author", + "genre", + "published", + "rating", + "tags", + "copy", + "awards", + "nestedField" + ) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable?]] = [ + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "genre": "Science Fiction", + "published": 1979, + "rating": 4.2, + "tags": ["comedy", "space", "adventure"], + "copy": 1, + "awards": ["hugo": true, "nebula": false, "others": ["unknown": ["year": 1980]]], + "nestedField": ["level.1": ["level.2": true]], + ], + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "genre": "Science Fiction", + "published": 1979, + "rating": 4.2, + "tags": ["comedy", "space", "adventure"], + "copy": 2, + "awards": ["hugo": true, "nebula": false, "others": ["unknown": ["year": 1980]]], + "nestedField": ["level.1": ["level.2": true]], + ], + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "author": "Douglas Adams", + "genre": "Science Fiction", + "published": 1979, + "rating": 4.2, + "tags": ["comedy", "space", "adventure"], + "copy": 3, + "awards": ["hugo": true, "nebula": false, "others": ["unknown": ["year": 1980]]], + "nestedField": ["level.1": ["level.2": true]], + ], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: false) + } + + func testFindNearest() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let measures: [DistanceMeasure] = [.euclidean, .dotProduct, .cosine] + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy"], + ["title": "One Hundred Years of Solitude"], + ["title": "The Handmaid's Tale"], + ] + + for measure in measures { + let pipeline = db.pipeline() + .collection(collRef.path) + .findNearest( + field: Field("embedding"), + vectorValue: [10, 1, 3, 1, 2, 1, 1, 1, 1, 1], + distanceMeasure: measure, limit: 3 + ) + .select("title") + let snapshot = try await pipeline.execute() + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + } + + func testFindNearestWithDistance() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let expectedResults: [[String: Sendable]] = [ + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "computedDistance": 1.0, + ], + [ + "title": "One Hundred Years of Solitude", + "computedDistance": 12.041594578792296, + ], + ] + + let pipeline = db.pipeline() + .collection(collRef.path) + .findNearest( + field: Field("embedding"), + vectorValue: [10, 1, 2, 1, 1, 1, 1, 1, 1, 1], + distanceMeasure: .euclidean, limit: 2, + distanceField: "computedDistance" + ) + .select("title", "computedDistance") + let snapshot = try await pipeline.execute() + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: false) + } + + func testLogicalMaxWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select( + Field("title"), + Field("published").logicalMaximum(Constant(1960), 1961).as("published-safe") + ) + .sort(Field("title").ascending()) + .limit(3) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "1984", "published-safe": 1961], + ["title": "Crime and Punishment", "published-safe": 1961], + ["title": "Dune", "published-safe": 1965], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testLogicalMinWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select( + Field("title"), + Field("published").logicalMinimum(Constant(1960), 1961).as("published-safe") + ) + .sort(Field("title").ascending()) + .limit(3) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "1984", "published-safe": 1949], + ["title": "Crime and Punishment", "published-safe": 1866], + ["title": "Dune", "published-safe": 1960], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testCondWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select( + Field("title"), + Field("published").lt(1960).then(Constant(1960), else: Field("published")) + .as("published-safe") + ) + .sort(Field("title").ascending()) + .limit(3) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "1984", "published-safe": 1960], + ["title": "Crime and Punishment", "published-safe": 1960], + ["title": "Dune", "published-safe": 1965], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testEqAnyWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("published").eqAny([1979, 1999, 1967])) + .sort(Field("title").descending()) + .select("title") + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy"], + ["title": "One Hundred Years of Solitude"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testNotEqAnyWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("published").notEqAny([1965, 1925, 1949, 1960, 1866, 1985, 1954, 1967, 1979])) + .select("title") + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "Pride and Prejudice"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: false) + } + + func testArrayContainsWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("tags").arrayContains("comedy")) + .select("title") + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: false) + } + + func testArrayContainsAnyWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("tags").arrayContainsAny(["comedy", "classic"])) + .sort(Field("title").descending()) + .select("title") + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy"], + ["title": "Pride and Prejudice"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testArrayContainsAllWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("tags").arrayContainsAll(["adventure", "magic"])) + .select("title") + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Lord of the Rings"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: false) + } + + func testArrayLengthWorks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select(Field("tags").arrayLength().as("tagsCount")) + .where(Field("tagsCount").eq(3)) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 10) + } + + func testStrConcat() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("author").ascending()) + .select(Field("author").strConcat(Constant(" - "), Field("title")).as("bookInfo")) + .limit(1) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["bookInfo": "Douglas Adams - The Hitchhiker's Guide to the Galaxy"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testStartsWith() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").startsWith("The")) + .select("title") + .sort(Field("title").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Great Gatsby"], + ["title": "The Handmaid's Tale"], + ["title": "The Hitchhiker's Guide to the Galaxy"], + ["title": "The Lord of the Rings"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testEndsWith() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").endsWith("y")) + .select("title") + .sort(Field("title").descending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy"], + ["title": "The Great Gatsby"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testStrContains() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").strContains("'s")) + .select("title") + .sort(Field("title").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Handmaid's Tale"], + ["title": "The Hitchhiker's Guide to the Galaxy"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testCharLength() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .select( + Field("title").charLength().as("titleLength"), + Field("title") + ) + .where(Field("titleLength").gt(20)) + .sort(Field("title").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["titleLength": 29, "title": "One Hundred Years of Solitude"], + ["titleLength": 36, "title": "The Hitchhiker's Guide to the Galaxy"], + ["titleLength": 21, "title": "The Lord of the Rings"], + ["titleLength": 21, "title": "To Kill a Mockingbird"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testLike() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").like("%Guide%")) + .select("title") + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: false) + } + + func testRegexContains() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").regexContains("(?i)(the|of)")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 5) + } + + func testRegexMatches() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").regexMatch(".*(?i)(the|of).*")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 5) + } + + func testArithmeticOperations() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("To Kill a Mockingbird")) + .select( + Field("rating").add(1).as("ratingPlusOne"), + Field("published").subtract(1900).as("yearsSince1900"), + Field("rating").multiply(10).as("ratingTimesTen"), + Field("rating").divide(2).as("ratingDividedByTwo"), + Field("rating").multiply(20).as("ratingTimes20"), + Field("rating").add(3).as("ratingPlus3"), + Field("rating").mod(2).as("ratingMod2") + ) + .limit(1) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + if let resultDoc = snapshot.results.first { + let expectedResults: [String: Sendable?] = [ + "ratingPlusOne": 5.2, + "yearsSince1900": 60, + "ratingTimesTen": 42.0, + "ratingDividedByTwo": 2.1, + "ratingTimes20": 84.0, + "ratingPlus3": 7.2, + "ratingMod2": 0.20000000000000018, + ] + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for arithmetic operations test") + } + } + + func testComparisonOperators() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where( + Field("rating").gt(4.2) && + Field("rating").lte(4.5) && + Field("genre").neq("Science Fiction") + ) + .select("rating", "title") + .sort(Field("title").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["rating": 4.3, "title": "Crime and Punishment"], + ["rating": 4.3, "title": "One Hundred Years of Solitude"], + ["rating": 4.5, "title": "Pride and Prejudice"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testLogicalOperators() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where( + (Field("rating").gt(4.5) && Field("genre").eq("Science Fiction")) || + Field("published").lt(1900) + ) + .select("title") + .sort(Field("title").ascending()) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable]] = [ + ["title": "Crime and Punishment"], + ["title": "Dune"], + ["title": "Pride and Prejudice"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testChecks() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + // Part 1 + var pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select( + Field("rating").isNull().as("ratingIsNull"), + Field("rating").isNan().as("ratingIsNaN"), + Field("title").arrayGet(0).isError().as("isError"), + Field("title").arrayGet(0).ifError(Constant("was error")).as("ifError"), + Field("foo").isAbsent().as("isAbsent"), + Field("title").isNotNull().as("titleIsNotNull"), + Field("cost").isNotNan().as("costIsNotNan"), + Field("fooBarBaz").exists().as("fooBarBazExists"), + Field("title").exists().as("titleExists") + ) + + var snapshot = try await pipeline.execute() + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document for checks part 1") + + if let resultDoc = snapshot.results.first { + let expectedResults: [String: Sendable?] = [ + "ratingIsNull": false, + "ratingIsNaN": false, + "isError": true, + "ifError": "was error", + "isAbsent": true, + "titleIsNotNull": true, + "costIsNotNan": false, + "fooBarBazExists": false, + "titleExists": true, + ] + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for checks part 1") + } + + // Part 2 + pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select( + Field("rating").isNull().as("ratingIsNull"), + Field("rating").isNan().as("ratingIsNaN"), + Field("title").arrayGet(0).isError().as("isError"), + Field("title").arrayGet(0).ifError(Constant("was error")).as("ifError"), + Field("foo").isAbsent().as("isAbsent"), + Field("title").isNotNull().as("titleIsNotNull"), + Field("cost").isNotNan().as("costIsNotNan") + ) + + snapshot = try await pipeline.execute() + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document for checks part 2") + + if let resultDoc = snapshot.results.first { + let expectedResults: [String: Sendable?] = [ + "ratingIsNull": false, + "ratingIsNaN": false, + "isError": true, + "ifError": "was error", + "isAbsent": true, + "titleIsNotNull": true, + "costIsNotNan": false, + ] + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for checks part 2") + } + } + + func testMapGet() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("published").descending()) + .select( + Field("awards").mapGet("hugo").as("hugoAward"), + Field("awards").mapGet("others").as("others"), + Field("title") + ) + .where(Field("hugoAward").eq(true)) + + let snapshot = try await pipeline.execute() + + // Expected results are ordered by "published" descending for those with hugoAward == true + // 1. The Hitchhiker's Guide to the Galaxy (1979) + // 2. Dune (1965) + let expectedResults: [[String: Sendable?]] = [ + [ + "hugoAward": true, + "title": "The Hitchhiker's Guide to the Galaxy", + "others": ["unknown": ["year": 1980]], + ], + [ + "hugoAward": true, + "title": "Dune", + "others": nil, + ], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testDistanceFunctions() async throws { + let db = firestore() + let randomCol = collectionRef() // Ensure a unique collection for the test + // Add a dummy document to the collection for the select stage to operate on. + try await randomCol.document("dummyDocForDistanceTest").setData(["field": "value"]) + + let sourceVector: [Double] = [0.1, 0.1] + let targetVector: [Double] = [0.5, 0.8] + let targetVectorValue = VectorValue(targetVector) + + let expectedCosineDistance = 0.02560880430538015 + let expectedDotProductDistance = 0.13 + let expectedEuclideanDistance = 0.806225774829855 + let accuracy = 0.000000000000001 // Define a suitable accuracy for floating-point comparisons + + let pipeline = db.pipeline() + .collection(randomCol.path) + .select( + Constant(VectorValue(sourceVector)).cosineDistance(targetVectorValue).as("cosineDistance"), + Constant(VectorValue(sourceVector)).dotProduct(targetVectorValue).as("dotProductDistance"), + Constant(VectorValue(sourceVector)).euclideanDistance(targetVectorValue) + .as("euclideanDistance") + ) + .limit(1) + + let snapshot = try await pipeline.execute() + XCTAssertEqual( + snapshot.results.count, + 1, + "Should retrieve one document for distance functions part 1" + ) + + if let resultDoc = snapshot.results.first { + XCTAssertEqual( + resultDoc.get("cosineDistance")! as! Double, + expectedCosineDistance, + accuracy: accuracy + ) + XCTAssertEqual( + resultDoc.get("dotProductDistance")! as! Double, + expectedDotProductDistance, + accuracy: accuracy + ) + XCTAssertEqual( + resultDoc.get("euclideanDistance")! as! Double, + expectedEuclideanDistance, + accuracy: accuracy + ) + } else { + XCTFail("No document retrieved for distance functions part 1") + } + } + + func testVectorLength() async throws { + let collRef = collectionRef() // Using a new collection for this test + let db = collRef.firestore + let docRef = collRef.document("vectorDocForLengthTestFinal") + + // Add a document with a known vector field + try await docRef.setData(["embedding": VectorValue([1.0, 2.0, 3.0])]) + + // Construct a pipeline query + let pipeline = db.pipeline() + .collection(collRef.path) + .limit(1) // Limit to the document we just added + .select(Field("embedding").vectorLength().as("vectorLength")) + + // Execute the pipeline + let snapshot = try await pipeline.execute() + + // Assert that the vectorLength in the result is 3 + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + if let resultDoc = snapshot.results.first { + let expectedResult: [String: Sendable?] = ["vectorLength": 3] + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResult) + } else { + XCTFail("No document retrieved for vectorLength test") + } + } + + func testNestedFields() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("awards.hugo").eq(true)) + .sort(Field("title").descending()) + .select(Field("title"), Field("awards.hugo")) + + let snapshot = try await pipeline.execute() + + let expectedResults: [[String: Sendable?]] = [ + ["title": "The Hitchhiker's Guide to the Galaxy", "awards.hugo": true], + ["title": "Dune", "awards.hugo": true], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testMapGetWithFieldNameIncludingDotNotation() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("awards.hugo").eq(true)) // Filters to book1 and book10 + .select( + Field("title"), + Field("nestedField.level.1"), + Field("nestedField").mapGet("level.1").mapGet("level.2").as("nested") + ) + .sort(Field("title").descending()) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 2, "Should retrieve two documents") + + let expectedResultsArray: [[String: Sendable?]] = [ + [ + "title": "The Hitchhiker's Guide to the Galaxy", + "nestedField.level.`1`": nil, + "nested": true, + ], + [ + "title": "Dune", + "nestedField.level.`1`": nil, + "nested": nil, + ], + ] + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: expectedResultsArray, + enforceOrder: true + ) + } + + func testGenericFunctionAddSelectable() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select( + FunctionExpr("add", [Field("rating"), Constant(1)]).as( + "rating" + ) + ) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + let expectedResult: [String: Sendable?] = [ + "rating": 5.7, + ] + + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResult) + } else { + XCTFail("No document retrieved for testGenericFunctionAddSelectable") + } + } + + func testGenericFunctionAndVariadicSelectable() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where( + BooleanExpr("and", [Field("rating").gt(0), + Field("title").charLength().lt(5), + Field("tags").arrayContains("propaganda")]) + ) + .select("title") + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + let expectedResult: [[String: Sendable?]] = [ + ["title": "1984"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResult, enforceOrder: false) + } + + func testGenericFunctionArrayContainsAny() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(BooleanExpr("array_contains_any", [Field("tags"), ArrayExpression(["politics"])])) + .select(Field("title")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + let expectedResult: [[String: Sendable?]] = [ + ["title": "Dune"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResult, enforceOrder: false) + } + + func testGenericFunctionCountIfAggregate() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .aggregate(AggregateFunction("count_if", [Field("rating").gte(4.5)]).as("countOfBest")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Aggregate should return a single document") + + let expectedResult: [String: Sendable?] = [ + "countOfBest": 3, + ] + + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResult) + } else { + XCTFail("No document retrieved for testGenericFunctionCountIfAggregate") + } + } + + func testGenericFunctionSortByCharLen() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort( + FunctionExpr("char_length", [Field("title")]).ascending(), + Field("__name__").descending() + ) + .limit(3) + .select(Field("title")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 3, "Should retrieve three documents") + + let expectedResults: [[String: Sendable?]] = [ + ["title": "1984"], + ["title": "Dune"], + ["title": "The Great Gatsby"], + ] + + TestHelper.compare(pipelineSnapshot: snapshot, expected: expectedResults, enforceOrder: true) + } + + func testSupportsRand() async throws { + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .limit(10) + .select(RandomExpr().as("result")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 10, "Should fetch 10 documents") + + for doc in snapshot.results { + guard let resultValue = doc.get("result") else { + XCTFail("Document \(doc.id ?? "unknown") should have a 'result' field") + continue + } + guard let doubleValue = resultValue as? Double else { + XCTFail("Result value for document \(doc.id ?? "unknown") is not a Double: \(resultValue)") + continue + } + XCTAssertGreaterThanOrEqual( + doubleValue, + 0.0, + "Result for \(doc.id ?? "unknown") should be >= 0.0" + ) + XCTAssertLessThan(doubleValue, 1.0, "Result for \(doc.id ?? "unknown") should be < 1.0") + } + } + + func testSupportsArray() async throws { + let db = firestore() + let collRef = collectionRef(withDocuments: bookDocs) + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(ArrayExpression([1, 2, 3, 4]).as("metadata")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + let expectedResults: [String: Sendable?] = ["metadata": [1, 2, 3, 4]] + + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for testSupportsArray") + } + } + + func testEvaluatesExpressionInArray() async throws { + let db = firestore() + let collRef = collectionRef(withDocuments: bookDocs) + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(ArrayExpression([ + 1, + 2, + Field("genre"), + Field("rating").multiply(10), + ]).as("metadata")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + let expectedResults: [String: Sendable?] = ["metadata": [1, 2, "Fantasy", 47.0]] + + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for testEvaluatesExpressionInArray") + } + } + + func testSupportsArrayOffset() async throws { + let db = firestore() + let collRef = collectionRef(withDocuments: bookDocs) + + let expectedResultsPart1: [[String: Sendable?]] = [ + ["firstTag": "adventure"], + ["firstTag": "politics"], + ["firstTag": "classic"], + ] + + let pipeline1 = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(3) + .select(Field("tags").arrayGet(0).as("firstTag")) + + let snapshot1 = try await pipeline1.execute() + XCTAssertEqual(snapshot1.results.count, 3, "Part 1: Should retrieve three documents") + TestHelper.compare( + pipelineSnapshot: snapshot1, + expected: expectedResultsPart1, + enforceOrder: true + ) + } + + func testSupportsMap() async throws { + let db = firestore() + let collRef = collectionRef(withDocuments: bookDocs) + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(MapExpression(["foo": "bar"]).as("metadata")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + let expectedResult: [String: Sendable?] = ["metadata": ["foo": "bar"]] + + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResult) + } else { + XCTFail("No document retrieved for testSupportsMap") + } + } + + func testEvaluatesExpressionInMap() async throws { + let db = firestore() + let collRef = collectionRef(withDocuments: bookDocs) + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(MapExpression([ + "genre": Field("genre"), // "Fantasy" + "rating": Field("rating").multiply(10), // 4.7 * 10 = 47.0 + ]).as("metadata")) + + let snapshot = try await pipeline.execute() + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + + // Expected: genre is "Fantasy", rating is 4.7 for book4 + let expectedResult: [String: Sendable?] = ["metadata": ["genre": "Fantasy", "rating": 47.0]] + + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResult) + } else { + XCTFail("No document retrieved for testEvaluatesExpressionInMap") + } + } + + func testSupportsMapRemove() async throws { + let db = firestore() + let collRef = collectionRef(withDocuments: bookDocs) + + let expectedResult: [String: Sendable?] = ["awards": ["nebula": false]] + + let pipeline2 = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(Field("awards").mapRemove("hugo").as("awards")) + + let snapshot2 = try await pipeline2.execute() + XCTAssertEqual(snapshot2.results.count, 1, "Should retrieve one document") + if let resultDoc2 = snapshot2.results.first { + TestHelper.compare(pipelineResult: resultDoc2, expected: expectedResult) + } else { + XCTFail("No document retrieved for testSupportsMapRemove") + } + } + + func testSupportsMapMerge() async throws { + let db = firestore() + let collRef = collectionRef(withDocuments: bookDocs) + + let expectedResult: [String: Sendable?] = + ["awards": ["hugo": false, "nebula": false, "fakeAward": true]] + let mergeMap: [String: Sendable] = ["fakeAward": true] + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(Field("awards").mapMerge(mergeMap).as("awards")) + + let snapshot = try await pipeline.execute() + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResult) + } else { + XCTFail("No document retrieved for testSupportsMapMerge") + } + } + + func testSupportsTimestampConversions() async throws { + let db = firestore() + let randomCol = collectionRef() // Unique collection for this test + + // Add a dummy document to ensure the select stage has an input + try await randomCol.document("dummyTimeDoc").setData(["field": "value"]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select( + Constant(1_741_380_235).unixSecondsToTimestamp().as("unixSecondsToTimestamp"), + Constant(1_741_380_235_123).unixMillisToTimestamp().as("unixMillisToTimestamp"), + Constant(1_741_380_235_123_456).unixMicrosToTimestamp().as("unixMicrosToTimestamp"), + Constant(Timestamp(seconds: 1_741_380_235, nanoseconds: 123_456_789)) + .timestampToUnixSeconds().as("timestampToUnixSeconds"), + Constant(Timestamp(seconds: 1_741_380_235, nanoseconds: 123_456_789)) + .timestampToUnixMillis().as("timestampToUnixMillis"), + Constant(Timestamp(seconds: 1_741_380_235, nanoseconds: 123_456_789)) + .timestampToUnixMicros().as("timestampToUnixMicros") + ) + + let snapshot = try await pipeline.execute() + XCTAssertEqual( + snapshot.results.count, + 1, + "Should retrieve one document for timestamp conversions" + ) + + let expectedResults: [String: Sendable?] = [ + "unixSecondsToTimestamp": Timestamp(seconds: 1_741_380_235, nanoseconds: 0), + "unixMillisToTimestamp": Timestamp(seconds: 1_741_380_235, nanoseconds: 123_000_000), + "unixMicrosToTimestamp": Timestamp(seconds: 1_741_380_235, nanoseconds: 123_456_000), + "timestampToUnixSeconds": 1_741_380_235, + "timestampToUnixMillis": 1_741_380_235_123, + "timestampToUnixMicros": 1_741_380_235_123_456, + ] + + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for testSupportsTimestampConversions") + } + } + + func testSupportsTimestampMath() async throws { + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let initialTimestamp = Timestamp(seconds: 1_741_380_235, nanoseconds: 0) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select( + Constant(initialTimestamp).as("timestamp") + ) + .select( + Field("timestamp").timestampAdd(.day, 10).as("plus10days"), + Field("timestamp").timestampAdd(.hour, 10).as("plus10hours"), + Field("timestamp").timestampAdd(.minute, 10).as("plus10minutes"), + Field("timestamp").timestampAdd(.second, 10).as("plus10seconds"), + Field("timestamp").timestampAdd(.microsecond, 10).as("plus10micros"), + Field("timestamp").timestampAdd(.millisecond, 10).as("plus10millis"), + Field("timestamp").timestampSub(.day, 10).as("minus10days"), + Field("timestamp").timestampSub(.hour, 10).as("minus10hours"), + Field("timestamp").timestampSub(.minute, 10).as("minus10minutes"), + Field("timestamp").timestampSub(.second, 10).as("minus10seconds"), + Field("timestamp").timestampSub(.microsecond, 10).as("minus10micros"), + Field("timestamp").timestampSub(.millisecond, 10).as("minus10millis") + ) + + let snapshot = try await pipeline.execute() + + let expectedResults: [String: Timestamp] = [ + "plus10days": Timestamp(seconds: 1_742_244_235, nanoseconds: 0), + "plus10hours": Timestamp(seconds: 1_741_416_235, nanoseconds: 0), + "plus10minutes": Timestamp(seconds: 1_741_380_835, nanoseconds: 0), + "plus10seconds": Timestamp(seconds: 1_741_380_245, nanoseconds: 0), + "plus10micros": Timestamp(seconds: 1_741_380_235, nanoseconds: 10000), + "plus10millis": Timestamp(seconds: 1_741_380_235, nanoseconds: 10_000_000), + "minus10days": Timestamp(seconds: 1_740_516_235, nanoseconds: 0), + "minus10hours": Timestamp(seconds: 1_741_344_235, nanoseconds: 0), + "minus10minutes": Timestamp(seconds: 1_741_379_635, nanoseconds: 0), + "minus10seconds": Timestamp(seconds: 1_741_380_225, nanoseconds: 0), + "minus10micros": Timestamp(seconds: 1_741_380_234, nanoseconds: 999_990_000), + "minus10millis": Timestamp(seconds: 1_741_380_234, nanoseconds: 990_000_000), + ] + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for timestamp math test") + } + } + + func testSupportsByteLength() async throws { + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let bytes = Data([1, 2, 3, 4, 5, 6, 7, 0]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select( + Constant(bytes).as("bytes") + ) + .select( + Field("bytes").byteLength().as("byteLength") + ) + + let snapshot = try await pipeline.execute() + + let expectedResults: [String: Sendable] = [ + "byteLength": 8, + ] + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + if let resultDoc = snapshot.results.first { + TestHelper.compare( + pipelineResult: resultDoc, + expected: expectedResults.mapValues { $0 as Sendable } + ) + } else { + XCTFail("No document retrieved for byte length test") + } + } + + func testSupportsNot() async throws { + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select(Constant(true).as("trueField")) + .select( + Field("trueField"), + (!(Field("trueField").eq(true))).as("falseField") + ) + + let snapshot = try await pipeline.execute() + + let expectedResults: [String: Bool] = [ + "trueField": true, + "falseField": false, + ] + + XCTAssertEqual(snapshot.results.count, 1, "Should retrieve one document") + if let resultDoc = snapshot.results.first { + TestHelper.compare(pipelineResult: resultDoc, expected: expectedResults) + } else { + XCTFail("No document retrieved for not operator test") + } + } + + func testReplaceFirst() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("The Lord of the Rings")) + .limit(1) + .select(Field("title").replaceFirst("o", "0").as("newName")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["newName": "The L0rd of the Rings"]], + enforceOrder: false + ) + } + + func testReplaceAll() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("The Lord of the Rings")) + .limit(1) + .select(Field("title").replaceAll("o", "0").as("newName")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["newName": "The L0rd 0f the Rings"]], + enforceOrder: false + ) + } + + func testBitAnd() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select(Constant(5).bitAnd(12).as("result")) + let snapshot = try await pipeline.execute() + TestHelper.compare(pipelineSnapshot: snapshot, expected: [["result": 4]], enforceOrder: false) + } + + func testBitOr() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select(Constant(5).bitOr(12).as("result")) + let snapshot = try await pipeline.execute() + TestHelper.compare(pipelineSnapshot: snapshot, expected: [["result": 13]], enforceOrder: false) + } + + func testBitXor() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select(Constant(5).bitXor(12).as("result")) + let snapshot = try await pipeline.execute() + TestHelper.compare(pipelineSnapshot: snapshot, expected: [["result": 9]], enforceOrder: false) + } + + func testBitNot() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + let bytesInput = Data([0xFD]) + let expectedOutput = Data([0x02]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select(Constant(bytesInput).bitNot().as("result")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["result": expectedOutput]], + enforceOrder: false + ) + } + + func testBitLeftShift() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + let bytesInput = Data([0x02]) + let expectedOutput = Data([0x08]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select(Constant(bytesInput).bitLeftShift(2).as("result")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["result": expectedOutput]], + enforceOrder: false + ) + } + + func testBitRightShift() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let db = firestore() + let randomCol = collectionRef() + try await randomCol.document("dummyDoc").setData(["field": "value"]) + let bytesInput = Data([0x02]) + let expectedOutput = Data([0x00]) + + let pipeline = db.pipeline() + .collection(randomCol.path) + .limit(1) + .select(Constant(bytesInput).bitRightShift(2).as("result")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["result": expectedOutput]], + enforceOrder: false + ) + } + + func testDocumentId() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(Field("__path__").documentId().as("docId")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["docId": "book4"]], + enforceOrder: false + ) + } + + func testSubstr() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(Field("title").substr(9, 2).as("of")) + let snapshot = try await pipeline.execute() + TestHelper.compare(pipelineSnapshot: snapshot, expected: [["of": "of"]], enforceOrder: false) + } + + func testSubstrWithoutLength() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .sort(Field("rating").descending()) + .limit(1) + .select(Field("title").substr(9).as("of")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["of": "of the Rings"]], + enforceOrder: false + ) + } + + func testArrayConcat() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + var pipeline = db.pipeline() + .collection(collRef.path) + .limit(1) // Assuming we operate on the first book (book1) + .select( + Field("tags").arrayConcat( + ["newTag1", "newTag2"], + [Field("tags")], + [Constant.nil] + ).as("modifiedTags") + ) + var snapshot = try await pipeline.execute() + + let expectedTags: [Sendable?] = [ + "comedy", "space", "adventure", + "newTag1", "newTag2", + "comedy", "space", "adventure", + nil, + ] + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["modifiedTags": expectedTags]], + enforceOrder: false + ) + + pipeline = db.pipeline() + .collection(collRef.path) + .limit(1) // Assuming we operate on the first book (book1) + .select( + Field("tags").arrayConcat( + Field("newTag1"), Field("newTag2"), + Field("tags"), + Constant.nil + ).as("modifiedTags") + ) + snapshot = try await pipeline.execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["modifiedTags": expectedTags]], + enforceOrder: false + ) + } + + func testToLowercase() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .limit(1) + .select(Field("title").lowercased().as("lowercaseTitle")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["lowercaseTitle": "the hitchhiker's guide to the galaxy"]], + enforceOrder: false + ) + } + + func testToUppercase() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .limit(1) + .select(Field("author").uppercased().as("uppercaseAuthor")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["uppercaseAuthor": "DOUGLAS ADAMS"]], + enforceOrder: false + ) + } + + func testTrim() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .addFields(Constant(" The Hitchhiker's Guide to the Galaxy ").as("spacedTitle")) + .select(Field("spacedTitle").trim().as("trimmedTitle"), Field("spacedTitle")) + .limit(1) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [[ + "spacedTitle": " The Hitchhiker's Guide to the Galaxy ", + "trimmedTitle": "The Hitchhiker's Guide to the Galaxy", + ]], + enforceOrder: false + ) + } + + func testReverseString() async throws { + // Renamed from testReverse to avoid conflict if a generic reverse exists elsewhere + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + + let pipeline = db.pipeline() + .collection(collRef.path) + .where(Field("title").eq("1984")) + .limit(1) + .select(Field("title").reverse().as("reverseTitle")) + let snapshot = try await pipeline.execute() + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [["reverseTitle": "4891"]], + enforceOrder: false + ) + } + + private func addBooks(to collectionReference: CollectionReference) async throws { + try await collectionReference.document("book11").setData([ + "title": "Jonathan Strange & Mr Norrell", + "author": "Susanna Clarke", + "genre": "Fantasy", + "published": 2004, + "rating": 4.6, + "tags": ["historical fantasy", "magic", "alternate history", "england"], + "awards": ["hugo": false, "nebula": false], + ]) + try await collectionReference.document("book12").setData([ + "title": "The Master and Margarita", + "author": "Mikhail Bulgakov", + "genre": "Satire", + "published": 1967, + "rating": 4.6, + "tags": ["russian literature", "supernatural", "philosophy", "dark comedy"], + "awards": [:], + ]) + try await collectionReference.document("book13").setData([ + "title": "A Long Way to a Small, Angry Planet", + "author": "Becky Chambers", + "genre": "Science Fiction", + "published": 2014, + "rating": 4.6, + "tags": ["space opera", "found family", "character-driven", "optimistic"], + "awards": ["hugo": false, "nebula": false, "kitschies": true], + ]) + } + + func testSupportsPaginationWithOffsetsUsingName() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + try await addBooks(to: collRef) + + let pageSize = 2 + + let pipeline = db.pipeline() + .collection(collRef.path) + .select("title", "rating", "__name__") + .sort( + Field("rating").descending(), + Field("__name__").ascending() + ) + + var snapshot = try await pipeline.limit(Int32(pageSize)).execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + ["title": "The Lord of the Rings", "rating": 4.7], + ["title": "Jonathan Strange & Mr Norrell", "rating": 4.6], + ], + enforceOrder: true + ) + + let lastDoc = snapshot.results.last! + + snapshot = try await pipeline.where( + (Field("rating").eq(lastDoc.get("rating")!) + && Field("rating").lt(lastDoc.get("rating")!)) + || Field("rating").lt(lastDoc.get("rating")!) + ).limit(Int32(pageSize)).execute() + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + ["title": "Pride and Prejudice", "rating": 4.5], + ["title": "Crime and Punishment", "rating": 4.3], + ], + enforceOrder: false + ) + } + + func testSupportsPaginationWithOffsetsUsingPath() async throws { + try XCTSkipIf(true, "Skip this test since backend has not yet supported.") + + let collRef = collectionRef(withDocuments: bookDocs) + let db = collRef.firestore + try await addBooks(to: collRef) + + let pageSize = 2 + var currPage = 0 + + let pipeline = db.pipeline() + .collection(collRef.path) + .select("title", "rating", "__path__") + .sort( + Field("rating").descending(), + Field("__path__").ascending() + ) + + var snapshot = try await pipeline.offset(Int32(currPage) * Int32(pageSize)).limit( + Int32(pageSize) + ).execute() + + currPage += 1 + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + ["title": "The Lord of the Rings", "rating": 4.7], + ["title": "Dune", "rating": 4.6], + ], + enforceOrder: true + ) + + snapshot = try await pipeline.offset(Int32(currPage) * Int32(pageSize)).limit( + Int32(pageSize) + ).execute() + + currPage += 1 + + TestHelper.compare( + pipelineSnapshot: snapshot, + expected: [ + ["title": "A Long Way to a Small, Angry Planet", "rating": 4.6], + ["title": "Pride and Prejudice", "rating": 4.5], + ], + enforceOrder: true + ) + } +} diff --git a/Firestore/Swift/Tests/TestHelper/TestHelper.swift b/Firestore/Swift/Tests/TestHelper/TestHelper.swift new file mode 100644 index 00000000000..a98e1bd4fa2 --- /dev/null +++ b/Firestore/Swift/Tests/TestHelper/TestHelper.swift @@ -0,0 +1,227 @@ +/* + * Copyright 2025 Google LLC + * + * 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. + */ + +import FirebaseCore +import FirebaseFirestore +import Foundation +import XCTest + +public enum TestHelper { + public static func compare(pipelineSnapshot snapshot: PipelineSnapshot, + expectedCount: Int, + file: StaticString = #file, + line: UInt = #line) { + XCTAssertEqual( + snapshot.results.count, + expectedCount, + "Snapshot results count mismatch", + file: file, + line: line + ) + } + + static func compare(pipelineSnapshot snapshot: PipelineSnapshot, + expectedIDs: [String], + enforceOrder: Bool, + file: StaticString = #file, + line: UInt = #line) { + let results = snapshot.results + XCTAssertEqual( + results.count, + expectedIDs.count, + "Snapshot document IDs count mismatch. Expected \(expectedIDs.count), got \(results.count). Actual IDs: \(results.map { $0.id })", + file: file, + line: line + ) + + if enforceOrder { + let actualIDs = results.map { $0.id! } + XCTAssertEqual( + actualIDs, + expectedIDs, + "Snapshot document IDs mismatch. Expected: \(expectedIDs.sorted()), got: \(actualIDs)", + file: file, + line: line + ) + } else { + let actualIDs = results.map { $0.id! }.sorted() + XCTAssertEqual( + actualIDs, + expectedIDs.sorted(), + "Snapshot document IDs mismatch. Expected (sorted): \(expectedIDs.sorted()), got (sorted): \(actualIDs)", + file: file, + line: line + ) + } + } + + static func compare(pipelineSnapshot snapshot: PipelineSnapshot, + expected: [[String: Sendable?]], + enforceOrder: Bool, + file: StaticString = #file, + line: UInt = #line) { + guard snapshot.results.count == expected.count else { + XCTFail("Mismatch in expected results count and actual results count.") + return + } + + if enforceOrder { + for i in 0 ..< expected.count { + compare(pipelineResult: snapshot.results[i], expected: expected[i]) + } + } else { + let result = snapshot.results.map { $0.data } + XCTAssertTrue(areArraysOfDictionariesEqualRegardlessOfOrder(result, expected), + "PipelineSnapshot mismatch. Expected \(expected), got \(result)") + } + } + + static func compare(pipelineResult result: PipelineResult, + expected: [String: Sendable?], + file: StaticString = #file, + line: UInt = #line) { + XCTAssertTrue(areDictionariesEqual(result.data, expected), + "Document data mismatch. Expected \(expected), got \(result.data)") + } + + // MARK: - Internal helper + + private static func isNilOrNSNull(_ value: Sendable?) -> Bool { + // First, use a `guard` to safely unwrap the optional. + // If it's nil, we can immediately return true. + guard let unwrappedValue = value else { + return true + } + + // If it wasn't nil, we now check if the unwrapped value is the NSNull object. + return unwrappedValue is NSNull + } + + // A custom function to compare two values of type 'Sendable' + private static func areEqual(_ value1: Sendable?, _ value2: Sendable?) -> Bool { + if isNilOrNSNull(value1) || isNilOrNSNull(value2) { + return isNilOrNSNull(value1) && isNilOrNSNull(value2) + } + + switch (value1!, value2!) { + case let (v1 as [String: Sendable?], v2 as [String: Sendable?]): + return areDictionariesEqual(v1, v2) + case let (v1 as [Sendable?], v2 as [Sendable?]): + return areArraysEqual(v1, v2) + case let (v1 as Timestamp, v2 as Timestamp): + return v1 == v2 + case let (v1 as Date, v2 as Timestamp): + // Firestore converts Dates to Timestamps + return Timestamp(date: v1) == v2 + case let (v1 as GeoPoint, v2 as GeoPoint): + return v1.latitude == v2.latitude && v1.longitude == v2.longitude + case let (v1 as DocumentReference, v2 as DocumentReference): + return v1.path == v2.path + case let (v1 as VectorValue, v2 as VectorValue): + return v1.array == v2.array + case let (v1 as Data, v2 as Data): + return v1 == v2 + case let (v1 as Int, v2 as Int): + return v1 == v2 + case let (v1 as Double, v2 as Double): + let doubleEpsilon = 0.000001 + return abs(v1 - v2) <= doubleEpsilon + case let (v1 as Float, v2 as Float): + let floatEpsilon: Float = 0.00001 + return abs(v1 - v2) <= floatEpsilon + case let (v1 as String, v2 as String): + return v1 == v2 + case let (v1 as Bool, v2 as Bool): + return v1 == v2 + case let (v1 as UInt8, v2 as UInt8): + return v1 == v2 + default: + // Fallback for any other types, might need more specific checks + return false + } + } + + // A function to compare two dictionaries + private static func areDictionariesEqual(_ dict1: [String: Sendable?], + _ dict2: [String: Sendable?]) -> Bool { + guard dict1.count == dict2.count else { return false } + + for (key, value1) in dict1 { + guard let value2 = dict2[key], areEqual(value1, value2) else { + XCTFail(""" + Dictionary value mismatch for key: '\(key)' + Actual value: '\(String(describing: value1))' (from dict1) + Expected value: '\(String(describing: dict2[key]))' (from dict2) + Full actual value: \(String(describing: dict1)) + Full expected value: \(String(describing: dict2)) + """) + return false + } + } + return true + } + + private static func areArraysEqual(_ array1: [Sendable?], _ array2: [Sendable?]) -> Bool { + guard array1.count == array2.count else { return false } + + for (index, value1) in array1.enumerated() { + let value2 = array2[index] + if !areEqual(value1, value2) { + XCTFail(""" + Array value mismatch. + Actual array value: '\(String(describing: value1))' + Expected array value: '\(String(describing: value2))' + """) + return false + } + } + return true + } + + private static func areArraysOfDictionariesEqualRegardlessOfOrder(_ array1: [[String: Sendable?]], + _ array2: [[String: Sendable?]]) + -> Bool { + // 1. Check if the arrays have the same number of dictionaries. + guard array1.count == array2.count else { + return false + } + + // Create a mutable copy of array2 to remove matched dictionaries + var mutableArray2 = array2 + + // Iterate through each dictionary in array1 + for dict1 in array1 { + var foundMatch = false + // Try to find an equivalent dictionary in mutableArray2 + if let index = mutableArray2.firstIndex(where: { dict2 in + areDictionariesEqual(dict1, dict2) // Use our deep comparison function + }) { + // If a match is found, remove it from mutableArray2 to handle duplicates + mutableArray2.remove(at: index) + foundMatch = true + } + + // If no match was found for the current dictionary from array1, arrays are not equal + if !foundMatch { + return false + } + } + + // If we've iterated through all of array1 and mutableArray2 is empty, + // it means all dictionaries found a unique match. + return mutableArray2.isEmpty + } +} diff --git a/Firestore/core/src/api/aggregate_expressions.cc b/Firestore/core/src/api/aggregate_expressions.cc new file mode 100644 index 00000000000..8509dfda59a --- /dev/null +++ b/Firestore/core/src/api/aggregate_expressions.cc @@ -0,0 +1,43 @@ +/* + * Copyright 2025 Google LLC + * + * 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/api/aggregate_expressions.h" + +#include "Firestore/core/src/nanopb/nanopb_util.h" + +namespace firebase { +namespace firestore { +namespace api { + +google_firestore_v1_Value AggregateFunction::to_proto() const { + google_firestore_v1_Value result; + result.which_value_type = google_firestore_v1_Value_function_value_tag; + result.function_value = google_firestore_v1_Function{}; + result.function_value.name = nanopb::MakeBytesArray(name_); + result.function_value.args_count = static_cast(params_.size()); + result.function_value.args = nanopb::MakeArray( + result.function_value.args_count); + + for (size_t i = 0; i < params_.size(); ++i) { + result.function_value.args[i] = params_[i]->to_proto(); + } + + return result; +} + +} // namespace api +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/api/aggregate_expressions.h b/Firestore/core/src/api/aggregate_expressions.h new file mode 100644 index 00000000000..fc19eacb0a5 --- /dev/null +++ b/Firestore/core/src/api/aggregate_expressions.h @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Google LLC + * + * 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_API_AGGREGATE_EXPRESSIONS_H_ +#define FIRESTORE_CORE_SRC_API_AGGREGATE_EXPRESSIONS_H_ + +#include +#include +#include +#include + +#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" +#include "Firestore/core/src/api/expressions.h" + +namespace firebase { +namespace firestore { +namespace api { + +class AggregateFunction { + public: + AggregateFunction(std::string name, std::vector> params) + : name_(std::move(name)), params_(std::move(params)) { + } + ~AggregateFunction() = default; + + google_firestore_v1_Value to_proto() const; + + private: + std::string name_; + std::vector> params_; +}; + +} // namespace api +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_API_AGGREGATE_EXPRESSIONS_H_ diff --git a/Firestore/core/src/api/api_fwd.h b/Firestore/core/src/api/api_fwd.h index 0c35c567157..ded3bfb76af 100644 --- a/Firestore/core/src/api/api_fwd.h +++ b/Firestore/core/src/api/api_fwd.h @@ -44,6 +44,8 @@ class DocumentReference; class DocumentSnapshot; class Firestore; class ListenerRegistration; +class Pipeline; +class PipelineSnapshot; class Query; class QuerySnapshot; class Settings; diff --git a/Firestore/core/src/api/expressions.cc b/Firestore/core/src/api/expressions.cc new file mode 100644 index 00000000000..7ec517f2aab --- /dev/null +++ b/Firestore/core/src/api/expressions.cc @@ -0,0 +1,58 @@ +/* + * Copyright 2025 Google LLC + * + * 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/api/expressions.h" + +#include + +#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" +#include "Firestore/core/src/model/value_util.h" +#include "Firestore/core/src/nanopb/nanopb_util.h" + +namespace firebase { +namespace firestore { +namespace api { + +google_firestore_v1_Value Field::to_proto() const { + google_firestore_v1_Value result; + + result.which_value_type = google_firestore_v1_Value_field_reference_value_tag; + result.field_reference_value = nanopb::MakeBytesArray(this->name_); + + return result; +} + +google_firestore_v1_Value Constant::to_proto() const { + // Return a copy of the value proto to avoid double delete. + return *model::DeepClone(*value_).release(); +} + +google_firestore_v1_Value FunctionExpr::to_proto() const { + google_firestore_v1_Value result; + + result.which_value_type = google_firestore_v1_Value_function_value_tag; + result.function_value = google_firestore_v1_Function{}; + result.function_value.name = nanopb::MakeBytesArray(name_); + nanopb::SetRepeatedField( + &result.function_value.args, &result.function_value.args_count, args_, + [](const std::shared_ptr& arg) { return arg->to_proto(); }); + + return result; +} + +} // namespace api +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/api/expressions.h b/Firestore/core/src/api/expressions.h new file mode 100644 index 00000000000..fe6f4fde9c8 --- /dev/null +++ b/Firestore/core/src/api/expressions.h @@ -0,0 +1,80 @@ +/* + * Copyright 2025 Google LLC + * + * 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_API_EXPRESSIONS_H_ +#define FIRESTORE_CORE_SRC_API_EXPRESSIONS_H_ + +#include +#include +#include +#include + +#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" +#include "Firestore/core/src/nanopb/message.h" + +namespace firebase { +namespace firestore { +namespace api { + +class Expr { + public: + Expr() = default; + virtual ~Expr() = default; + virtual google_firestore_v1_Value to_proto() const = 0; +}; + +class Field : public Expr { + public: + explicit Field(std::string name) : name_(std::move(name)) { + } + google_firestore_v1_Value to_proto() const override; + const std::string& alias() const { + return name_; + } + + private: + std::string name_; +}; + +class Constant : public Expr { + public: + explicit Constant(nanopb::SharedMessage value) + : value_(std::move(value)) { + } + google_firestore_v1_Value to_proto() const override; + + private: + nanopb::SharedMessage value_; +}; + +class FunctionExpr : public Expr { + public: + FunctionExpr(std::string name, std::vector> args) + : name_(std::move(name)), args_(std::move(args)) { + } + + google_firestore_v1_Value to_proto() const override; + + private: + std::string name_; + std::vector> args_; +}; + +} // namespace api +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_API_EXPRESSIONS_H_ diff --git a/Firestore/core/src/api/firestore.cc b/Firestore/core/src/api/firestore.cc index 70cb975cc71..1484f3a27fc 100644 --- a/Firestore/core/src/api/firestore.cc +++ b/Firestore/core/src/api/firestore.cc @@ -179,6 +179,13 @@ void Firestore::RunTransaction(core::TransactionUpdateCallback update_callback, std::move(result_callback)); } +void Firestore::RunPipeline(const api::Pipeline& pipeline, + util::StatusOrCallback callback) { + EnsureClientConfigured(); + + client_->RunPipeline(pipeline, std::move(callback)); +} + void Firestore::Terminate(util::StatusCallback callback) { // The client must be initialized to ensure that all subsequent API usage // throws an exception. diff --git a/Firestore/core/src/api/firestore.h b/Firestore/core/src/api/firestore.h index 0300f6c61f2..de22a87c14c 100644 --- a/Firestore/core/src/api/firestore.h +++ b/Firestore/core/src/api/firestore.h @@ -102,6 +102,8 @@ class Firestore : public std::enable_shared_from_this { void RunTransaction(core::TransactionUpdateCallback update_callback, core::TransactionResultCallback result_callback, int max_attempts); + void RunPipeline(const api::Pipeline& pipeline, + util::StatusOrCallback callback); void Terminate(util::StatusCallback callback); void ClearPersistence(util::StatusCallback callback); diff --git a/Firestore/core/src/api/ordering.cc b/Firestore/core/src/api/ordering.cc new file mode 100644 index 00000000000..47d5ad6013b --- /dev/null +++ b/Firestore/core/src/api/ordering.cc @@ -0,0 +1,49 @@ +/* + * Copyright 2025 Google LLC + * + * 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/api/ordering.h" + +#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" +#include "Firestore/core/src/nanopb/nanopb_util.h" + +namespace firebase { +namespace firestore { +namespace api { + +google_firestore_v1_Value Ordering::to_proto() const { + google_firestore_v1_Value result; + result.which_value_type = google_firestore_v1_Value_map_value_tag; + + result.map_value.fields_count = 2; + result.map_value.fields = + nanopb::MakeArray(2); + + result.map_value.fields[0].key = nanopb::MakeBytesArray("direction"); + google_firestore_v1_Value direction; + direction.which_value_type = google_firestore_v1_Value_string_value_tag; + direction.string_value = nanopb::MakeBytesArray( + this->direction_ == ASCENDING ? "ascending" : "descending"); + result.map_value.fields[0].value = direction; + + result.map_value.fields[1].key = nanopb::MakeBytesArray("expression"); + result.map_value.fields[1].value = expr_->to_proto(); + + return result; +} + +} // namespace api +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/api/ordering.h b/Firestore/core/src/api/ordering.h new file mode 100644 index 00000000000..2e4709d2af0 --- /dev/null +++ b/Firestore/core/src/api/ordering.h @@ -0,0 +1,59 @@ +/* + * Copyright 2025 Google LLC + * + * 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_API_ORDERING_H_ +#define FIRESTORE_CORE_SRC_API_ORDERING_H_ + +#include +#include +#include + +#include "Firestore/core/src/api/expressions.h" +#include "Firestore/core/src/util/exception.h" + +namespace firebase { +namespace firestore { +namespace api { + +class Ordering { + public: + enum Direction { + ASCENDING, + DESCENDING, + }; + + static Direction DirectionFromString(const std::string& str) { + if (str == "ascending") return ASCENDING; + if (str == "descending") return DESCENDING; + util::ThrowInvalidArgument("Unknown direction: '%s' ", str); + } + + Ordering(std::shared_ptr expr, Direction direction) + : expr_(expr), direction_(direction) { + } + + google_firestore_v1_Value to_proto() const; + + private: + std::shared_ptr expr_; + Direction direction_; +}; + +} // namespace api +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_API_ORDERING_H_ diff --git a/Firestore/core/src/api/pipeline.cc b/Firestore/core/src/api/pipeline.cc new file mode 100644 index 00000000000..8f92d65465e --- /dev/null +++ b/Firestore/core/src/api/pipeline.cc @@ -0,0 +1,61 @@ +/* + * Copyright 2025 Google LLC + * + * 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/api/pipeline.h" + +#include +#include + +#include "Firestore/core/src/core/firestore_client.h" + +namespace firebase { +namespace firestore { +namespace api { + +using nanopb::CheckedSize; + +Pipeline Pipeline::AddingStage(std::shared_ptr stage) { + auto copy = std::vector>(this->stages_); + copy.push_back(stage); + + return {copy, this->firestore_}; +} + +const std::vector>& Pipeline::stages() const { + return this->stages_; +} + +void Pipeline::execute(util::StatusOrCallback callback) { + this->firestore_->RunPipeline(*this, std::move(callback)); +} + +google_firestore_v1_Value Pipeline::to_proto() const { + google_firestore_v1_Value result; + + result.which_value_type = google_firestore_v1_Value_pipeline_value_tag; + result.pipeline_value = google_firestore_v1_Pipeline{}; + result.pipeline_value.stages_count = CheckedSize(this->stages_.size()); + nanopb::SetRepeatedField( + &result.pipeline_value.stages, &result.pipeline_value.stages_count, + stages_, + [](const std::shared_ptr& arg) { return arg->to_proto(); }); + + return result; +} + +} // namespace api +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/api/pipeline.h b/Firestore/core/src/api/pipeline.h new file mode 100644 index 00000000000..edea35dce6d --- /dev/null +++ b/Firestore/core/src/api/pipeline.h @@ -0,0 +1,61 @@ +/* + * Copyright 2025 Google LLC + * + * 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_API_PIPELINE_H_ +#define FIRESTORE_CORE_SRC_API_PIPELINE_H_ + +#include +#include +#include + +#include "Firestore/core/src/api/firestore.h" +#include "Firestore/core/src/api/pipeline_snapshot.h" +#include "Firestore/core/src/api/stages.h" +#include "Firestore/core/src/util/status_fwd.h" + +namespace firebase { +namespace firestore { +namespace api { + +class Pipeline { + public: + Pipeline(std::vector> stages, + std::shared_ptr firestore) + : stages_(std::move(stages)), firestore_(firestore) { + } + + const std::shared_ptr& firestore() const { + return firestore_; + } + + Pipeline AddingStage(std::shared_ptr stage); + + const std::vector>& stages() const; + + void execute(util::StatusOrCallback callback); + + google_firestore_v1_Value to_proto() const; + + private: + std::vector> stages_; + std::shared_ptr firestore_; +}; + +} // namespace api +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_API_PIPELINE_H_ diff --git a/Firestore/core/src/api/pipeline_result.cc b/Firestore/core/src/api/pipeline_result.cc new file mode 100644 index 00000000000..655fd7b4132 --- /dev/null +++ b/Firestore/core/src/api/pipeline_result.cc @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Google LLC + * + * 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/api/pipeline_result.h" + +#include + +#include "Firestore/core/src/api/document_reference.h" +#include "Firestore/core/src/model/document.h" +#include "Firestore/core/src/model/document_key.h" +#include "Firestore/core/src/model/field_path.h" +#include "Firestore/core/src/model/object_value.h" +#include "Firestore/core/src/model/resource_path.h" +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" + +namespace firebase { +namespace firestore { +namespace api { + +using model::Document; +using model::DocumentKey; +using model::FieldPath; +using model::ObjectValue; + +std::shared_ptr PipelineResult::internal_value() const { + return value_; +} + +absl::optional PipelineResult::document_id() const { + if (!internal_key_.has_value()) { + return absl::nullopt; + } + return internal_key_.value().path().last_segment(); +} + +} // namespace api +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/api/pipeline_result.h b/Firestore/core/src/api/pipeline_result.h new file mode 100644 index 00000000000..662ea721c6b --- /dev/null +++ b/Firestore/core/src/api/pipeline_result.h @@ -0,0 +1,83 @@ +/* + * Copyright 2025 Google LLC + * + * 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_API_PIPELINE_RESULT_H_ +#define FIRESTORE_CORE_SRC_API_PIPELINE_RESULT_H_ + +#include +#include +#include + +#include "Firestore/core/src/model/document.h" +#include "Firestore/core/src/model/document_key.h" +#include "Firestore/core/src/model/model_fwd.h" +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" + +namespace firebase { +namespace firestore { +namespace api { + +class DocumentReference; +class Firestore; + +class PipelineResult { + public: + PipelineResult(absl::optional document_key, + std::shared_ptr value, + absl::optional create_time, + absl::optional update_time, + absl::optional execution_time) + : internal_key_{std::move(document_key)}, + value_{std::move(value)}, + create_time_{create_time}, + update_time_{update_time}, + execution_time_{execution_time} { + } + + PipelineResult() = default; + + std::shared_ptr internal_value() const; + absl::optional document_id() const; + + absl::optional create_time() const { + return create_time_; + } + + absl::optional update_time() const { + return update_time_; + } + + const absl::optional& internal_key() const { + return internal_key_; + } + + private: + absl::optional internal_key_; + // Using a shared pointer to ObjectValue makes PipelineResult copy-assignable + // without having to manually create a deep clone of its Protobuf contents. + std::shared_ptr value_ = + std::make_shared(); + absl::optional create_time_; + absl::optional update_time_; + absl::optional execution_time_; +}; + +} // namespace api +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_API_PIPELINE_RESULT_H_ diff --git a/Firestore/core/src/api/pipeline_snapshot.h b/Firestore/core/src/api/pipeline_snapshot.h new file mode 100644 index 00000000000..2bb0a1e94d2 --- /dev/null +++ b/Firestore/core/src/api/pipeline_snapshot.h @@ -0,0 +1,66 @@ +/* + * Copyright 2025 Google LLC + * + * 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_API_PIPELINE_SNAPSHOT_H_ +#define FIRESTORE_CORE_SRC_API_PIPELINE_SNAPSHOT_H_ + +#include +#include +#include +#include + +#include "Firestore/core/src/api/api_fwd.h" +#include "Firestore/core/src/api/pipeline_result.h" +#include "Firestore/core/src/model/snapshot_version.h" + +namespace firebase { +namespace firestore { +namespace api { + +class PipelineSnapshot { + public: + explicit PipelineSnapshot(std::vector&& results, + model::SnapshotVersion execution_time) + : results_(std::move(results)), execution_time_(execution_time) { + } + + const std::vector& results() const { + return results_; + } + + model::SnapshotVersion execution_time() const { + return execution_time_; + } + + const std::shared_ptr firestore() const { + return firestore_; + } + + void SetFirestore(std::shared_ptr db) { + firestore_ = std::move(db); + } + + private: + std::vector results_; + model::SnapshotVersion execution_time_; + std::shared_ptr firestore_; +}; + +} // namespace api +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_API_PIPELINE_SNAPSHOT_H_ diff --git a/Firestore/core/src/api/stages.cc b/Firestore/core/src/api/stages.cc new file mode 100644 index 00000000000..a32dfe6f40e --- /dev/null +++ b/Firestore/core/src/api/stages.cc @@ -0,0 +1,466 @@ +/* + * Copyright 2025 Google LLC + * + * 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/api/stages.h" + +#include +#include + +#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" +#include "Firestore/core/src/api/pipeline.h" +#include "Firestore/core/src/nanopb/message.h" +#include "Firestore/core/src/nanopb/nanopb_util.h" + +namespace firebase { +namespace firestore { +namespace api { + +using model::DeepClone; + +google_firestore_v1_Pipeline_Stage CollectionSource::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + + result.name = nanopb::MakeBytesArray("collection"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + result.args[0].which_value_type = + google_firestore_v1_Value_reference_value_tag; + result.args[0].reference_value = nanopb::MakeBytesArray(this->path_); + + result.options_count = 0; + result.options = nullptr; + + return result; +} + +google_firestore_v1_Pipeline_Stage DatabaseSource::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + + result.name = nanopb::MakeBytesArray("database"); + result.args_count = 0; + result.args = nullptr; + result.options_count = 0; + result.options = nullptr; + + return result; +} + +google_firestore_v1_Pipeline_Stage CollectionGroupSource::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + + result.name = nanopb::MakeBytesArray("collection_group"); + + result.args_count = 2; + result.args = nanopb::MakeArray(2); + // First argument is an empty reference value. + result.args[0].which_value_type = + google_firestore_v1_Value_reference_value_tag; + result.args[0].reference_value = nanopb::MakeBytesArray(""); + + // Second argument is the collection ID (encoded as a string value). + result.args[1].which_value_type = google_firestore_v1_Value_string_value_tag; + result.args[1].string_value = nanopb::MakeBytesArray(collection_id_); + + result.options_count = 0; + result.options = nullptr; + + return result; +} + +google_firestore_v1_Pipeline_Stage DocumentsSource::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + + result.name = nanopb::MakeBytesArray("documents"); + + result.args_count = static_cast(documents_.size()); + result.args = nanopb::MakeArray(result.args_count); + + for (size_t i = 0; i < documents_.size(); ++i) { + result.args[i].which_value_type = + google_firestore_v1_Value_reference_value_tag; + result.args[i].reference_value = nanopb::MakeBytesArray(documents_[i]); + } + + result.options_count = 0; + result.options = nullptr; + + return result; +} + +google_firestore_v1_Pipeline_Stage AddFields::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("add_fields"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + + result.args[0].which_value_type = google_firestore_v1_Value_map_value_tag; + nanopb::SetRepeatedField( + &result.args[0].map_value.fields, &result.args[0].map_value.fields_count, + fields_, [](const std::pair>& entry) { + return _google_firestore_v1_MapValue_FieldsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second->to_proto()}; + }); + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Pipeline_Stage AggregateStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("aggregate"); + + result.args_count = 2; + result.args = nanopb::MakeArray(2); + + // Encode accumulators map. + result.args[0].which_value_type = google_firestore_v1_Value_map_value_tag; + nanopb::SetRepeatedField( + &result.args[0].map_value.fields, &result.args[0].map_value.fields_count, + this->accumulators_, + [](const std::pair>& + entry) { + return _google_firestore_v1_MapValue_FieldsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second->to_proto()}; + }); + + // Encode groups map. + result.args[1].which_value_type = google_firestore_v1_Value_map_value_tag; + nanopb::SetRepeatedField( + &result.args[1].map_value.fields, &result.args[1].map_value.fields_count, + this->groups_, + [](const std::pair>& entry) { + return _google_firestore_v1_MapValue_FieldsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second->to_proto()}; + }); + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Pipeline_Stage Where::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + + result.name = nanopb::MakeBytesArray("where"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + result.args[0] = this->expr_->to_proto(); + + result.options_count = 0; + result.options = nullptr; + + return result; +} + +google_firestore_v1_Value FindNearestStage::DistanceMeasure::proto() const { + google_firestore_v1_Value result; + result.which_value_type = google_firestore_v1_Value_string_value_tag; + switch (measure_) { + case EUCLIDEAN: + result.string_value = nanopb::MakeBytesArray("euclidean"); + break; + case COSINE: + result.string_value = nanopb::MakeBytesArray("cosine"); + break; + case DOT_PRODUCT: + result.string_value = nanopb::MakeBytesArray("dot_product"); + break; + } + return result; +} + +google_firestore_v1_Pipeline_Stage FindNearestStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("find_nearest"); + + result.args_count = 3; + result.args = nanopb::MakeArray(3); + result.args[0] = property_->to_proto(); + result.args[1] = *DeepClone(*vector_).release(); + result.args[2] = distance_measure_.proto(); + + nanopb::SetRepeatedField( + &result.options, &result.options_count, options_, + [](const std::pair& entry) { + return _google_firestore_v1_Pipeline_Stage_OptionsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second}; + }); + + return result; +} + +google_firestore_v1_Pipeline_Stage LimitStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("limit"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + result.args[0].which_value_type = google_firestore_v1_Value_integer_value_tag; + result.args[0].integer_value = limit_; + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Pipeline_Stage OffsetStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("offset"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + result.args[0].which_value_type = google_firestore_v1_Value_integer_value_tag; + result.args[0].integer_value = offset_; + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Pipeline_Stage SelectStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("select"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + + result.args[0].which_value_type = google_firestore_v1_Value_map_value_tag; + nanopb::SetRepeatedField( + &result.args[0].map_value.fields, &result.args[0].map_value.fields_count, + fields_, [](const std::pair>& entry) { + return _google_firestore_v1_MapValue_FieldsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second->to_proto()}; + }); + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Pipeline_Stage SortStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("sort"); + + result.args_count = static_cast(orders_.size()); + result.args = nanopb::MakeArray(result.args_count); + + for (size_t i = 0; i < orders_.size(); ++i) { + result.args[i] = orders_[i]->to_proto(); + } + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Pipeline_Stage DistinctStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("distinct"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + + result.args[0].which_value_type = google_firestore_v1_Value_map_value_tag; + nanopb::SetRepeatedField( + &result.args[0].map_value.fields, &result.args[0].map_value.fields_count, + groups_, [](const std::pair>& entry) { + return _google_firestore_v1_MapValue_FieldsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second->to_proto()}; + }); + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Pipeline_Stage RemoveFieldsStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("remove_fields"); + + result.args_count = static_cast(fields_.size()); + result.args = nanopb::MakeArray(result.args_count); + + for (size_t i = 0; i < fields_.size(); ++i) { + result.args[i] = fields_[i].to_proto(); + } + + result.options_count = 0; + result.options = nullptr; + return result; +} + +google_firestore_v1_Value ReplaceWith::ReplaceMode::to_proto() const { + google_firestore_v1_Value result; + result.which_value_type = google_firestore_v1_Value_string_value_tag; + switch (mode_) { + case FULL_REPLACE: + result.string_value = nanopb::MakeBytesArray("full_replace"); + break; + case MERGE_PREFER_NEST: + result.string_value = nanopb::MakeBytesArray("merge_prefer_nest"); + break; + } + return result; +} + +google_firestore_v1_Pipeline_Stage ReplaceWith::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("replace_with"); + + result.args_count = 2; + result.args = nanopb::MakeArray(2); + result.args[0] = expr_->to_proto(); + + result.args[1] = mode_.to_proto(); + + result.options_count = 0; + result.options = nullptr; + return result; +} + +ReplaceWith::ReplaceWith(std::shared_ptr expr, ReplaceMode mode) + : expr_(std::move(expr)), mode_(mode) { +} + +google_firestore_v1_Value Sample::SampleMode::to_proto() const { + google_firestore_v1_Value result; + result.which_value_type = google_firestore_v1_Value_string_value_tag; + switch (mode_) { + case DOCUMENTS: + result.string_value = nanopb::MakeBytesArray("documents"); + break; + case PERCENT: + result.string_value = nanopb::MakeBytesArray("percent"); + break; + } + return result; +} + +Sample::Sample(SampleMode mode, int64_t count, double percentage) + : mode_(mode), count_(count), percentage_(percentage) { +} + +google_firestore_v1_Pipeline_Stage Sample::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("sample"); + + result.args_count = 2; + result.args = nanopb::MakeArray(2); + + switch (mode_.mode()) { + case SampleMode::Mode::DOCUMENTS: + result.args[0].which_value_type = + google_firestore_v1_Value_integer_value_tag; + result.args[0].integer_value = count_; + break; + case SampleMode::Mode::PERCENT: + result.args[0].which_value_type = + google_firestore_v1_Value_double_value_tag; + result.args[0].double_value = percentage_; + break; + } + + result.args[1] = mode_.to_proto(); + + result.options_count = 0; + result.options = nullptr; + return result; +} + +Union::Union(std::shared_ptr other) : other_(std::move(other)) { +} + +google_firestore_v1_Pipeline_Stage Union::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("union"); + + result.args_count = 1; + result.args = nanopb::MakeArray(1); + result.args[0] = other_->to_proto(); + + result.options_count = 0; + result.options = nullptr; + return result; +} + +Unnest::Unnest(std::shared_ptr field, + std::shared_ptr alias, + absl::optional> index_field) + : field_(std::move(field)), + alias_(alias), + index_field_(std::move(index_field)) { +} + +google_firestore_v1_Pipeline_Stage Unnest::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray("unnest"); + + result.args_count = 2; + result.args = nanopb::MakeArray(2); + result.args[0] = field_->to_proto(); + result.args[1] = alias_->to_proto(); + + if (index_field_.has_value()) { + result.options_count = 1; + result.options = + nanopb::MakeArray(1); + result.options[0].key = nanopb::MakeBytesArray("index_field"); + result.options[0].value = index_field_.value()->to_proto(); + } else { + result.options_count = 0; + result.options = nullptr; + } + + return result; +} + +RawStage::RawStage( + std::string name, + std::vector params, + std::unordered_map> options) + : name_(std::move(name)), + params_(std::move(params)), + options_(std::move(options)) { +} + +google_firestore_v1_Pipeline_Stage RawStage::to_proto() const { + google_firestore_v1_Pipeline_Stage result; + result.name = nanopb::MakeBytesArray(name_); + + result.args_count = static_cast(params_.size()); + result.args = nanopb::MakeArray(result.args_count); + + for (size_t i = 0; i < result.args_count; i++) { + result.args[i] = params_[i]; + } + + nanopb::SetRepeatedField( + &result.options, &result.options_count, options_, + [](const std::pair>& entry) { + return _google_firestore_v1_Pipeline_Stage_OptionsEntry{ + nanopb::MakeBytesArray(entry.first), entry.second->to_proto()}; + }); + + return result; +} + +} // namespace api +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/api/stages.h b/Firestore/core/src/api/stages.h new file mode 100644 index 00000000000..be0cbf3e68b --- /dev/null +++ b/Firestore/core/src/api/stages.h @@ -0,0 +1,349 @@ +/* + * Copyright 2025 Google LLC + * + * 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_API_STAGES_H_ +#define FIRESTORE_CORE_SRC_API_STAGES_H_ + +#include +#include +#include +#include +#include + +#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" +#include "Firestore/core/src/api/aggregate_expressions.h" +#include "Firestore/core/src/api/api_fwd.h" +#include "Firestore/core/src/api/expressions.h" +#include "Firestore/core/src/api/ordering.h" +#include "Firestore/core/src/nanopb/message.h" +#include "absl/types/optional.h" + +namespace firebase { +namespace firestore { +namespace api { + +class Stage { + public: + Stage() = default; + virtual ~Stage() = default; + + virtual google_firestore_v1_Pipeline_Stage to_proto() const = 0; +}; + +class CollectionSource : public Stage { + public: + explicit CollectionSource(std::string path) : path_(std::move(path)) { + } + ~CollectionSource() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::string path_; +}; + +class DatabaseSource : public Stage { + public: + DatabaseSource() = default; + ~DatabaseSource() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; +}; + +class CollectionGroupSource : public Stage { + public: + explicit CollectionGroupSource(std::string collection_id) + : collection_id_(std::move(collection_id)) { + } + ~CollectionGroupSource() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::string collection_id_; +}; + +class DocumentsSource : public Stage { + public: + explicit DocumentsSource(std::vector documents) + : documents_(std::move(documents)) { + } + ~DocumentsSource() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::vector documents_; +}; + +class AddFields : public Stage { + public: + explicit AddFields( + std::unordered_map> fields) + : fields_(std::move(fields)) { + } + ~AddFields() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::unordered_map> fields_; +}; + +class AggregateStage : public Stage { + public: + AggregateStage( + std::unordered_map> + accumulators, + std::unordered_map> groups) + : accumulators_(std::move(accumulators)), groups_(std::move(groups)) { + } + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::unordered_map> + accumulators_; + std::unordered_map> groups_; +}; + +class Where : public Stage { + public: + explicit Where(std::shared_ptr expr) : expr_(expr) { + } + ~Where() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::shared_ptr expr_; +}; + +class FindNearestStage : public Stage { + public: + class DistanceMeasure { + public: + enum Measure { EUCLIDEAN, COSINE, DOT_PRODUCT }; + + explicit DistanceMeasure(Measure measure) : measure_(measure) { + } + google_firestore_v1_Value proto() const; + + private: + Measure measure_; + }; + + FindNearestStage( + std::shared_ptr property, + nanopb::SharedMessage vector, + DistanceMeasure distance_measure, + std::unordered_map options) + : property_(std::move(property)), + vector_(std::move(vector)), + distance_measure_(distance_measure), + options_(std::move(options)) { + } + + ~FindNearestStage() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::shared_ptr property_; + nanopb::SharedMessage vector_; + DistanceMeasure distance_measure_; + std::unordered_map options_; +}; + +class LimitStage : public Stage { + public: + explicit LimitStage(int32_t limit) : limit_(limit) { + } + ~LimitStage() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + int32_t limit_; +}; + +class OffsetStage : public Stage { + public: + explicit OffsetStage(int64_t offset) : offset_(offset) { + } + ~OffsetStage() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + int64_t offset_; +}; + +class SelectStage : public Stage { + public: + explicit SelectStage( + std::unordered_map> fields) + : fields_(std::move(fields)) { + } + ~SelectStage() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::unordered_map> fields_; +}; + +class SortStage : public Stage { + public: + explicit SortStage(std::vector> orders) + : orders_(std::move(orders)) { + } + ~SortStage() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::vector> orders_; +}; + +class DistinctStage : public Stage { + public: + explicit DistinctStage( + std::unordered_map> groups) + : groups_(std::move(groups)) { + } + ~DistinctStage() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::unordered_map> groups_; +}; + +class RemoveFieldsStage : public Stage { + public: + explicit RemoveFieldsStage(std::vector fields) + : fields_(std::move(fields)) { + } + ~RemoveFieldsStage() override = default; + + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::vector fields_; +}; + +class ReplaceWith : public Stage { + public: + class ReplaceMode { + public: + enum Mode { + FULL_REPLACE, + MERGE_PREFER_NEST, + MERGE_PREFER_PARENT = FULL_REPLACE + }; + + explicit ReplaceMode(Mode mode) : mode_(mode) { + } + google_firestore_v1_Value to_proto() const; + + private: + Mode mode_; + }; + + explicit ReplaceWith( + std::shared_ptr expr, + ReplaceMode mode = ReplaceMode(ReplaceMode::Mode::FULL_REPLACE)); + ~ReplaceWith() override = default; + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::shared_ptr expr_; + ReplaceMode mode_; +}; + +class Sample : public Stage { + public: + class SampleMode { + public: + enum Mode { DOCUMENTS = 0, PERCENT }; + + explicit SampleMode(Mode mode) : mode_(mode) { + } + + Mode mode() const { + return mode_; + } + + google_firestore_v1_Value to_proto() const; + + private: + Mode mode_; + }; + + Sample(SampleMode mode, int64_t count, double percentage); + ~Sample() override = default; + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + SampleMode mode_; + int64_t count_; + double percentage_; +}; + +class Union : public Stage { + public: + explicit Union(std::shared_ptr other); + ~Union() override = default; + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::shared_ptr other_; +}; + +class Unnest : public Stage { + public: + Unnest(std::shared_ptr field, + std::shared_ptr alias, + absl::optional> index_field); + ~Unnest() override = default; + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::shared_ptr field_; + std::shared_ptr alias_; + absl::optional> index_field_; +}; + +class RawStage : public Stage { + public: + RawStage(std::string name, + std::vector params, + std::unordered_map> options); + ~RawStage() override = default; + google_firestore_v1_Pipeline_Stage to_proto() const override; + + private: + std::string name_; + std::vector params_; + std::unordered_map> options_; +}; + +} // namespace api +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_API_STAGES_H_ diff --git a/Firestore/core/src/core/firestore_client.cc b/Firestore/core/src/core/firestore_client.cc index c6dd50634c1..0c6ac315dea 100644 --- a/Firestore/core/src/core/firestore_client.cc +++ b/Firestore/core/src/core/firestore_client.cc @@ -575,6 +575,25 @@ void FirestoreClient::RunAggregateQuery( }); } +void FirestoreClient::RunPipeline( + const api::Pipeline& pipeline, + util::StatusOrCallback callback) { + VerifyNotTerminated(); + + // Dispatch the result back onto the user dispatch queue. + auto async_callback = + [this, callback](const StatusOr& status) { + if (callback) { + user_executor_->Execute([=] { callback(std::move(status)); }); + } + }; + + worker_queue_->Enqueue( + [this, pipeline, async_callback = std::move(async_callback)] { + remote_store_->RunPipeline(pipeline, async_callback); + }); +} + void FirestoreClient::AddSnapshotsInSyncListener( const std::shared_ptr>& user_listener) { worker_queue_->Enqueue([this, user_listener] { diff --git a/Firestore/core/src/core/firestore_client.h b/Firestore/core/src/core/firestore_client.h index d752deff66a..24c0e8c396a 100644 --- a/Firestore/core/src/core/firestore_client.h +++ b/Firestore/core/src/core/firestore_client.h @@ -23,6 +23,7 @@ #include "Firestore/core/src/api/api_fwd.h" #include "Firestore/core/src/api/load_bundle_task.h" +#include "Firestore/core/src/api/pipeline.h" #include "Firestore/core/src/bundle/bundle_serializer.h" #include "Firestore/core/src/core/core_fwd.h" #include "Firestore/core/src/core/database_info.h" @@ -159,6 +160,9 @@ class FirestoreClient : public std::enable_shared_from_this { const std::vector& aggregates, api::AggregateQueryCallback&& result_callback); + void RunPipeline(const api::Pipeline& pipeline, + util::StatusOrCallback callback); + /** * Adds a listener to be called when a snapshots-in-sync event fires. */ diff --git a/Firestore/core/src/nanopb/fields_array.h b/Firestore/core/src/nanopb/fields_array.h index 3b89b2ecd06..29fdc1c66dd 100644 --- a/Firestore/core/src/nanopb/fields_array.h +++ b/Firestore/core/src/nanopb/fields_array.h @@ -227,6 +227,18 @@ inline const pb_field_t* FieldsArray< return google_firestore_v1_StructuredAggregationQuery_Aggregation_Count_fields; } +template <> +inline const pb_field_t* +FieldsArray() { + return google_firestore_v1_ExecutePipelineRequest_fields; +} + +template <> +inline const pb_field_t* +FieldsArray() { + return google_firestore_v1_ExecutePipelineResponse_fields; +} + template <> inline const pb_field_t* FieldsArray() { return google_firestore_v1_ExistenceFilter_fields; diff --git a/Firestore/core/src/remote/datastore.cc b/Firestore/core/src/remote/datastore.cc index 47a8fb716b5..504beadbd99 100644 --- a/Firestore/core/src/remote/datastore.cc +++ b/Firestore/core/src/remote/datastore.cc @@ -63,6 +63,8 @@ const auto kRpcNameCommit = "/google.firestore.v1.Firestore/Commit"; const auto kRpcNameLookup = "/google.firestore.v1.Firestore/BatchGetDocuments"; const auto kRpcNameRunAggregationQuery = "/google.firestore.v1.Firestore/RunAggregationQuery"; +const auto kRpcNameExecutePipeline = + "/google.firestore.v1.Firestore/ExecutePipeline"; std::unique_ptr CreateExecutor() { return Executor::CreateSerial("com.google.firebase.firestore.rpc"); @@ -308,6 +310,54 @@ void Datastore::RunAggregateQueryWithCredentials( }); } +void Datastore::RunPipeline( + const api::Pipeline& pipeline, + util::StatusOrCallback&& result_callback) { + ResumeRpcWithCredentials( + [this, pipeline, result_callback = std::move(result_callback)]( + const StatusOr& auth_token, + const std::string& app_check_token) mutable { + if (!auth_token.ok()) { + // result_callback(auth_token.status()); + return; + } + RunPipelineWithCredentials(auth_token.ValueOrDie(), app_check_token, + pipeline, std::move(result_callback)); + }); +} + +void Datastore::RunPipelineWithCredentials( + const credentials::AuthToken& auth_token, + const std::string& app_check_token, + const api::Pipeline& pipeline, + util::StatusOrCallback&& callback) { + auto request = datastore_serializer_.EncodeExecutePipelineRequest(pipeline); + LOG_DEBUG("Run Pipeline: %s", request.ToString()); + + grpc::ByteBuffer message = MakeByteBuffer(request); + std::unique_ptr call_owning = grpc_connection_.CreateUnaryCall( + kRpcNameExecutePipeline, auth_token, app_check_token, std::move(message)); + GrpcUnaryCall* call = call_owning.get(); + active_calls_.push_back(std::move(call_owning)); + + call->Start( + [this, db = pipeline.firestore(), call, callback = std::move(callback)]( + const StatusOr& result) { + LogGrpcCallFinished("ExecutePipeline", call, result.status()); + HandleCallStatus(result.status()); + + if (result.ok()) { + auto response = datastore_serializer_.DecodeExecutePipelineResponse( + result.ValueOrDie(), std::move(db)); + callback(response); + } else { + callback(result.status()); + } + + RemoveGrpcCall(call); + }); +} + void Datastore::ResumeRpcWithCredentials(const OnCredentials& on_credentials) { // Auth/AppCheck may outlive Firestore std::weak_ptr weak_this{shared_from_this()}; diff --git a/Firestore/core/src/remote/datastore.h b/Firestore/core/src/remote/datastore.h index 7de64663d11..df912159eef 100644 --- a/Firestore/core/src/remote/datastore.h +++ b/Firestore/core/src/remote/datastore.h @@ -23,6 +23,7 @@ #include #include "Firestore/core/src/api/api_fwd.h" +#include "Firestore/core/src/api/pipeline.h" #include "Firestore/core/src/core/core_fwd.h" #include "Firestore/core/src/credentials/auth_token.h" #include "Firestore/core/src/credentials/credentials_fwd.h" @@ -112,6 +113,10 @@ class Datastore : public std::enable_shared_from_this { const std::vector& aggregates, api::AggregateQueryCallback&& result_callback); + void RunPipeline( + const api::Pipeline& pipeline, + util::StatusOrCallback&& result_callback); + /** Returns true if the given error is a gRPC ABORTED error. */ static bool IsAbortedError(const util::Status& error); @@ -195,6 +200,12 @@ class Datastore : public std::enable_shared_from_this { const std::vector& aggregates, api::AggregateQueryCallback&& callback); + void RunPipelineWithCredentials( + const credentials::AuthToken& auth_token, + const std::string& app_check_token, + const api::Pipeline& pipeline, + util::StatusOrCallback&& result_callback); + using OnCredentials = std::function&, const std::string&)>; void ResumeRpcWithCredentials(const OnCredentials& on_credentials); diff --git a/Firestore/core/src/remote/remote_objc_bridge.cc b/Firestore/core/src/remote/remote_objc_bridge.cc index ae7fcb246ea..6cc675d4f7f 100644 --- a/Firestore/core/src/remote/remote_objc_bridge.cc +++ b/Firestore/core/src/remote/remote_objc_bridge.cc @@ -33,6 +33,7 @@ #include "Firestore/core/src/remote/grpc_util.h" #include "Firestore/core/src/remote/watch_change.h" #include "Firestore/core/src/util/hard_assert.h" +#include "Firestore/core/src/util/log.h" #include "Firestore/core/src/util/status.h" #include "Firestore/core/src/util/statusor.h" #include "grpcpp/support/status.h" @@ -383,6 +384,41 @@ util::StatusOr DatastoreSerializer::DecodeAggregateQueryResponse( aliasMap); } +Message +DatastoreSerializer::EncodeExecutePipelineRequest( + const firebase::firestore::api::Pipeline& pipeline) const { + Message result; + result->database = serializer_.EncodeDatabaseName(); + result->which_pipeline_type = + google_firestore_v1_ExecutePipelineRequest_structured_pipeline_tag; + result->pipeline_type.structured_pipeline = + serializer_.EncodePipeline(pipeline); + + return result; +} + +util::StatusOr +DatastoreSerializer::DecodeExecutePipelineResponse( + const grpc::ByteBuffer& response, + std::shared_ptr db) const { + ByteBufferReader reader{response}; + auto message = + Message::TryParse(&reader); + if (!reader.ok()) { + return reader.status(); + } + + LOG_DEBUG("Pipeline Response: %s", message.ToString()); + + auto snapshot = serializer_.DecodePipelineResponse(reader.context(), message); + if (!reader.ok()) { + return reader.status(); + } + + snapshot.SetFirestore(std::move(db)); + return snapshot; +} + } // namespace remote } // namespace firestore } // namespace firebase diff --git a/Firestore/core/src/remote/remote_objc_bridge.h b/Firestore/core/src/remote/remote_objc_bridge.h index 0aa2b93f988..96329c1ae25 100644 --- a/Firestore/core/src/remote/remote_objc_bridge.h +++ b/Firestore/core/src/remote/remote_objc_bridge.h @@ -32,6 +32,7 @@ #include "Firestore/core/src/util/status_fwd.h" #include "grpcpp/support/byte_buffer.h" +#include "Firestore/core/src/api/pipeline.h" #include "absl/container/flat_hash_map.h" namespace firebase { @@ -150,6 +151,14 @@ class DatastoreSerializer { return serializer_; } + nanopb::Message + EncodeExecutePipelineRequest( + const firebase::firestore::api::Pipeline& pipeline) const; + + util::StatusOr DecodeExecutePipelineResponse( + const grpc::ByteBuffer& response, + std::shared_ptr db) const; + private: Serializer serializer_; }; diff --git a/Firestore/core/src/remote/remote_store.cc b/Firestore/core/src/remote/remote_store.cc index 86455fcd15e..1bf4370240b 100644 --- a/Firestore/core/src/remote/remote_store.cc +++ b/Firestore/core/src/remote/remote_store.cc @@ -390,6 +390,17 @@ void RemoteStore::RunAggregateQuery( } } +void RemoteStore::RunPipeline( + const api::Pipeline& pipeline, + util::StatusOrCallback result_callback) { + if (CanUseNetwork()) { + datastore_->RunPipeline(pipeline, std::move(result_callback)); + } else { + result_callback(Status::FromErrno(Error::kErrorUnavailable, + "Failed to get result from server.")); + } +} + // Write Stream void RemoteStore::FillWritePipeline() { diff --git a/Firestore/core/src/remote/remote_store.h b/Firestore/core/src/remote/remote_store.h index ae6bd7023bc..cd0d7b8e7ca 100644 --- a/Firestore/core/src/remote/remote_store.h +++ b/Firestore/core/src/remote/remote_store.h @@ -21,6 +21,7 @@ #include #include +#include "Firestore/core/src/api/pipeline.h" #include "Firestore/core/src/core/transaction.h" #include "Firestore/core/src/local/target_data.h" #include "Firestore/core/src/model/model_fwd.h" @@ -203,6 +204,9 @@ class RemoteStore : public TargetMetadataProvider, const std::vector& aggregates, api::AggregateQueryCallback&& result_callback); + void RunPipeline(const api::Pipeline& pipeline, + util::StatusOrCallback callback); + void OnWatchStreamOpen() override; void OnWatchStreamChange( const WatchChange& change, diff --git a/Firestore/core/src/remote/serializer.cc b/Firestore/core/src/remote/serializer.cc index f301a65e37f..889767b84ee 100644 --- a/Firestore/core/src/remote/serializer.cc +++ b/Firestore/core/src/remote/serializer.cc @@ -175,6 +175,15 @@ FieldPath InvalidFieldPath() { return FieldPath::EmptyPath(); } +absl::optional NotNoneVersionOrNullOpt( + const SnapshotVersion& version) { + if (version == SnapshotVersion::None()) { + return absl::nullopt; + } else { + return version; + } +} + } // namespace Serializer::Serializer(DatabaseId database_id) @@ -1197,6 +1206,18 @@ Serializer::DecodeCursorValue(google_firestore_v1_Cursor& cursor) const { return index_components; } +google_firestore_v1_StructuredPipeline Serializer::EncodePipeline( + const api::Pipeline& pipeline) const { + google_firestore_v1_StructuredPipeline result; + + result.pipeline = pipeline.to_proto().pipeline_value; + + result.options_count = 0; + result.options = nullptr; + + return result; +} + /* static */ pb_bytes_array_t* Serializer::EncodeFieldPath(const FieldPath& field_path) { return EncodeString(field_path.CanonicalString()); @@ -1479,6 +1500,36 @@ bool Serializer::IsLocalDocumentKey(absl::string_view path) const { DocumentKey::IsDocumentKey(resource.PopFirst(5)); } +api::PipelineSnapshot Serializer::DecodePipelineResponse( + util::ReadContext* context, + const nanopb::Message& message) + const { + auto execution_time = DecodeVersion(context, message->execution_time); + + std::vector results; + results.reserve(message->results_count); + + for (pb_size_t i = 0; i < message->results_count; ++i) { + absl::optional key; + if (message->results[i].name != nullptr) { + key = DecodeKey(context, message->results[i].name); + } + + auto create_time = DecodeVersion(context, message->results[i].create_time); + auto update_time = DecodeVersion(context, message->results[i].update_time); + + auto value = ObjectValue::FromFieldsEntry(message->results[i].fields, + message->results[i].fields_count); + results.push_back({std::move(key), + std::make_shared(std::move(value)), + NotNoneVersionOrNullOpt(create_time), + NotNoneVersionOrNullOpt(update_time), + NotNoneVersionOrNullOpt(execution_time)}); + } + + return api::PipelineSnapshot(std::move(results), execution_time); +} + } // namespace remote } // namespace firestore } // namespace firebase diff --git a/Firestore/core/src/remote/serializer.h b/Firestore/core/src/remote/serializer.h index c42c6c3ac1b..2105b7eb754 100644 --- a/Firestore/core/src/remote/serializer.h +++ b/Firestore/core/src/remote/serializer.h @@ -28,6 +28,7 @@ #include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h" #include "Firestore/Protos/nanopb/google/firestore/v1/firestore.nanopb.h" #include "Firestore/Protos/nanopb/google/type/latlng.nanopb.h" +#include "Firestore/core/src/api/pipeline.h" #include "Firestore/core/src/core/composite_filter.h" #include "Firestore/core/src/core/core_fwd.h" #include "Firestore/core/src/core/field_filter.h" @@ -204,6 +205,9 @@ class Serializer { pb_bytes_array_t* parent, google_firestore_v1_StructuredQuery& query) const; + google_firestore_v1_StructuredPipeline EncodePipeline( + const api::Pipeline& pipeline) const; + /** * Decodes the watch change. Modifies the provided proto to release * ownership of any Value messages. @@ -241,6 +245,11 @@ class Serializer { return database_id_; } + api::PipelineSnapshot DecodePipelineResponse( + util::ReadContext* context, + const nanopb::Message& + message) const; + private: friend class SerializerTest;