From 76f0fa13171556935dd955bf46c3e5ad9f4bb96d Mon Sep 17 00:00:00 2001 From: Civitaspo Date: Fri, 8 Sep 2017 21:36:26 +0900 Subject: [PATCH] Support type conversion from floating point numbers to integers Fix #32 --- .../expand_json/FilteredPageOutput.java | 8 ++- .../TestExpandJsonFilterPlugin.java | 49 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/embulk/filter/expand_json/FilteredPageOutput.java b/src/main/java/org/embulk/filter/expand_json/FilteredPageOutput.java index afb2884..1148e54 100644 --- a/src/main/java/org/embulk/filter/expand_json/FilteredPageOutput.java +++ b/src/main/java/org/embulk/filter/expand_json/FilteredPageOutput.java @@ -329,7 +329,13 @@ else if (Types.LONG.equals(expandedJsonColumn.getColumn().getType())) { pageBuilder.setLong(expandedJsonColumn.getColumn(), Long.parseLong(finalValue)); } catch (NumberFormatException e) { - throw new JsonValueInvalidException(String.format("Failed to parse '%s' as long", finalValue), e); + // ad-hoc workaround for exponential notation + try { + pageBuilder.setLong(expandedJsonColumn.getColumn(), (long) Double.parseDouble(finalValue)); + } + catch (NumberFormatException e2) { + throw new JsonValueInvalidException(String.format("Failed to parse '%s' as long", finalValue), e); + } } } else if (Types.TIMESTAMP.equals(expandedJsonColumn.getColumn().getType())) { diff --git a/src/test/java/org/embulk/filter/expand_json/TestExpandJsonFilterPlugin.java b/src/test/java/org/embulk/filter/expand_json/TestExpandJsonFilterPlugin.java index 50eb2c6..9d7231d 100644 --- a/src/test/java/org/embulk/filter/expand_json/TestExpandJsonFilterPlugin.java +++ b/src/test/java/org/embulk/filter/expand_json/TestExpandJsonFilterPlugin.java @@ -966,6 +966,55 @@ public void run(TaskSource taskSource, Schema outputSchema) }); } + @Test + public void testParseNumbersInExponentialNotation() + { + final String configYaml = "" + + "type: expand_json\n" + + "json_column_name: _c1\n" + + "root: $.\n" + + "expanded_columns:\n" + + " - {name: _j0, type: double}\n" + + " - {name: _j1, type: long}\n"; + ConfigSource config = getConfigFromYaml(configYaml); + final Schema schema = schema("_c1", STRING); + + expandJsonFilterPlugin.transaction(config, schema, new Control() + { + @Override + public void run(TaskSource taskSource, Schema outputSchema) + { + MockPageOutput mockPageOutput = new MockPageOutput(); + + String doubleFloatingPoint = "-1.234e-5"; + double doubleFixedPoint = -0.00001234; // Use in Asserting. + String longFloatingPoint = "12345e3"; + long longFixedPoint = 12_345_000L; // Use in Asserting. + + String data = String.format( + "{\"_j0\":%s, \"_j1\":%s}", + doubleFloatingPoint, + longFloatingPoint); + + try (PageOutput pageOutput = expandJsonFilterPlugin.open(taskSource, schema, outputSchema, mockPageOutput)) { + for (Page page : PageTestUtils.buildPage(runtime.getBufferAllocator(), schema, data, c1Data)) { + pageOutput.add(page); + } + + pageOutput.finish(); + } + + PageReader pageReader = new PageReader(outputSchema); + + for (Page page : mockPageOutput.pages) { + pageReader.setPage(page); + assertEquals(doubleFixedPoint, pageReader.getDouble(outputSchema.getColumn(0)), 0.0); + assertEquals(longFixedPoint, pageReader.getLong(outputSchema.getColumn(1))); + } + } + }); + } + private static Schema schema(Object... nameAndTypes) { Schema.Builder builder = Schema.builder();