Skip to content

Commit 93aadd0

Browse files
Merge pull request #62 from data-integrations/bugfix/PLUGIN-605-Null-handling-for-transformer
Allow null values for source if schema allows it
2 parents da48751 + ba20d6b commit 93aadd0

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

src/main/java/io/cdap/plugin/salesforce/plugin/source/batch/MapToRecordTransformer.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@ private void transformRecord(Schema schema, Map<String, ?> record, StructuredRec
5252

5353
private Object convertValue(String fieldName, Object value, Schema fieldSchema) {
5454
if (fieldSchema.isNullable()) {
55-
return convertValue(fieldName, value, fieldSchema.getNonNullable());
55+
return value == null ? null : convertValue(fieldName, value, fieldSchema.getNonNullable());
56+
}
57+
58+
if (value == null) {
59+
throw new RuntimeException(
60+
String.format("Found null value for non nullable field %s", fieldName));
5661
}
5762

5863
Schema.Type fieldSchemaType = fieldSchema.getType();

src/test/java/io/cdap/plugin/salesforce/plugin/source/batch/MapToRecordTransformerTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.time.ZoneOffset;
2727
import java.time.ZonedDateTime;
2828
import java.time.format.DateTimeFormatter;
29+
import java.util.HashMap;
2930
import java.util.List;
3031
import java.util.Map;
3132

@@ -92,4 +93,30 @@ public void testTransform() {
9293
Assert.assertEquals(ZonedDateTime.parse(arrayField.get(0).get("nested_timestamp"), DateTimeFormatter.ISO_DATE_TIME),
9394
arrayRecord.get(0).getTimestamp("nested_timestamp", ZoneOffset.UTC));
9495
}
96+
97+
@Test
98+
public void testNullableFields() {
99+
Schema schema = Schema.recordOf("output",
100+
Schema.Field.of("string_field", Schema.nullableOf(Schema.of(Schema.Type.STRING))),
101+
Schema.Field.of("double_field", Schema.nullableOf(Schema.of(Schema.Type.DOUBLE))));
102+
Map<String, Object> records = new HashMap<>();
103+
records.put("string_field", null);
104+
records.put("double_field", null);
105+
MapToRecordTransformer recordTransformer = new MapToRecordTransformer();
106+
StructuredRecord structuredRecord = recordTransformer.transform(schema, records);
107+
Assert.assertNull(structuredRecord.get("string_field"));
108+
Assert.assertNull(structuredRecord.get("double_field"));
109+
}
110+
111+
@Test(expected = RuntimeException.class)
112+
public void testNonNullableFieldWithNull() {
113+
Schema schema = Schema.recordOf("output",
114+
Schema.Field.of("string_field", Schema.nullableOf(Schema.of(Schema.Type.STRING))),
115+
Schema.Field.of("double_field", Schema.of(Schema.Type.DOUBLE)));
116+
Map<String, Object> records = new HashMap<>();
117+
records.put("string_field", "");
118+
records.put("double_field", null);
119+
MapToRecordTransformer recordTransformer = new MapToRecordTransformer();
120+
recordTransformer.transform(schema, records);
121+
}
95122
}

src/test/java/io/cdap/plugin/salesforce/plugin/source/batch/SalesforceBulkRecordReaderTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.common.collect.ImmutableMap;
2020
import io.cdap.cdap.api.data.format.StructuredRecord;
2121
import io.cdap.cdap.api.data.schema.Schema;
22+
import io.cdap.plugin.salesforce.SalesforceSchemaUtil;
2223
import org.junit.Assert;
2324
import org.junit.Test;
2425

@@ -86,7 +87,9 @@ public void testUTF8InKeysAndValues() throws Exception {
8687

8788
Schema schema = Schema.recordOf("output",
8889
Schema.Field.of("Id", Schema.of(Schema.Type.STRING)),
89-
Schema.Field.of("IsDeleted\u0628\u0633\u0645", Schema.of(Schema.Type.BOOLEAN)),
90+
Schema.Field
91+
.of(SalesforceSchemaUtil.normalizeAvroName("IsDeleted\u0628\u0633\u0645"),
92+
Schema.of(Schema.Type.BOOLEAN)),
9093
Schema.Field.of("ExpectedRevenue", Schema.of(Schema.Type.DOUBLE)),
9194
Schema.Field.of("LastModifiedDate", Schema.of(Schema.LogicalType.TIMESTAMP_MICROS)),
9295
Schema.Field.of("CloseDate", Schema.of(Schema.LogicalType.DATE))
@@ -95,23 +98,23 @@ public void testUTF8InKeysAndValues() throws Exception {
9598
List<Map<String, Object>> expectedRecords = new ImmutableList.Builder<Map<String, Object>>()
9699
.add(new ImmutableMap.Builder<String, Object>()
97100
.put("Id", "0061i000003XNcBAAW\u0628\u0633\u0645")
98-
.put("IsDeleted\u0628\u0633\u0645", false)
101+
.put(SalesforceSchemaUtil.normalizeAvroName("IsDeleted\u0628\u0633\u0645"), false)
99102
.put("ExpectedRevenue", 1500.0)
100103
.put("LastModifiedDate", 1550819001000000L)
101104
.put("CloseDate", 17897)
102105
.build()
103106
)
104107
.add(new ImmutableMap.Builder<String, Object>()
105108
.put("Id", "0061i000003XNcCAAW")
106-
.put("IsDeleted\u0628\u0633\u0645", false)
109+
.put(SalesforceSchemaUtil.normalizeAvroName("IsDeleted\u0628\u0633\u0645"), false)
107110
.put("ExpectedRevenue", 112500.0)
108111
.put("LastModifiedDate", 1550819001000000L)
109112
.put("CloseDate", 17885)
110113
.build()
111114
)
112115
.add(new ImmutableMap.Builder<String, Object>()
113116
.put("Id", "0061i000003XNcDAAW")
114-
.put("IsDeleted\u0628\u0633\u0645", false)
117+
.put(SalesforceSchemaUtil.normalizeAvroName("IsDeleted\u0628\u0633\u0645"), false)
115118
.put("ExpectedRevenue", 220000.0)
116119
.put("LastModifiedDate", 1550819001000000L)
117120
.put("CloseDate", 17850)

0 commit comments

Comments
 (0)