Skip to content

Commit 69e9255

Browse files
committed
fix replacewith bug
1 parent 3a5ce84 commit 69e9255

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

Firestore/Swift/Tests/Integration/PipelineTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1266,7 +1266,7 @@ class PipelineIntegrationTests: FSTIntegrationTestCase {
12661266

12671267
// Need to use nullable Sendable for comparison because 'others' is nested
12681268
// and the areEqual function handles Sendable?
1269-
expectSnapshots(snapshot: snapshot, expected: [expectedBook1Transformed as [String: Sendable]])
1269+
expectSnapshots(snapshot: snapshot, expected: [expectedBook1Transformed])
12701270
}
12711271

12721272
// MARK: - Sample Stage Tests

Firestore/core/src/api/stages.cc

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,20 +306,37 @@ google_firestore_v1_Pipeline_Stage RemoveFieldsStage::to_proto() const {
306306
return result;
307307
}
308308

309+
google_firestore_v1_Value ReplaceWith::ReplaceMode::to_proto() const {
310+
google_firestore_v1_Value result;
311+
result.which_value_type = google_firestore_v1_Value_string_value_tag;
312+
switch (mode_) {
313+
case FULL_REPLACE:
314+
result.string_value = nanopb::MakeBytesArray("full_replace");
315+
break;
316+
case MERGE_PREFER_NEST:
317+
result.string_value = nanopb::MakeBytesArray("merge_prefer_nest");
318+
break;
319+
}
320+
return result;
321+
}
322+
309323
google_firestore_v1_Pipeline_Stage ReplaceWith::to_proto() const {
310324
google_firestore_v1_Pipeline_Stage result;
311325
result.name = nanopb::MakeBytesArray("replace_with");
312326

313-
result.args_count = 1;
314-
result.args = nanopb::MakeArray<google_firestore_v1_Value>(1);
327+
result.args_count = 2;
328+
result.args = nanopb::MakeArray<google_firestore_v1_Value>(2);
315329
result.args[0] = expr_->to_proto();
316330

331+
result.args[1] = mode_.to_proto();
332+
317333
result.options_count = 0;
318334
result.options = nullptr;
319335
return result;
320336
}
321337

322-
ReplaceWith::ReplaceWith(std::shared_ptr<Expr> expr) : expr_(std::move(expr)) {
338+
ReplaceWith::ReplaceWith(std::shared_ptr<Expr> expr, ReplaceMode mode)
339+
: expr_(std::move(expr)), mode_(mode) {
323340
}
324341

325342
Sample::Sample(std::string type, int64_t count, double percentage)

Firestore/core/src/api/stages.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,31 @@ class RemoveFieldsStage : public Stage {
252252

253253
class ReplaceWith : public Stage {
254254
public:
255-
explicit ReplaceWith(std::shared_ptr<Expr> expr);
255+
class ReplaceMode {
256+
public:
257+
enum Mode {
258+
FULL_REPLACE,
259+
MERGE_PREFER_NEST,
260+
MERGE_PREFER_PARENT = FULL_REPLACE
261+
};
262+
263+
explicit ReplaceMode(Mode mode) : mode_(mode) {
264+
}
265+
google_firestore_v1_Value to_proto() const;
266+
267+
private:
268+
Mode mode_;
269+
};
270+
271+
explicit ReplaceWith(
272+
std::shared_ptr<Expr> expr,
273+
ReplaceMode mode = ReplaceMode(ReplaceMode::Mode::FULL_REPLACE));
256274
~ReplaceWith() override = default;
257275
google_firestore_v1_Pipeline_Stage to_proto() const override;
258276

259277
private:
260278
std::shared_ptr<Expr> expr_;
279+
ReplaceMode mode_;
261280
};
262281

263282
class Sample : public Stage {

0 commit comments

Comments
 (0)