embulk-output-kintone 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -1
  3. data/build.gradle +1 -0
  4. data/classpath/commons-csv-1.9.0.jar +0 -0
  5. data/classpath/embulk-output-kintone-1.2.0.jar +0 -0
  6. data/classpath/externalsortinginjava-0.6.2.jar +0 -0
  7. data/classpath/{shadow-kintone-java-client-1.0.0-all.jar → shadow-kintone-java-client-1.2.0-all.jar} +0 -0
  8. data/src/main/java/org/embulk/output/kintone/KintoneClient.java +117 -0
  9. data/src/main/java/org/embulk/output/kintone/KintoneColumnOption.java +5 -0
  10. data/src/main/java/org/embulk/output/kintone/KintoneColumnType.java +226 -5
  11. data/src/main/java/org/embulk/output/kintone/KintoneColumnVisitor.java +82 -13
  12. data/src/main/java/org/embulk/output/kintone/KintoneMode.java +52 -4
  13. data/src/main/java/org/embulk/output/kintone/KintoneOutputPlugin.java +12 -20
  14. data/src/main/java/org/embulk/output/kintone/KintonePageOutput.java +123 -127
  15. data/src/main/java/org/embulk/output/kintone/KintoneSortColumn.java +33 -0
  16. data/src/main/java/org/embulk/output/kintone/PluginTask.java +32 -0
  17. data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeApplier.java +19 -0
  18. data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeException.java +7 -0
  19. data/src/main/java/org/embulk/output/kintone/deserializer/Deserializer.java +279 -0
  20. data/src/main/java/org/embulk/output/kintone/record/Id.java +18 -0
  21. data/src/main/java/org/embulk/output/kintone/record/IdOrUpdateKey.java +45 -0
  22. data/src/main/java/org/embulk/output/kintone/record/Skip.java +14 -0
  23. data/src/main/java/org/embulk/output/kintone/reducer/CSVInputColumnVisitor.java +78 -0
  24. data/src/main/java/org/embulk/output/kintone/reducer/CSVOutputColumnVisitor.java +79 -0
  25. data/src/main/java/org/embulk/output/kintone/reducer/ReduceException.java +11 -0
  26. data/src/main/java/org/embulk/output/kintone/reducer/ReduceType.java +190 -0
  27. data/src/main/java/org/embulk/output/kintone/reducer/ReducedPageOutput.java +100 -0
  28. data/src/main/java/org/embulk/output/kintone/reducer/Reducer.java +355 -0
  29. data/src/main/java/org/embulk/output/kintone/util/Lazy.java +20 -0
  30. data/src/test/java/org/embulk/output/kintone/KintoneClientTest.java +139 -0
  31. data/src/test/java/org/embulk/output/kintone/KintoneColumnOptionBuilder.java +7 -0
  32. data/src/test/java/org/embulk/output/kintone/KintoneColumnTypeTest.java +194 -0
  33. data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorTest.java +183 -64
  34. data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorVerifier.java +19 -9
  35. data/src/test/java/org/embulk/output/kintone/KintonePageOutputVerifier.java +120 -51
  36. data/src/test/java/org/embulk/output/kintone/MockClient.java +112 -0
  37. data/src/test/java/org/embulk/output/kintone/TestKintoneOutputPlugin.java +147 -22
  38. data/src/test/java/org/embulk/output/kintone/TestTaskMode.java +1 -0
  39. data/src/test/java/org/embulk/output/kintone/TestTaskReduce.java +47 -0
  40. data/src/test/java/org/embulk/output/kintone/TestTaskReduceException.java +50 -0
  41. data/src/test/java/org/embulk/output/kintone/TestTaskReduceSubtable.java +47 -0
  42. data/src/test/java/org/embulk/output/kintone/TestTaskSkip.java +80 -0
  43. data/src/test/java/org/embulk/output/kintone/TestTaskSkipId.java +80 -0
  44. data/src/test/java/org/embulk/output/kintone/deserializer/DeserializerTest.java +165 -0
  45. data/src/test/java/org/embulk/output/kintone/reducer/ReduceTypeTest.java +154 -0
  46. data/src/test/resources/org/embulk/output/kintone/client/config.yml +1 -0
  47. data/src/test/resources/org/embulk/output/kintone/task/config.yml +2 -1
  48. data/src/test/resources/org/embulk/output/kintone/task/mode/config.yml +6 -0
  49. data/src/test/resources/org/embulk/output/kintone/task/mode/input.csv +7 -7
  50. data/src/test/resources/org/embulk/output/kintone/task/mode/insert_add_records.jsonl +6 -6
  51. data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_ignore_nulls_records.jsonl → insert_ignore_nulls_add_records.jsonl} +2 -2
  52. data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_prefer_nulls_records.jsonl → insert_prefer_nulls_add_records.jsonl} +6 -6
  53. data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_ignore_nulls_records.jsonl → update_ignore_nulls_update_records.jsonl} +2 -2
  54. data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_prefer_nulls_records.jsonl → update_prefer_nulls_update_records.jsonl} +3 -3
  55. data/src/test/resources/org/embulk/output/kintone/task/mode/update_update_records.jsonl +6 -6
  56. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_records.jsonl → upsert_never_skip_add_records.jsonl} +2 -2
  57. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_never_skip_double_single_line_text_add_values.json +1 -0
  58. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_update_records.jsonl} +2 -2
  59. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_add_records.jsonl} +3 -3
  60. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_update_records.jsonl} +3 -3
  61. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_records.jsonl → upsert_never_skip_update_records.jsonl} +4 -4
  62. data/src/test/resources/org/embulk/output/kintone/task/reduce/config.yml +171 -0
  63. data/src/test/resources/org/embulk/output/kintone/task/reduce/input.csv +7 -0
  64. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_add_records.jsonl +6 -0
  65. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_ignore_nulls_add_records.jsonl +6 -0
  66. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_prefer_nulls_add_records.jsonl +6 -0
  67. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_ignore_nulls_update_records.jsonl +3 -0
  68. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_prefer_nulls_update_records.jsonl +3 -0
  69. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_update_records.jsonl +6 -0
  70. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_add_records.jsonl +2 -0
  71. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_add_values.json +1 -0
  72. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_values.json +1 -0
  73. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
  74. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
  75. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
  76. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
  77. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
  78. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
  79. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_update_records.jsonl +4 -0
  80. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/config.yml +36 -0
  81. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/derived_columns.json +1 -0
  82. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/input.csv +13 -0
  83. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/insert_add_records.jsonl +2 -0
  84. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/update_update_records.jsonl +2 -0
  85. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/config.yml +343 -0
  86. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/derived_columns.json +1 -0
  87. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/input.csv +13 -0
  88. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_add_records.jsonl +6 -0
  89. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_ignore_nulls_add_records.jsonl +6 -0
  90. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_prefer_nulls_add_records.jsonl +6 -0
  91. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_ignore_nulls_update_records.jsonl +3 -0
  92. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_prefer_nulls_update_records.jsonl +3 -0
  93. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_update_records.jsonl +6 -0
  94. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_double_single_line_text_values.json +1 -0
  95. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
  96. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
  97. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
  98. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
  99. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
  100. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
  101. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_update_records.jsonl +6 -0
  102. data/src/test/resources/org/embulk/output/kintone/task/skip/config.yml +1 -0
  103. data/src/test/resources/org/embulk/output/kintone/task/skip/input.csv +7 -0
  104. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_add_records.jsonl +6 -0
  105. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_add_records.jsonl +6 -0
  106. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
  107. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_add_records.jsonl +6 -0
  108. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
  109. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_prefer_nulls_add_records.jsonl +6 -0
  110. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_add_values.json +1 -0
  111. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_values.json +1 -0
  112. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_add_values.json +1 -0
  113. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_values.json +1 -0
  114. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
  115. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_update_records.jsonl +5 -0
  116. data/src/test/resources/org/embulk/output/kintone/task/skip/update_never_skip_update_records.jsonl +6 -0
  117. data/src/test/resources/org/embulk/output/kintone/task/skip/update_prefer_nulls_update_records.jsonl +3 -0
  118. data/src/test/resources/org/embulk/output/kintone/task/skip/update_update_records.jsonl +6 -0
  119. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_add_records.jsonl +1 -0
  120. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
  121. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_values.json +1 -0
  122. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
  123. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_add_values.json +1 -0
  124. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_values.json +1 -0
  125. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_update_records.jsonl +2 -0
  126. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_add_records.jsonl +4 -0
  127. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
  128. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
  129. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_values.json +1 -0
  130. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
  131. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_add_values.json +1 -0
  132. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_values.json +1 -0
  133. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_update_records.jsonl +2 -0
  134. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_add_records.jsonl +1 -0
  135. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_add_values.json +1 -0
  136. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_values.json +1 -0
  137. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_update_records.jsonl +2 -0
  138. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_add_values.json +1 -0
  139. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_values.json +1 -0
  140. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_update_records.jsonl +2 -0
  141. data/src/test/resources/org/embulk/output/kintone/task/skip_id/config.yml +1 -0
  142. data/src/test/resources/org/embulk/output/kintone/task/skip_id/input.csv +7 -0
  143. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_add_records.jsonl +6 -0
  144. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_add_records.jsonl +6 -0
  145. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
  146. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_add_records.jsonl +6 -0
  147. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
  148. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_prefer_nulls_add_records.jsonl +6 -0
  149. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_add_values.json +1 -0
  150. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_values.json +1 -0
  151. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_add_values.json +1 -0
  152. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_values.json +1 -0
  153. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
  154. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_update_records.jsonl +5 -0
  155. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_never_skip_update_records.jsonl +6 -0
  156. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_prefer_nulls_update_records.jsonl +3 -0
  157. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_update_records.jsonl +6 -0
  158. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_add_values.json +1 -0
  159. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_values.json +1 -0
  160. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_add_values.json +1 -0
  161. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_values.json +1 -0
  162. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_add_values.json +1 -0
  163. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_values.json +1 -0
  164. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
  165. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_update_records.jsonl +5 -0
  166. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_add_values.json +1 -0
  167. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_values.json +1 -0
  168. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_add_records.jsonl +1 -0
  169. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_add_values.json +1 -0
  170. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_values.json +1 -0
  171. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
  172. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
  173. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_update_records.jsonl +5 -0
  174. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_add_values.json +1 -0
  175. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_values.json +1 -0
  176. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_add_records.jsonl +3 -0
  177. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_update_records.jsonl +2 -0
  178. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_update_records.jsonl +5 -0
  179. metadata +163 -17
  180. data/classpath/embulk-output-kintone-1.0.0.jar +0 -0
  181. /data/src/test/resources/org/embulk/output/kintone/task/mode/{values.json → upsert_never_skip_double_single_line_text_values.json} +0 -0
  182. /data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_add_records.jsonl} +0 -0
  183. /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_ignore_nulls.json → upsert_never_skip_ignore_nulls_double_single_line_text_values.json} +0 -0
  184. /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_prefer_nulls.json → upsert_never_skip_prefer_nulls_double_single_line_text_values.json} +0 -0
@@ -1,5 +1,12 @@
1
1
  package org.embulk.output.kintone;
2
2
 
3
+ import static org.embulk.output.kintone.KintoneColumnTypeTest.date;
4
+ import static org.embulk.output.kintone.KintoneColumnTypeTest.dateTime;
5
+ import static org.embulk.output.kintone.KintoneColumnTypeTest.list;
6
+ import static org.embulk.output.kintone.KintoneColumnTypeTest.number;
7
+ import static org.embulk.output.kintone.KintoneColumnTypeTest.rows;
8
+ import static org.embulk.output.kintone.KintoneColumnTypeTest.time;
9
+ import static org.embulk.output.kintone.deserializer.DeserializerTest.assertTableRows;
3
10
  import static org.hamcrest.MatcherAssert.assertThat;
4
11
  import static org.hamcrest.Matchers.is;
5
12
  import static org.hamcrest.Matchers.nullValue;
@@ -7,29 +14,37 @@ import static org.junit.Assert.assertThrows;
7
14
 
8
15
  import com.google.common.collect.ImmutableMap;
9
16
  import com.kintone.client.model.record.FieldType;
10
- import java.math.BigDecimal;
11
17
  import java.time.Instant;
12
- import java.time.LocalDate;
13
- import java.time.LocalTime;
14
- import java.time.ZonedDateTime;
15
18
  import java.util.AbstractMap;
16
- import java.util.Arrays;
17
- import java.util.List;
19
+ import java.util.Collections;
18
20
  import java.util.Map;
19
21
  import java.util.function.Function;
22
+ import org.embulk.output.kintone.deserializer.DeserializerTest;
20
23
  import org.embulk.spi.Page;
21
24
  import org.embulk.spi.Schema;
25
+ import org.embulk.spi.json.JsonParser;
22
26
  import org.embulk.spi.time.Timestamp;
23
27
  import org.embulk.spi.type.Types;
24
28
  import org.junit.Test;
29
+ import org.msgpack.value.Value;
25
30
  import org.msgpack.value.ValueFactory;
26
31
 
27
32
  public class KintoneColumnVisitorTest {
33
+ private static final JsonParser PARSER = new JsonParser();
34
+ private static final String[] ROWS = {
35
+ DeserializerTest.TABLE_ROW.apply(0L),
36
+ DeserializerTest.TABLE_ROW.apply(1L),
37
+ DeserializerTest.TABLE_ROW.apply(2L),
38
+ DeserializerTest.TABLE_ROW.apply(3L),
39
+ DeserializerTest.TABLE_ROW.apply(4L),
40
+ DeserializerTest.TABLE_ROW.apply(5L),
41
+ };
42
+
28
43
  @Test
29
44
  public void test() {
30
- KintoneColumnVisitorVerifier verifier = verifier("STRING|SINGLE_LINE_TEXT");
45
+ KintoneColumnVisitorVerifier verifier = verifier(null, "STRING|SINGLE_LINE_TEXT");
31
46
  verifier.verify(
32
- (record, updateKey) -> {
47
+ (record, idOrUpdateKey) -> {
33
48
  assertThat(record.getSingleLineTextFieldValue("BOOLEAN|SINGLE_LINE_TEXT"), is("false"));
34
49
  assertThat(record.getNumberFieldValue("BOOLEAN"), is(number("0")));
35
50
  assertThat(record.getSingleLineTextFieldValue("LONG|SINGLE_LINE_TEXT"), is("0"));
@@ -71,6 +86,7 @@ public class KintoneColumnVisitorTest {
71
86
  record.getDateTimeFieldValue("STRING|DATETIME"),
72
87
  is(dateTime("1970-01-01T00:00:00Z")));
73
88
  assertThat(record.getLinkFieldValue("STRING|LINK"), is(""));
89
+ assertThat(record.getSubtableFieldValue("STRING|SUBTABLE"), is(list()));
74
90
  assertThat(
75
91
  record.getSingleLineTextFieldValue("TIMESTAMP|SINGLE_LINE_TEXT"),
76
92
  is("1970-01-01T00:00:00Z"));
@@ -85,11 +101,14 @@ public class KintoneColumnVisitorTest {
85
101
  record.getDateTimeFieldValue("TIMESTAMP"), is(dateTime("1970-01-01T00:00:00Z")));
86
102
  assertThat(record.getSingleLineTextFieldValue("JSON|SINGLE_LINE_TEXT"), is("\"\""));
87
103
  assertThat(record.getMultiLineTextFieldValue("JSON"), is("\"\""));
88
- assertThat(updateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
89
- assertThat(updateKey.getValue(), is(""));
104
+ assertThat(record.getSubtableFieldValue("JSON|SUBTABLE"), is(list()));
105
+ assertThat(
106
+ record.getSingleLineTextFieldValue("JSON|SUBTABLE.SINGLE_LINE_TEXT"), is("\"\""));
107
+ assertThat(idOrUpdateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
108
+ assertThat(idOrUpdateKey.getValue(), is(""));
90
109
  });
91
110
  verifier.verify(
92
- (record, updateKey) -> {
111
+ (record, idOrUpdateKey) -> {
93
112
  assertThat(record.getSingleLineTextFieldValue("BOOLEAN|SINGLE_LINE_TEXT"), is("false"));
94
113
  assertThat(record.getNumberFieldValue("BOOLEAN"), is(number("0")));
95
114
  assertThat(record.getSingleLineTextFieldValue("LONG|SINGLE_LINE_TEXT"), is("0"));
@@ -131,6 +150,7 @@ public class KintoneColumnVisitorTest {
131
150
  record.getDateTimeFieldValue("STRING|DATETIME"),
132
151
  is(dateTime("1970-01-01T00:00:00Z")));
133
152
  assertThat(record.getLinkFieldValue("STRING|LINK"), is(""));
153
+ assertThat(record.getSubtableFieldValue("STRING|SUBTABLE"), is(list()));
134
154
  assertThat(
135
155
  record.getSingleLineTextFieldValue("TIMESTAMP|SINGLE_LINE_TEXT"),
136
156
  is("1970-01-01T00:00:00Z"));
@@ -145,11 +165,14 @@ public class KintoneColumnVisitorTest {
145
165
  record.getDateTimeFieldValue("TIMESTAMP"), is(dateTime("1970-01-01T00:00:00Z")));
146
166
  assertThat(record.getSingleLineTextFieldValue("JSON|SINGLE_LINE_TEXT"), is("\"\""));
147
167
  assertThat(record.getMultiLineTextFieldValue("JSON"), is("\"\""));
148
- assertThat(updateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
149
- assertThat(updateKey.getValue(), is(""));
168
+ assertThat(record.getSubtableFieldValue("JSON|SUBTABLE"), is(list()));
169
+ assertThat(
170
+ record.getSingleLineTextFieldValue("JSON|SUBTABLE.SINGLE_LINE_TEXT"), is("\"\""));
171
+ assertThat(idOrUpdateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
172
+ assertThat(idOrUpdateKey.getValue(), is(""));
150
173
  });
151
174
  verifier.verify(
152
- (record, updateKey) -> {
175
+ (record, idOrUpdateKey) -> {
153
176
  assertThat(record.getSingleLineTextFieldValue("BOOLEAN|SINGLE_LINE_TEXT"), is("true"));
154
177
  assertThat(record.getNumberFieldValue("BOOLEAN"), is(number("1")));
155
178
  assertThat(record.getSingleLineTextFieldValue("LONG|SINGLE_LINE_TEXT"), is("123"));
@@ -192,6 +215,7 @@ public class KintoneColumnVisitorTest {
192
215
  record.getDateTimeFieldValue("STRING|DATETIME"),
193
216
  is(dateTime("1999-12-31T23:59:59Z")));
194
217
  assertThat(record.getLinkFieldValue("STRING|LINK"), is("abc"));
218
+ assertTableRows(record.getSubtableFieldValue("STRING|SUBTABLE"), rows(0L, 1L, 2L));
195
219
  assertThat(
196
220
  record.getSingleLineTextFieldValue("TIMESTAMP|SINGLE_LINE_TEXT"),
197
221
  is("1999-12-31T23:59:59Z"));
@@ -206,11 +230,14 @@ public class KintoneColumnVisitorTest {
206
230
  record.getDateTimeFieldValue("TIMESTAMP"), is(dateTime("1999-12-31T23:59:59Z")));
207
231
  assertThat(record.getSingleLineTextFieldValue("JSON|SINGLE_LINE_TEXT"), is("\"abc\""));
208
232
  assertThat(record.getMultiLineTextFieldValue("JSON"), is("\"abc\""));
209
- assertThat(updateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
210
- assertThat(updateKey.getValue(), is("abc"));
233
+ assertTableRows(record.getSubtableFieldValue("JSON|SUBTABLE"), rows(0L, 1L, 2L));
234
+ assertThat(
235
+ record.getSingleLineTextFieldValue("JSON|SUBTABLE.SINGLE_LINE_TEXT"), is("\"abc\""));
236
+ assertThat(idOrUpdateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
237
+ assertThat(idOrUpdateKey.getValue(), is("abc"));
211
238
  });
212
239
  verifier.verify(
213
- (record, updateKey) -> {
240
+ (record, idOrUpdateKey) -> {
214
241
  assertThat(record.getSingleLineTextFieldValue("BOOLEAN|SINGLE_LINE_TEXT"), is("false"));
215
242
  assertThat(record.getNumberFieldValue("BOOLEAN"), is(number("0")));
216
243
  assertThat(record.getSingleLineTextFieldValue("LONG|SINGLE_LINE_TEXT"), is("456"));
@@ -253,6 +280,7 @@ public class KintoneColumnVisitorTest {
253
280
  record.getDateTimeFieldValue("STRING|DATETIME"),
254
281
  is(dateTime("2000-01-01T00:00:00Z")));
255
282
  assertThat(record.getLinkFieldValue("STRING|LINK"), is("def"));
283
+ assertTableRows(record.getSubtableFieldValue("STRING|SUBTABLE"), rows(3L, 4L, 5L));
256
284
  assertThat(
257
285
  record.getSingleLineTextFieldValue("TIMESTAMP|SINGLE_LINE_TEXT"),
258
286
  is("2000-01-01T00:00:00Z"));
@@ -267,16 +295,19 @@ public class KintoneColumnVisitorTest {
267
295
  record.getDateTimeFieldValue("TIMESTAMP"), is(dateTime("2000-01-01T00:00:00Z")));
268
296
  assertThat(record.getSingleLineTextFieldValue("JSON|SINGLE_LINE_TEXT"), is("\"def\""));
269
297
  assertThat(record.getMultiLineTextFieldValue("JSON"), is("\"def\""));
270
- assertThat(updateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
271
- assertThat(updateKey.getValue(), is("def"));
298
+ assertTableRows(record.getSubtableFieldValue("JSON|SUBTABLE"), rows(3L, 4L, 5L));
299
+ assertThat(
300
+ record.getSingleLineTextFieldValue("JSON|SUBTABLE.SINGLE_LINE_TEXT"), is("\"def\""));
301
+ assertThat(idOrUpdateKey.getField(), is("STRING|SINGLE_LINE_TEXT"));
302
+ assertThat(idOrUpdateKey.getValue(), is("def"));
272
303
  });
273
304
  }
274
305
 
275
306
  @Test
276
307
  public void testPreferNulls() {
277
- KintoneColumnVisitorVerifier verifier = verifier("LONG", true, false);
308
+ KintoneColumnVisitorVerifier verifier = verifier(null, "LONG", true, false);
278
309
  verifier.verify(
279
- (record, updateKey) -> {
310
+ (record, idOrUpdateKey) -> {
280
311
  assertThat(
281
312
  record.getFieldType("BOOLEAN|SINGLE_LINE_TEXT"), is(FieldType.SINGLE_LINE_TEXT));
282
313
  assertThat(record.getFieldType("BOOLEAN"), is(FieldType.NUMBER));
@@ -316,6 +347,7 @@ public class KintoneColumnVisitorTest {
316
347
  assertThat(record.getFieldType("STRING|TIME|PST"), is(FieldType.TIME));
317
348
  assertThat(record.getFieldType("STRING|DATETIME"), is(FieldType.DATETIME));
318
349
  assertThat(record.getFieldType("STRING|LINK"), is(FieldType.LINK));
350
+ assertThat(record.getFieldType("STRING|SUBTABLE"), is(FieldType.SUBTABLE));
319
351
  assertThat(
320
352
  record.getFieldType("TIMESTAMP|SINGLE_LINE_TEXT"), is(FieldType.SINGLE_LINE_TEXT));
321
353
  assertThat(record.getFieldType("TIMESTAMP|NUMBER"), is(FieldType.NUMBER));
@@ -328,6 +360,10 @@ public class KintoneColumnVisitorTest {
328
360
  assertThat(record.getFieldType("TIMESTAMP"), is(FieldType.DATETIME));
329
361
  assertThat(record.getFieldType("JSON|SINGLE_LINE_TEXT"), is(FieldType.SINGLE_LINE_TEXT));
330
362
  assertThat(record.getFieldType("JSON"), is(FieldType.MULTI_LINE_TEXT));
363
+ assertThat(record.getFieldType("JSON|SUBTABLE"), is(FieldType.SUBTABLE));
364
+ assertThat(
365
+ record.getFieldType("JSON|SUBTABLE.SINGLE_LINE_TEXT"),
366
+ is(FieldType.SINGLE_LINE_TEXT));
331
367
  assertThat(record.getSingleLineTextFieldValue("BOOLEAN|SINGLE_LINE_TEXT"), nullValue());
332
368
  assertThat(record.getNumberFieldValue("BOOLEAN"), nullValue());
333
369
  assertThat(record.getSingleLineTextFieldValue("LONG|SINGLE_LINE_TEXT"), nullValue());
@@ -364,6 +400,7 @@ public class KintoneColumnVisitorTest {
364
400
  assertThat(record.getTimeFieldValue("STRING|TIME|PST"), nullValue());
365
401
  assertThat(record.getDateTimeFieldValue("STRING|DATETIME"), nullValue());
366
402
  assertThat(record.getLinkFieldValue("STRING|LINK"), nullValue());
403
+ assertThat(record.getSubtableFieldValue("STRING|SUBTABLE"), is(list()));
367
404
  assertThat(record.getSingleLineTextFieldValue("TIMESTAMP|SINGLE_LINE_TEXT"), nullValue());
368
405
  assertThat(record.getNumberFieldValue("TIMESTAMP|NUMBER"), nullValue());
369
406
  assertThat(record.getDateFieldValue("TIMESTAMP|DATE"), nullValue());
@@ -375,16 +412,19 @@ public class KintoneColumnVisitorTest {
375
412
  assertThat(record.getDateTimeFieldValue("TIMESTAMP"), nullValue());
376
413
  assertThat(record.getSingleLineTextFieldValue("JSON|SINGLE_LINE_TEXT"), nullValue());
377
414
  assertThat(record.getMultiLineTextFieldValue("JSON"), nullValue());
378
- assertThat(updateKey.getField(), is("LONG"));
379
- assertThat(updateKey.getValue(), nullValue());
415
+ assertThat(record.getSubtableFieldValue("JSON|SUBTABLE"), is(list()));
416
+ assertThat(
417
+ record.getSingleLineTextFieldValue("JSON|SUBTABLE.SINGLE_LINE_TEXT"), nullValue());
418
+ assertThat(idOrUpdateKey.getField(), is("LONG"));
419
+ assertThat(idOrUpdateKey.getValue(), nullValue());
380
420
  });
381
421
  }
382
422
 
383
423
  @Test
384
424
  public void testIgnoreNulls() {
385
- KintoneColumnVisitorVerifier verifier = verifier("JSON", false, true);
425
+ KintoneColumnVisitorVerifier verifier = verifier("JSON", "JSON", false, true);
386
426
  verifier.verify(
387
- (record, updateKey) -> {
427
+ (record, idOrUpdateKey) -> {
388
428
  assertThat(record.getFieldValue("BOOLEAN|SINGLE_LINE_TEXT"), nullValue());
389
429
  assertThat(record.getFieldValue("BOOLEAN"), nullValue());
390
430
  assertThat(record.getFieldValue("LONG|SINGLE_LINE_TEXT"), nullValue());
@@ -421,6 +461,7 @@ public class KintoneColumnVisitorTest {
421
461
  assertThat(record.getFieldValue("STRING|TIME|PST"), nullValue());
422
462
  assertThat(record.getFieldValue("STRING|DATETIME"), nullValue());
423
463
  assertThat(record.getFieldValue("STRING|LINK"), nullValue());
464
+ assertThat(record.getFieldValue("STRING|SUBTABLE"), nullValue());
424
465
  assertThat(record.getFieldValue("TIMESTAMP|SINGLE_LINE_TEXT"), nullValue());
425
466
  assertThat(record.getFieldValue("TIMESTAMP|NUMBER"), nullValue());
426
467
  assertThat(record.getFieldValue("TIMESTAMP|DATE"), nullValue());
@@ -432,55 +473,130 @@ public class KintoneColumnVisitorTest {
432
473
  assertThat(record.getFieldValue("TIMESTAMP"), nullValue());
433
474
  assertThat(record.getFieldValue("JSON|SINGLE_LINE_TEXT"), nullValue());
434
475
  assertThat(record.getFieldValue("JSON"), nullValue());
435
- assertThat(updateKey.getField(), nullValue());
436
- assertThat(updateKey.getValue(), nullValue());
476
+ assertThat(record.getFieldValue("JSON|SUBTABLE"), nullValue());
477
+ assertThat(record.getFieldValue("JSON|SUBTABLE.SINGLE_LINE_TEXT"), nullValue());
478
+ assertThat(idOrUpdateKey.getField(), nullValue());
479
+ assertThat(idOrUpdateKey.getValue(), nullValue());
480
+ },
481
+ true);
482
+ }
483
+
484
+ @Test
485
+ public void testReduceKey() {
486
+ KintoneColumnVisitorVerifier verifier = verifier("JSON|SUBTABLE", null);
487
+ verifier.verify(
488
+ (record, idOrUpdateKey) -> {
489
+ assertThat(record.getSingleLineTextFieldValue("BOOLEAN|SINGLE_LINE_TEXT"), is("false"));
490
+ assertThat(record.getNumberFieldValue("BOOLEAN"), is(number("0")));
491
+ assertThat(record.getSingleLineTextFieldValue("LONG|SINGLE_LINE_TEXT"), is("0"));
492
+ assertThat(record.getNumberFieldValue("LONG"), is(number("0")));
493
+ assertThat(record.getDateFieldValue("LONG|DATE"), is(date("1970-01-01")));
494
+ assertThat(record.getDateFieldValue("LONG|DATE|JST"), is(date("1970-01-01")));
495
+ assertThat(record.getDateFieldValue("LONG|DATE|PST"), is(date("1969-12-31")));
496
+ assertThat(record.getTimeFieldValue("LONG|TIME"), is(time("00:00:00")));
497
+ assertThat(record.getTimeFieldValue("LONG|TIME|JST"), is(time("09:00:00")));
498
+ assertThat(record.getTimeFieldValue("LONG|TIME|PST"), is(time("16:00:00")));
499
+ assertThat(
500
+ record.getDateTimeFieldValue("LONG|DATETIME"), is(dateTime("1970-01-01T00:00:00Z")));
501
+ assertThat(record.getSingleLineTextFieldValue("DOUBLE|SINGLE_LINE_TEXT"), is("0.0"));
502
+ assertThat(record.getNumberFieldValue("DOUBLE"), is(number("0.0")));
503
+ assertThat(record.getDateFieldValue("DOUBLE|DATE"), is(date("1970-01-01")));
504
+ assertThat(record.getDateFieldValue("DOUBLE|DATE|JST"), is(date("1970-01-01")));
505
+ assertThat(record.getDateFieldValue("DOUBLE|DATE|PST"), is(date("1969-12-31")));
506
+ assertThat(record.getTimeFieldValue("DOUBLE|TIME"), is(time("00:00:00")));
507
+ assertThat(record.getTimeFieldValue("DOUBLE|TIME|JST"), is(time("09:00:00")));
508
+ assertThat(record.getTimeFieldValue("DOUBLE|TIME|PST"), is(time("16:00:00")));
509
+ assertThat(
510
+ record.getDateTimeFieldValue("DOUBLE|DATETIME"),
511
+ is(dateTime("1970-01-01T00:00:00Z")));
512
+ assertThat(record.getSingleLineTextFieldValue("STRING|SINGLE_LINE_TEXT"), is(""));
513
+ assertThat(record.getMultiLineTextFieldValue("STRING"), is(""));
514
+ assertThat(record.getRichTextFieldValue("STRING|RICH_TEXT"), is(""));
515
+ assertThat(record.getNumberFieldValue("STRING|NUMBER"), is(number("0")));
516
+ assertThat(record.getCheckBoxFieldValue("STRING|CHECK_BOX"), is(list()));
517
+ assertThat(record.getRadioButtonFieldValue("STRING|RADIO_BUTTON"), is(""));
518
+ assertThat(record.getMultiSelectFieldValue("STRING|MULTI_SELECT"), is(list()));
519
+ assertThat(record.getDropDownFieldValue("STRING|DROP_DOWN"), is(""));
520
+ assertThat(record.getDateFieldValue("STRING|DATE"), is(date("1970-01-01")));
521
+ assertThat(record.getDateFieldValue("STRING|DATE|JST"), is(date("1970-01-01")));
522
+ assertThat(record.getDateFieldValue("STRING|DATE|PST"), is(date("1969-12-31")));
523
+ assertThat(record.getTimeFieldValue("STRING|TIME"), is(time("00:00:00")));
524
+ assertThat(record.getTimeFieldValue("STRING|TIME|JST"), is(time("09:00:00")));
525
+ assertThat(record.getTimeFieldValue("STRING|TIME|PST"), is(time("16:00:00")));
526
+ assertThat(
527
+ record.getDateTimeFieldValue("STRING|DATETIME"),
528
+ is(dateTime("1970-01-01T00:00:00Z")));
529
+ assertThat(record.getLinkFieldValue("STRING|LINK"), is(""));
530
+ assertThat(record.getSubtableFieldValue("STRING|SUBTABLE"), is(list()));
531
+ assertThat(
532
+ record.getSingleLineTextFieldValue("TIMESTAMP|SINGLE_LINE_TEXT"),
533
+ is("1970-01-01T00:00:00Z"));
534
+ assertThat(record.getNumberFieldValue("TIMESTAMP|NUMBER"), is(number("0")));
535
+ assertThat(record.getDateFieldValue("TIMESTAMP|DATE"), is(date("1970-01-01")));
536
+ assertThat(record.getDateFieldValue("TIMESTAMP|DATE|JST"), is(date("1970-01-01")));
537
+ assertThat(record.getDateFieldValue("TIMESTAMP|DATE|PST"), is(date("1969-12-31")));
538
+ assertThat(record.getTimeFieldValue("TIMESTAMP|TIME"), is(time("00:00:00")));
539
+ assertThat(record.getTimeFieldValue("TIMESTAMP|TIME|JST"), is(time("09:00:00")));
540
+ assertThat(record.getTimeFieldValue("TIMESTAMP|TIME|PST"), is(time("16:00:00")));
541
+ assertThat(
542
+ record.getDateTimeFieldValue("TIMESTAMP"), is(dateTime("1970-01-01T00:00:00Z")));
543
+ assertThat(record.getSingleLineTextFieldValue("JSON|SINGLE_LINE_TEXT"), is("\"\""));
544
+ assertThat(record.getMultiLineTextFieldValue("JSON"), is("\"\""));
545
+ assertThat(record.getSubtableFieldValue("JSON|SUBTABLE"), is(list()));
546
+ assertThat(record.getFieldValue("JSON|SUBTABLE.SINGLE_LINE_TEXT"), nullValue());
547
+ assertThat(idOrUpdateKey.getField(), nullValue());
548
+ assertThat(idOrUpdateKey.getValue(), nullValue());
437
549
  },
438
550
  true);
439
551
  }
440
552
 
441
553
  @Test
442
554
  public void testUpdateKey() {
443
- assertThrows(UnsupportedOperationException.class, () -> verifier("TIMESTAMP").verify());
444
- KintoneColumnVisitorVerifier verifier = verifier("TIMESTAMP|NUMBER");
555
+ assertThrows(UnsupportedOperationException.class, () -> verifier(null, "TIMESTAMP").verify());
556
+ KintoneColumnVisitorVerifier verifier = verifier(null, "TIMESTAMP|NUMBER");
445
557
  verifier.verify(
446
- (record, updateKey) -> {
447
- assertThat(updateKey.getField(), is("TIMESTAMP|NUMBER"));
448
- assertThat(updateKey.getValue(), is(number("0")));
558
+ (record, idOrUpdateKey) -> {
559
+ assertThat(idOrUpdateKey.getField(), is("TIMESTAMP|NUMBER"));
560
+ assertThat(idOrUpdateKey.getValue(), is(number("0")));
449
561
  });
450
562
  verifier.verify(
451
- (record, updateKey) -> {
452
- assertThat(updateKey.getField(), is("TIMESTAMP|NUMBER"));
453
- assertThat(updateKey.getValue(), is(number("0")));
563
+ (record, idOrUpdateKey) -> {
564
+ assertThat(idOrUpdateKey.getField(), is("TIMESTAMP|NUMBER"));
565
+ assertThat(idOrUpdateKey.getValue(), is(number("0")));
454
566
  });
455
567
  verifier.verify(
456
- (record, updateKey) -> {
457
- assertThat(updateKey.getField(), is("TIMESTAMP|NUMBER"));
458
- assertThat(updateKey.getValue(), is(number("946684799")));
568
+ (record, idOrUpdateKey) -> {
569
+ assertThat(idOrUpdateKey.getField(), is("TIMESTAMP|NUMBER"));
570
+ assertThat(idOrUpdateKey.getValue(), is(number("946684799")));
459
571
  });
460
572
  verifier.verify(
461
- (record, updateKey) -> {
462
- assertThat(updateKey.getField(), is("TIMESTAMP|NUMBER"));
463
- assertThat(updateKey.getValue(), is(number("946684800")));
573
+ (record, idOrUpdateKey) -> {
574
+ assertThat(idOrUpdateKey.getField(), is("TIMESTAMP|NUMBER"));
575
+ assertThat(idOrUpdateKey.getValue(), is(number("946684800")));
464
576
  });
465
577
  }
466
578
 
467
- private static KintoneColumnVisitorVerifier verifier(String updateKeyName) {
579
+ private static KintoneColumnVisitorVerifier verifier(String reduceKeyName, String updateKeyName) {
468
580
  Schema schema = build(Schema.builder());
469
581
  return new KintoneColumnVisitorVerifier(
470
582
  schema,
583
+ Collections.emptySet(),
471
584
  build(ImmutableMap.builder()),
585
+ reduceKeyName,
472
586
  updateKeyName,
473
587
  OutputPageBuilder.build(schema, KintoneColumnVisitorTest::build));
474
588
  }
475
589
 
476
590
  private static KintoneColumnVisitorVerifier verifier(
477
- String updateKeyName, boolean preferNulls, boolean ignoreNulls) {
591
+ String reduceKeyName, String updateKeyName, boolean preferNulls, boolean ignoreNulls) {
478
592
  Schema schema = build(Schema.builder());
479
593
  return new KintoneColumnVisitorVerifier(
480
594
  schema,
595
+ Collections.emptySet(),
481
596
  build(ImmutableMap.builder()),
482
597
  preferNulls,
483
598
  ignoreNulls,
599
+ reduceKeyName,
484
600
  updateKeyName,
485
601
  OutputPageBuilder.build(schema, KintoneColumnVisitorTest::build));
486
602
  }
@@ -523,6 +639,7 @@ public class KintoneColumnVisitorTest {
523
639
  .add("STRING|TIME|PST", Types.STRING)
524
640
  .add("STRING|DATETIME", Types.STRING)
525
641
  .add("STRING|LINK", Types.STRING)
642
+ .add("STRING|SUBTABLE", Types.STRING)
526
643
  .add("TIMESTAMP|SINGLE_LINE_TEXT", Types.TIMESTAMP)
527
644
  .add("TIMESTAMP|NUMBER", Types.TIMESTAMP)
528
645
  .add("TIMESTAMP|DATE", Types.TIMESTAMP)
@@ -534,6 +651,8 @@ public class KintoneColumnVisitorTest {
534
651
  .add("TIMESTAMP", Types.TIMESTAMP)
535
652
  .add("JSON|SINGLE_LINE_TEXT", Types.JSON)
536
653
  .add("JSON", Types.JSON)
654
+ .add("JSON|SUBTABLE", Types.JSON)
655
+ .add("JSON|SUBTABLE.SINGLE_LINE_TEXT", Types.JSON)
537
656
  .build();
538
657
  }
539
658
 
@@ -576,6 +695,7 @@ public class KintoneColumnVisitorTest {
576
695
  .put(build("STRING|TIME|PST", it -> it.setType("TIME").setTimezone("US/Pacific")))
577
696
  .put(build("STRING|DATETIME", it -> it.setType("DATETIME")))
578
697
  .put(build("STRING|LINK", it -> it.setType("LINK")))
698
+ .put(build("STRING|SUBTABLE", it -> it.setType("SUBTABLE")))
579
699
  .put(build("TIMESTAMP|SINGLE_LINE_TEXT", it -> it.setType("SINGLE_LINE_TEXT")))
580
700
  .put(build("TIMESTAMP|NUMBER", it -> it.setType("NUMBER")))
581
701
  .put(build("TIMESTAMP|DATE", it -> it.setType("DATE").setTimezone("UTC")))
@@ -587,6 +707,8 @@ public class KintoneColumnVisitorTest {
587
707
  .put(build("TIMESTAMP", it -> it.setType("DATETIME")))
588
708
  .put(build("JSON|SINGLE_LINE_TEXT", it -> it.setType("SINGLE_LINE_TEXT")))
589
709
  .put(build("JSON", it -> it.setType("MULTI_LINE_TEXT")))
710
+ .put(build("JSON|SUBTABLE", it -> it.setType("SUBTABLE")))
711
+ .put(build("JSON|SUBTABLE.SINGLE_LINE_TEXT", it -> it.setType("SINGLE_LINE_TEXT")))
590
712
  .build();
591
713
  }
592
714
 
@@ -634,6 +756,7 @@ public class KintoneColumnVisitorTest {
634
756
  .setNull("STRING|TIME|PST")
635
757
  .setNull("STRING|DATETIME")
636
758
  .setNull("STRING|LINK")
759
+ .setNull("STRING|SUBTABLE")
637
760
  .setNull("TIMESTAMP|SINGLE_LINE_TEXT")
638
761
  .setNull("TIMESTAMP|NUMBER")
639
762
  .setNull("TIMESTAMP|DATE")
@@ -645,6 +768,8 @@ public class KintoneColumnVisitorTest {
645
768
  .setNull("TIMESTAMP")
646
769
  .setNull("JSON|SINGLE_LINE_TEXT")
647
770
  .setNull("JSON")
771
+ .setNull("JSON|SUBTABLE")
772
+ .setNull("JSON|SUBTABLE.SINGLE_LINE_TEXT")
648
773
  .addRecord()
649
774
  .setBoolean("BOOLEAN|SINGLE_LINE_TEXT", false)
650
775
  .setBoolean("BOOLEAN", false)
@@ -682,6 +807,7 @@ public class KintoneColumnVisitorTest {
682
807
  .setString("STRING|TIME|PST", "")
683
808
  .setString("STRING|DATETIME", "")
684
809
  .setString("STRING|LINK", "")
810
+ .setString("STRING|SUBTABLE", "")
685
811
  .setTimestamp("TIMESTAMP|SINGLE_LINE_TEXT", Timestamp.ofInstant(Instant.EPOCH))
686
812
  .setTimestamp("TIMESTAMP|NUMBER", Timestamp.ofInstant(Instant.EPOCH))
687
813
  .setTimestamp("TIMESTAMP|DATE", Timestamp.ofInstant(Instant.EPOCH))
@@ -693,6 +819,8 @@ public class KintoneColumnVisitorTest {
693
819
  .setTimestamp("TIMESTAMP", Timestamp.ofInstant(Instant.EPOCH))
694
820
  .setJson("JSON|SINGLE_LINE_TEXT", ValueFactory.newString(""))
695
821
  .setJson("JSON", ValueFactory.newString(""))
822
+ .setJson("JSON|SUBTABLE", ValueFactory.newString(""))
823
+ .setJson("JSON|SUBTABLE.SINGLE_LINE_TEXT", ValueFactory.newString(""))
696
824
  .addRecord()
697
825
  .setBoolean("BOOLEAN|SINGLE_LINE_TEXT", true)
698
826
  .setBoolean("BOOLEAN", true)
@@ -730,6 +858,7 @@ public class KintoneColumnVisitorTest {
730
858
  .setString("STRING|TIME|PST", "23:59:59")
731
859
  .setString("STRING|DATETIME", "1999-12-31T23:59:59Z")
732
860
  .setString("STRING|LINK", "abc")
861
+ .setString("STRING|SUBTABLE", String.format("[%s,%s,%s]", ROWS[0], ROWS[1], ROWS[2]))
733
862
  .setTimestamp("TIMESTAMP|SINGLE_LINE_TEXT", timestamp("1999-12-31T23:59:59Z"))
734
863
  .setTimestamp("TIMESTAMP|NUMBER", timestamp("1999-12-31T23:59:59Z"))
735
864
  .setTimestamp("TIMESTAMP|DATE", timestamp("1999-12-31T23:59:59Z"))
@@ -741,6 +870,9 @@ public class KintoneColumnVisitorTest {
741
870
  .setTimestamp("TIMESTAMP", timestamp("1999-12-31T23:59:59Z"))
742
871
  .setJson("JSON|SINGLE_LINE_TEXT", ValueFactory.newString("abc"))
743
872
  .setJson("JSON", ValueFactory.newString("abc"))
873
+ .setJson(
874
+ "JSON|SUBTABLE", ValueFactory.newArray(value(ROWS[0]), value(ROWS[1]), value(ROWS[2])))
875
+ .setJson("JSON|SUBTABLE.SINGLE_LINE_TEXT", ValueFactory.newString("abc"))
744
876
  .addRecord()
745
877
  .setBoolean("BOOLEAN|SINGLE_LINE_TEXT", false)
746
878
  .setBoolean("BOOLEAN", false)
@@ -778,6 +910,7 @@ public class KintoneColumnVisitorTest {
778
910
  .setString("STRING|TIME|PST", "00:00:00")
779
911
  .setString("STRING|DATETIME", "2000-01-01T00:00:00Z")
780
912
  .setString("STRING|LINK", "def")
913
+ .setString("STRING|SUBTABLE", String.format("[%s,%s,%s]", ROWS[3], ROWS[4], ROWS[5]))
781
914
  .setTimestamp("TIMESTAMP|SINGLE_LINE_TEXT", timestamp("2000-01-01T00:00:00Z"))
782
915
  .setTimestamp("TIMESTAMP|NUMBER", timestamp("2000-01-01T00:00:00Z"))
783
916
  .setTimestamp("TIMESTAMP|DATE", timestamp("2000-01-01T00:00:00Z"))
@@ -789,32 +922,18 @@ public class KintoneColumnVisitorTest {
789
922
  .setTimestamp("TIMESTAMP", timestamp("2000-01-01T00:00:00Z"))
790
923
  .setJson("JSON|SINGLE_LINE_TEXT", ValueFactory.newString("def"))
791
924
  .setJson("JSON", ValueFactory.newString("def"))
925
+ .setJson(
926
+ "JSON|SUBTABLE", ValueFactory.newArray(value(ROWS[3]), value(ROWS[4]), value(ROWS[5])))
927
+ .setJson("JSON|SUBTABLE.SINGLE_LINE_TEXT", ValueFactory.newString("def"))
792
928
  .addRecord()
793
929
  .build();
794
930
  }
795
931
 
796
- private static BigDecimal number(String value) {
797
- return new BigDecimal(value);
798
- }
799
-
800
- @SafeVarargs
801
- private static <T> List<T> list(T... a) {
802
- return Arrays.asList(a);
803
- }
804
-
805
- private static LocalDate date(CharSequence text) {
806
- return LocalDate.parse(text);
807
- }
808
-
809
- private static LocalTime time(CharSequence text) {
810
- return LocalTime.parse(text);
811
- }
812
-
813
- private static ZonedDateTime dateTime(CharSequence text) {
814
- return ZonedDateTime.parse(text);
815
- }
816
-
817
932
  private static Timestamp timestamp(CharSequence text) {
818
933
  return Timestamp.ofInstant(Instant.parse(text));
819
934
  }
935
+
936
+ private static Value value(String json) {
937
+ return PARSER.parse(json);
938
+ }
820
939
  }
@@ -2,10 +2,11 @@ package org.embulk.output.kintone;
2
2
 
3
3
  import com.kintone.client.model.record.FieldType;
4
4
  import com.kintone.client.model.record.Record;
5
- import com.kintone.client.model.record.UpdateKey;
6
5
  import java.util.Map;
6
+ import java.util.Set;
7
7
  import java.util.function.BiConsumer;
8
8
  import javax.validation.UnexpectedTypeException;
9
+ import org.embulk.output.kintone.record.IdOrUpdateKey;
9
10
  import org.embulk.spi.Column;
10
11
  import org.embulk.spi.Page;
11
12
  import org.embulk.spi.PageReader;
@@ -18,43 +19,52 @@ public class KintoneColumnVisitorVerifier {
18
19
  private final KintoneColumnVisitor visitor;
19
20
 
20
21
  public KintoneColumnVisitorVerifier(
21
- Schema schema, Map<String, KintoneColumnOption> options, String updateKeyName, Page page) {
22
- this(schema, options, false, false, updateKeyName, page);
22
+ Schema schema,
23
+ Set<Column> derived,
24
+ Map<String, KintoneColumnOption> options,
25
+ String reduceKeyName,
26
+ String updateKeyName,
27
+ Page page) {
28
+ this(schema, derived, options, false, false, reduceKeyName, updateKeyName, page);
23
29
  }
24
30
 
25
31
  public KintoneColumnVisitorVerifier(
26
32
  Schema schema,
33
+ Set<Column> derived,
27
34
  Map<String, KintoneColumnOption> options,
28
35
  boolean preferNulls,
29
36
  boolean ignoreNulls,
37
+ String reduceKeyName,
30
38
  String updateKeyName,
31
39
  Page page) {
32
40
  this.schema = schema;
33
41
  this.options = options;
34
42
  reader = new PageReader(schema);
35
43
  reader.setPage(page);
36
- visitor = new KintoneColumnVisitor(reader, options, preferNulls, ignoreNulls, updateKeyName);
44
+ visitor =
45
+ new KintoneColumnVisitor(
46
+ reader, derived, options, preferNulls, ignoreNulls, reduceKeyName, updateKeyName);
37
47
  }
38
48
 
39
49
  public void verify() {
40
50
  verify((record, updateKey) -> {});
41
51
  }
42
52
 
43
- public void verify(BiConsumer<Record, UpdateKey> consumer) {
53
+ public void verify(BiConsumer<Record, IdOrUpdateKey> consumer) {
44
54
  verify(consumer, false);
45
55
  }
46
56
 
47
- public void verify(BiConsumer<Record, UpdateKey> consumer, boolean nullable) {
57
+ public void verify(BiConsumer<Record, IdOrUpdateKey> consumer, boolean nullable) {
48
58
  if (!reader.nextRecord()) {
49
59
  throw new IllegalStateException();
50
60
  }
51
61
  Record record = new Record();
52
62
  visitor.setRecord(record);
53
- UpdateKey updateKey = new UpdateKey();
54
- visitor.setUpdateKey(updateKey);
63
+ IdOrUpdateKey idOrUpdateKey = new IdOrUpdateKey();
64
+ visitor.setIdOrUpdateKey(idOrUpdateKey);
55
65
  schema.visitColumns(visitor);
56
66
  schema.getColumns().forEach(column -> verify(record, column, nullable));
57
- consumer.accept(record, updateKey);
67
+ consumer.accept(record, idOrUpdateKey);
58
68
  }
59
69
 
60
70
  private void verify(Record record, Column column, boolean nullable) {