Skip to content

Commit 6523c19

Browse files
authored
Update FieldMasks utility to properly handle wrapper types. (#16)
1 parent 351938f commit 6523c19

6 files changed

Lines changed: 236 additions & 15 deletions

File tree

google-ads/src/main/java/com/google/ads/googleads/lib/utils/FieldMasks.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,22 +133,24 @@ private static String getFieldName(String currentField, FieldDescriptor field) {
133133
/**
134134
* Recursively add field names for a new message. Repeated fields, primitive fields and
135135
* unpopulated single message fields are included just by name; populated single message fields
136-
* are processed recursively, only including leaf nodes.
136+
* are processed recursively, only including leaf nodes. For wrapper types, the 'value' leaf
137+
* node is excluded.
137138
*/
138139
private static void addNewFields(FieldMask.Builder mask, String currentField, Message message) {
139140
Descriptor descriptor = message.getDescriptorForType();
140-
for (FieldDescriptor field : descriptor.getFields()) {
141-
String name = getFieldName(currentField, field);
142-
// For single message fields, recurse if there's a value; otherwise just add the field name.
143-
if (!field.isRepeated() && field.getType() == Type.MESSAGE) {
144-
Message value = (Message) message.getField(field);
145-
if (message.hasField(field)) {
141+
if (isWrapperType(descriptor)) {
142+
// For wrapper types, don't recurse over the fields of the message.
143+
mask.addPaths(currentField);
144+
} else {
145+
for (FieldDescriptor field : descriptor.getFields()) {
146+
String name = getFieldName(currentField, field);
147+
// For single message fields, recurse if there's a value; otherwise just add the field name.
148+
if (!field.isRepeated() && field.getType() == Type.MESSAGE && message.hasField(field)) {
149+
Message value = (Message) message.getField(field);
146150
addNewFields(mask, name, value);
147151
} else {
148152
mask.addPaths(name);
149153
}
150-
} else {
151-
mask.addPaths(name);
152154
}
153155
}
154156
}

google-ads/src/test/java/com/google/ads/googleads/test/Bar.java

Lines changed: 181 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

google-ads/src/test/java/com/google/ads/googleads/test/BarOrBuilder.java

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

google-ads/src/test/java/com/google/ads/googleads/test/TestSuiteProto.java

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

google-ads/src/test/proto/google/ads/googleads/test/tester.proto

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ message Foo {
3535

3636
message Bar {
3737
int64 num = 1;
38-
}
38+
google.protobuf.BoolValue nested_wrapper = 2;
39+
}

google-ads/src/test/resources/testdata/test_cases.textproto

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,26 @@ test_cases {
150150
}
151151
expected_mask {
152152
}
153-
}
153+
}
154+
155+
# Create message with nested wrapper
156+
test_cases {
157+
description: "Create message with nested wrapper"
158+
original_resource {
159+
}
160+
modified_resource {
161+
foo {
162+
bar {
163+
nested_wrapper {
164+
value: true
165+
}
166+
}
167+
}
168+
}
169+
expected_mask {
170+
paths: "foo.num"
171+
paths: "foo.bar.num"
172+
paths: "foo.bar.nested_wrapper"
173+
paths: "foo.bars"
174+
}
175+
}

0 commit comments

Comments
 (0)