diff --git a/src/main/java/org/embulk/input/google_ads/GoogleAdsReporter.java b/src/main/java/org/embulk/input/google_ads/GoogleAdsReporter.java index efd65bb..7894e8f 100644 --- a/src/main/java/org/embulk/input/google_ads/GoogleAdsReporter.java +++ b/src/main/java/org/embulk/input/google_ads/GoogleAdsReporter.java @@ -37,6 +37,9 @@ import java.util.List; import java.util.Map; import java.util.HashMap; +import java.util.HashSet; +import java.util.Arrays; +import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -119,6 +122,10 @@ public String convertLeafNodeValue(Map fiel return convertMessageType(key, fields); } else if (key.getType() == Descriptors.FieldDescriptor.Type.ENUM) { return convertEnumType(key, fields); + } else if (isDoubleType(key.getJavaType())) { + return convertNumericType(key, fields, Double.class); + } else if (isLongType(key.getJavaType())) { + return convertNumericType(key, fields, Long.class); } return convertNonMessageType(key, fields); } @@ -159,6 +166,35 @@ public String convertNonMessageType(Descriptors.FieldDescriptor key, Map String convertNumericType(Descriptors.FieldDescriptor key, Map fields, Class type) + { + if (type != Long.class && type != Double.class) { + throw new IllegalArgumentException("Unsupported type: " + type); + } + + if (key.isRepeated()) { + List values = (List) fields.get(key); + ArrayNode arrayNode = mapper.createArrayNode(); + if (type == Long.class) { + for (Long val : (List) values) { + arrayNode.add(val); + } + } else { + for (Double val : (List) values) { + arrayNode.add(val); + } + } + + try { + return mapper.writeValueAsString(arrayNode); + } catch (JsonProcessingException ignored) { + return null; + } + } + + return String.valueOf(fields.get(key)); + } + public String convertMessageType(Descriptors.FieldDescriptor key, Map fields) { if (key.isRepeated()) { @@ -387,4 +423,24 @@ private String buildWhereClauseConditionsForChangeEvent(String startDateTime) return dateSb.toString(); } + + private boolean isDoubleType(Descriptors.FieldDescriptor.JavaType type) + { + Set javaTypeNumber = new HashSet<>(Arrays.asList( + Descriptors.FieldDescriptor.JavaType.FLOAT.name(), + Descriptors.FieldDescriptor.JavaType.DOUBLE.name() + )); + + return javaTypeNumber.contains(type.name()); + } + + private boolean isLongType(Descriptors.FieldDescriptor.JavaType type) + { + Set javaTypeNumber = new HashSet<>(Arrays.asList( + Descriptors.FieldDescriptor.JavaType.INT.name(), + Descriptors.FieldDescriptor.JavaType.LONG.name() + )); + + return javaTypeNumber.contains(type.name()); + } }