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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11c7f1cbe588863b206b1581bf2ec89adeafeea4
4
- data.tar.gz: c17ae7651f3409a6e51999e65233a96da2d87bf4
3
+ metadata.gz: abd297c9f29bedc191c3abc3837ff3955fdde7df
4
+ data.tar.gz: 5be528c62b5f1985b756f311699f74370b05a52b
5
5
  SHA512:
6
- metadata.gz: 4e1bc2fe10bc224c643d88c06a37a19bfe4849fb46318fede913ef3a3923e1315ce48b78aea8bbdcc5ea9a5b4760058776c569e8acedf8f02691b80b330c5657
7
- data.tar.gz: 9261603e49b45d2c8b72bf013d2995057293dd7f98ae0588f4dfa2f7e962b0ba2eac70990cdd7658eedf72a5caabd9cbb8f3135bc80cb91a7d250706c06081b4
6
+ metadata.gz: 040f72edfe4cfe79b4bc0c303653efc6d1fb93b84db8d009df9bf845e6bd1e712d4c222412db5c22bf21a9b1315cf6029b30c359294c664972c0fe369ed50345
7
+ data.tar.gz: 808579e76d0a6d854583d0d834f487f9a102b7cb827030d5857f4f0268f310f5f854135790904b9551cca9b489c58311434b4117a53426581642c79acced3ff0
data/README.md CHANGED
@@ -18,14 +18,32 @@ kintone output plugin for Embulk stores app records from kintone.
18
18
  - **guest_space_id**: kintone app belongs to guest space, guest space id is required. (integer, optional)
19
19
  - **mode**: kintone mode (string, required)
20
20
  - **update_key**: Column name to set update key (string, required if mode is update or upsert)
21
+ - **reduce_key**: Key column name to reduce expanded SUBTABLE (string, optional)
22
+ - **sort_columns**: List of columns for sorting input records (array of objects, optional)
23
+ - **name**: Column name (string, required)
24
+ - **order**: Sort order (string `asc` or `desc`, required)
25
+ - **max_sort_tmp_files**: Maximum number of temporary files for sorting input records (integer, default is `1024`)
26
+ - **max_sort_memory**: Maximum memory usage for sorting input records (bytes in long, default is the estimated available memory, which is the approximate value of the JVM's current free memory)
21
27
  - **prefer_nulls**: Whether to set fields to null instead of default value of type when column is null (boolean, default is `false`)
22
28
  - **ignore_nulls**: Whether to completely ignore fields when column is null (boolean, default is `false`)
29
+ - **skip_if_non_existing_id_or_update_key**: The skip policy if the record corresponding to the id or update key does not exist (string `auto`, `never` or `always`, default is `auto`). No effect for insert mode.
30
+ - **auto**:
31
+ - **update mode**: Skip the record if no id or update key value is specified.
32
+ - **upsert mode**: Skip the record if corresponds to the id does not exist or no update key value is specified.
33
+ - **never**: Never skip the record even if corresponds to the id or update key does not exist.
34
+ - **update mode**: Throw exception if no id or update key value is specified.
35
+ - **upsert mode**: Insert the record if corresponds to the id or update key does not exist (also, if no id or update key value is specified).
36
+ - **always**: Always skip the record if corresponds to the id or update key does not exist (also, if no id or update key value is specified). update mode and upsert mode will the same behavior (only updated, never inserted).
23
37
  - **column_options** advanced: a key-value pairs where key is a column name and value is options for the column.
24
38
  - **field_code**: field code (string, required)
25
39
  - **type**: field type (string, required). See [this page](https://cybozu.dev/ja/kintone/docs/overview/field-types/#field-type-update) for list of available types. However, following types are not yet supported
26
- - `USER_SELECT`, `ORGANIZATION_SELECT`, `GROUP_SELECT`, `FILE`, `SUBTABLE`
40
+ - `USER_SELECT`, `ORGANIZATION_SELECT`, `GROUP_SELECT`, `FILE`
27
41
  - **timezone**: timezone to convert into `date` (string, default is `UTC`)
28
42
  - **val_sep**: Used to specify multiple checkbox values (string, default is `,`)
43
+ - **sort_columns**: List of columns for sorting rows in SUBTABLE. Available only if type is `SUBTABLE` (array of objects, optional)
44
+ - **name**: Column name (string, required)
45
+ - **order**: Sort order (string `asc` or `desc`, required)
46
+ - **chunk_size**: Maximum number of records to request at once (integer, default is `100`)
29
47
 
30
48
  ## Example
31
49
 
@@ -46,6 +64,52 @@ out:
46
64
  date_time: {field_code: "datetime", type: "DATETIME"}
47
65
  ```
48
66
 
67
+ ### For reduce expanded SUBTABLE
68
+
69
+ ```yaml
70
+ out:
71
+ ...
72
+ reduce_key: id
73
+ column_options:
74
+ id: {field_code: "id", type: "NUMBER"}
75
+ ...
76
+ table: {field_code: "table", type: "SUBTABLE", sort_columns: [{name: number, order: asc}, {name: text, order: desc}]}
77
+ table.number: {field_code: "number_in_table", type: "NUMBER"}
78
+ table.text: {field_code: "text_in_table", type: "SINGLE_LINE_TEXT"}
79
+ ```
80
+
81
+ #### KINTONE
82
+
83
+ | Form | Field Code |
84
+ | ------------------------- | --------------- |
85
+ | Table's own | table |
86
+ | NUMBER In Table | number_in_table |
87
+ | SINGLE_LINE_TEXT In Table | text_in_table |
88
+
89
+ #### INPUT CSV
90
+
91
+ ```csv
92
+ id,table.number,table.text
93
+ 1,0,test0
94
+ 1,1,test1
95
+ 2,0,test0
96
+ ```
97
+
98
+ #### RESULT
99
+
100
+ ID:1
101
+
102
+ | NUMBER | SINGLE_LINE_TEXT |
103
+ | ------------- | ---------------- |
104
+ | 0 | test0 |
105
+ | 1 | test1 |
106
+
107
+ ID:2
108
+
109
+ | NUMBER | SINGLE_LINE_TEXT |
110
+ | ------------- | ---------------- |
111
+ | 0 | test0 |
112
+
49
113
  ## Build
50
114
 
51
115
  ```
data/build.gradle CHANGED
@@ -28,6 +28,7 @@ targetCompatibility = 1.8
28
28
 
29
29
  dependencies {
30
30
  compileOnly "org.embulk:embulk-core:0.9.23"
31
+ implementation "com.google.code.externalsortinginjava:externalsortinginjava:0.6.2"
31
32
  implementation project(path: ":shadow-kintone-java-client", configuration: "shadow")
32
33
 
33
34
  testImplementation "junit:junit:4.+"
Binary file
@@ -0,0 +1,117 @@
1
+ package org.embulk.output.kintone;
2
+
3
+ import com.kintone.client.KintoneClientBuilder;
4
+ import com.kintone.client.RecordClient;
5
+ import com.kintone.client.model.app.field.FieldProperty;
6
+ import com.kintone.client.model.record.FieldType;
7
+ import java.io.IOException;
8
+ import java.util.Map;
9
+ import java.util.function.Supplier;
10
+ import org.embulk.config.ConfigException;
11
+ import org.embulk.output.kintone.record.Id;
12
+ import org.embulk.output.kintone.util.Lazy;
13
+ import org.embulk.spi.Column;
14
+ import org.embulk.spi.Schema;
15
+ import org.embulk.spi.type.Type;
16
+ import org.embulk.spi.type.Types;
17
+
18
+ public class KintoneClient implements AutoCloseable {
19
+ private final PluginTask task;
20
+ private final Schema schema;
21
+ private final com.kintone.client.KintoneClient client;
22
+ private final Map<String, FieldProperty> fields;
23
+
24
+ public static Lazy<KintoneClient> lazy(Supplier<PluginTask> task, Schema schema) {
25
+ return new Lazy<KintoneClient>() {
26
+ @Override
27
+ protected KintoneClient initialValue() {
28
+ return new KintoneClient(task.get(), schema);
29
+ }
30
+ };
31
+ }
32
+
33
+ private KintoneClient(PluginTask task, Schema schema) {
34
+ this.task = task;
35
+ this.schema = schema;
36
+ KintoneClientBuilder builder = KintoneClientBuilder.create("https://" + task.getDomain());
37
+ if (task.getGuestSpaceId().isPresent()) {
38
+ builder.setGuestSpaceId(task.getGuestSpaceId().get());
39
+ }
40
+ if (task.getBasicAuthUsername().isPresent() && task.getBasicAuthPassword().isPresent()) {
41
+ builder.withBasicAuth(task.getBasicAuthUsername().get(), task.getBasicAuthPassword().get());
42
+ }
43
+ if (task.getUsername().isPresent() && task.getPassword().isPresent()) {
44
+ builder.authByPassword(task.getUsername().get(), task.getPassword().get());
45
+ } else if (task.getToken().isPresent()) {
46
+ builder.authByApiToken(task.getToken().get());
47
+ } else {
48
+ throw new ConfigException("Username and password or token must be configured.");
49
+ }
50
+ client = builder.build();
51
+ fields = client.app().getFormFields(task.getAppId());
52
+ KintoneMode.of(task).validate(task, this);
53
+ }
54
+
55
+ public void validateIdOrUpdateKey(String columnName) {
56
+ Column column = getColumn(columnName);
57
+ if (column == null) {
58
+ throw new ConfigException("The column '" + columnName + "' for update does not exist.");
59
+ }
60
+ validateId(column);
61
+ validateUpdateKey(column);
62
+ }
63
+
64
+ public Column getColumn(String columnName) {
65
+ return schema.getColumns().stream()
66
+ .filter(column -> column.getName().equals(columnName))
67
+ .findFirst()
68
+ .orElse(null);
69
+ }
70
+
71
+ public FieldType getFieldType(String fieldCode) {
72
+ FieldProperty field = fields.get(fieldCode);
73
+ return field == null ? null : field.getType();
74
+ }
75
+
76
+ public RecordClient record() {
77
+ return client.record();
78
+ }
79
+
80
+ @Override
81
+ public void close() {
82
+ try {
83
+ client.close();
84
+ } catch (IOException e) {
85
+ throw new RuntimeException("kintone throw exception", e);
86
+ }
87
+ }
88
+
89
+ private void validateId(Column column) {
90
+ if (!column.getName().equals(Id.FIELD)) {
91
+ return;
92
+ }
93
+ Type type = column.getType();
94
+ if (!type.equals(Types.LONG)) {
95
+ throw new ConfigException("The id column must be 'long'.");
96
+ }
97
+ }
98
+
99
+ private void validateUpdateKey(Column column) {
100
+ if (column.getName().equals(Id.FIELD)) {
101
+ return;
102
+ }
103
+ String fieldCode = getFieldCode(column);
104
+ FieldType fieldType = getFieldType(fieldCode);
105
+ if (fieldType == null) {
106
+ throw new ConfigException("The field '" + fieldCode + "' for update does not exist.");
107
+ }
108
+ if (fieldType != FieldType.SINGLE_LINE_TEXT && fieldType != FieldType.NUMBER) {
109
+ throw new ConfigException("The update_key must be 'SINGLE_LINE_TEXT' or 'NUMBER'.");
110
+ }
111
+ }
112
+
113
+ private String getFieldCode(Column column) {
114
+ KintoneColumnOption option = task.getColumnOptions().get(column.getName());
115
+ return option != null ? option.getFieldCode() : column.getName();
116
+ }
117
+ }
@@ -1,5 +1,6 @@
1
1
  package org.embulk.output.kintone;
2
2
 
3
+ import java.util.List;
3
4
  import org.embulk.config.Config;
4
5
  import org.embulk.config.ConfigDefault;
5
6
  import org.embulk.config.Task;
@@ -18,4 +19,8 @@ public interface KintoneColumnOption extends Task {
18
19
  @Config("val_sep")
19
20
  @ConfigDefault("\",\"")
20
21
  String getValueSeparator();
22
+
23
+ @Config("sort_columns")
24
+ @ConfigDefault("[]")
25
+ List<KintoneSortColumn> getSortColumns();
21
26
  }
@@ -13,6 +13,7 @@ import com.kintone.client.model.record.MultiSelectFieldValue;
13
13
  import com.kintone.client.model.record.NumberFieldValue;
14
14
  import com.kintone.client.model.record.OrganizationSelectFieldValue;
15
15
  import com.kintone.client.model.record.RadioButtonFieldValue;
16
+ import com.kintone.client.model.record.Record;
16
17
  import com.kintone.client.model.record.RichTextFieldValue;
17
18
  import com.kintone.client.model.record.SingleLineTextFieldValue;
18
19
  import com.kintone.client.model.record.SubtableFieldValue;
@@ -29,8 +30,15 @@ import java.time.ZonedDateTime;
29
30
  import java.util.Arrays;
30
31
  import java.util.Collections;
31
32
  import java.util.List;
33
+ import java.util.stream.Collectors;
34
+ import org.embulk.output.kintone.deserializer.Deserializer;
32
35
  import org.embulk.spi.time.Timestamp;
36
+ import org.embulk.spi.type.Type;
37
+ import org.embulk.spi.type.Types;
38
+ import org.msgpack.value.ArrayValue;
39
+ import org.msgpack.value.StringValue;
33
40
  import org.msgpack.value.Value;
41
+ import org.msgpack.value.ValueFactory;
34
42
 
35
43
  public enum KintoneColumnType {
36
44
  SINGLE_LINE_TEXT {
@@ -44,6 +52,11 @@ public enum KintoneColumnType {
44
52
  return new SingleLineTextFieldValue(value);
45
53
  }
46
54
 
55
+ @Override
56
+ public String getValue(Record record, String fieldCode) {
57
+ return record.getSingleLineTextFieldValue(fieldCode);
58
+ }
59
+
47
60
  @Override
48
61
  public void setUpdateKey(UpdateKey updateKey, String field) {
49
62
  updateKey.setField(field);
@@ -53,6 +66,16 @@ public enum KintoneColumnType {
53
66
  public void setUpdateKey(UpdateKey updateKey, String field, FieldValue value) {
54
67
  updateKey.setField(field).setValue(((SingleLineTextFieldValue) value).getValue());
55
68
  }
69
+
70
+ @Override
71
+ public StringValue asValue(FieldValue value) {
72
+ return ValueFactory.newString(((SingleLineTextFieldValue) value).getValue());
73
+ }
74
+
75
+ @Override
76
+ protected List<Type> getSupportedTypes() {
77
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP, Types.JSON);
78
+ }
56
79
  },
57
80
  MULTI_LINE_TEXT {
58
81
  @Override
@@ -64,6 +87,16 @@ public enum KintoneColumnType {
64
87
  public MultiLineTextFieldValue getFieldValue(String value, KintoneColumnOption option) {
65
88
  return new MultiLineTextFieldValue(value);
66
89
  }
90
+
91
+ @Override
92
+ public StringValue asValue(FieldValue value) {
93
+ return ValueFactory.newString(((MultiLineTextFieldValue) value).getValue());
94
+ }
95
+
96
+ @Override
97
+ protected List<Type> getSupportedTypes() {
98
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP, Types.JSON);
99
+ }
67
100
  },
68
101
  RICH_TEXT {
69
102
  @Override
@@ -75,6 +108,16 @@ public enum KintoneColumnType {
75
108
  public RichTextFieldValue getFieldValue(String value, KintoneColumnOption option) {
76
109
  return new RichTextFieldValue(value);
77
110
  }
111
+
112
+ @Override
113
+ public StringValue asValue(FieldValue value) {
114
+ return ValueFactory.newString(((RichTextFieldValue) value).getValue());
115
+ }
116
+
117
+ @Override
118
+ protected List<Type> getSupportedTypes() {
119
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP, Types.JSON);
120
+ }
78
121
  },
79
122
  NUMBER {
80
123
  @Override
@@ -97,6 +140,11 @@ public enum KintoneColumnType {
97
140
  return (NumberFieldValue) getFieldValue(value.getEpochSecond(), option);
98
141
  }
99
142
 
143
+ @Override
144
+ public BigDecimal getValue(Record record, String fieldCode) {
145
+ return record.getNumberFieldValue(fieldCode);
146
+ }
147
+
100
148
  @Override
101
149
  public void setUpdateKey(UpdateKey updateKey, String field) {
102
150
  updateKey.setField(field);
@@ -106,6 +154,16 @@ public enum KintoneColumnType {
106
154
  public void setUpdateKey(UpdateKey updateKey, String field, FieldValue value) {
107
155
  updateKey.setField(field).setValue(((NumberFieldValue) value).getValue());
108
156
  }
157
+
158
+ @Override
159
+ public StringValue asValue(FieldValue value) {
160
+ return ValueFactory.newString(((NumberFieldValue) value).getValue().toPlainString());
161
+ }
162
+
163
+ @Override
164
+ protected List<Type> getSupportedTypes() {
165
+ return Arrays.asList(Types.BOOLEAN, Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
166
+ }
109
167
  },
110
168
  CHECK_BOX {
111
169
  @Override
@@ -117,6 +175,18 @@ public enum KintoneColumnType {
117
175
  public CheckBoxFieldValue getFieldValue(String value, KintoneColumnOption option) {
118
176
  return new CheckBoxFieldValue(asList(value, option));
119
177
  }
178
+
179
+ @Override
180
+ public ArrayValue asValue(FieldValue value) {
181
+ return ValueFactory.newArray(
182
+ ((CheckBoxFieldValue) value)
183
+ .getValues().stream().map(ValueFactory::newString).collect(Collectors.toList()));
184
+ }
185
+
186
+ @Override
187
+ protected List<Type> getSupportedTypes() {
188
+ return Collections.emptyList();
189
+ }
120
190
  },
121
191
  RADIO_BUTTON {
122
192
  @Override
@@ -128,6 +198,16 @@ public enum KintoneColumnType {
128
198
  public RadioButtonFieldValue getFieldValue(String value, KintoneColumnOption option) {
129
199
  return new RadioButtonFieldValue(value);
130
200
  }
201
+
202
+ @Override
203
+ public StringValue asValue(FieldValue value) {
204
+ return ValueFactory.newString(((RadioButtonFieldValue) value).getValue());
205
+ }
206
+
207
+ @Override
208
+ protected List<Type> getSupportedTypes() {
209
+ return Collections.emptyList();
210
+ }
131
211
  },
132
212
  MULTI_SELECT {
133
213
  @Override
@@ -139,6 +219,18 @@ public enum KintoneColumnType {
139
219
  public MultiSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
140
220
  return new MultiSelectFieldValue(asList(value, option));
141
221
  }
222
+
223
+ @Override
224
+ public ArrayValue asValue(FieldValue value) {
225
+ return ValueFactory.newArray(
226
+ ((MultiSelectFieldValue) value)
227
+ .getValues().stream().map(ValueFactory::newString).collect(Collectors.toList()));
228
+ }
229
+
230
+ @Override
231
+ protected List<Type> getSupportedTypes() {
232
+ return Collections.emptyList();
233
+ }
142
234
  },
143
235
  DROP_DOWN {
144
236
  @Override
@@ -150,6 +242,16 @@ public enum KintoneColumnType {
150
242
  public DropDownFieldValue getFieldValue(String value, KintoneColumnOption option) {
151
243
  return new DropDownFieldValue(value);
152
244
  }
245
+
246
+ @Override
247
+ public StringValue asValue(FieldValue value) {
248
+ return ValueFactory.newString(((DropDownFieldValue) value).getValue());
249
+ }
250
+
251
+ @Override
252
+ protected List<Type> getSupportedTypes() {
253
+ return Collections.emptyList();
254
+ }
153
255
  },
154
256
  USER_SELECT {
155
257
  @Override
@@ -161,6 +263,16 @@ public enum KintoneColumnType {
161
263
  public UserSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
162
264
  throw new UnsupportedOperationException();
163
265
  }
266
+
267
+ @Override
268
+ public Value asValue(FieldValue value) {
269
+ throw new UnsupportedOperationException();
270
+ }
271
+
272
+ @Override
273
+ protected List<Type> getSupportedTypes() {
274
+ return Collections.emptyList();
275
+ }
164
276
  },
165
277
  ORGANIZATION_SELECT {
166
278
  @Override
@@ -172,6 +284,16 @@ public enum KintoneColumnType {
172
284
  public OrganizationSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
173
285
  throw new UnsupportedOperationException();
174
286
  }
287
+
288
+ @Override
289
+ public Value asValue(FieldValue value) {
290
+ throw new UnsupportedOperationException();
291
+ }
292
+
293
+ @Override
294
+ protected List<Type> getSupportedTypes() {
295
+ return Collections.emptyList();
296
+ }
175
297
  },
176
298
  GROUP_SELECT {
177
299
  @Override
@@ -183,6 +305,16 @@ public enum KintoneColumnType {
183
305
  public GroupSelectFieldValue getFieldValue(String value, KintoneColumnOption option) {
184
306
  throw new UnsupportedOperationException();
185
307
  }
308
+
309
+ @Override
310
+ public Value asValue(FieldValue value) {
311
+ throw new UnsupportedOperationException();
312
+ }
313
+
314
+ @Override
315
+ protected List<Type> getSupportedTypes() {
316
+ return Collections.emptyList();
317
+ }
186
318
  },
187
319
  DATE {
188
320
  @Override
@@ -215,6 +347,16 @@ public enum KintoneColumnType {
215
347
  public DateFieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
216
348
  return new DateFieldValue(value.getInstant().atZone(getZoneId(option)).toLocalDate());
217
349
  }
350
+
351
+ @Override
352
+ public StringValue asValue(FieldValue value) {
353
+ return ValueFactory.newString(((DateFieldValue) value).getValue().toString());
354
+ }
355
+
356
+ @Override
357
+ protected List<Type> getSupportedTypes() {
358
+ return Arrays.asList(Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
359
+ }
218
360
  },
219
361
  TIME {
220
362
  @Override
@@ -247,6 +389,16 @@ public enum KintoneColumnType {
247
389
  public TimeFieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
248
390
  return new TimeFieldValue(value.getInstant().atZone(getZoneId(option)).toLocalTime());
249
391
  }
392
+
393
+ @Override
394
+ public StringValue asValue(FieldValue value) {
395
+ return ValueFactory.newString(((TimeFieldValue) value).getValue().toString());
396
+ }
397
+
398
+ @Override
399
+ protected List<Type> getSupportedTypes() {
400
+ return Arrays.asList(Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
401
+ }
250
402
  },
251
403
  DATETIME {
252
404
  @Override
@@ -275,6 +427,16 @@ public enum KintoneColumnType {
275
427
  public DateTimeFieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
276
428
  return new DateTimeFieldValue(value.getInstant().atZone(ZoneOffset.UTC));
277
429
  }
430
+
431
+ @Override
432
+ public StringValue asValue(FieldValue value) {
433
+ return ValueFactory.newString(((DateTimeFieldValue) value).getValue().toString());
434
+ }
435
+
436
+ @Override
437
+ protected List<Type> getSupportedTypes() {
438
+ return Arrays.asList(Types.LONG, Types.DOUBLE, Types.TIMESTAMP);
439
+ }
278
440
  },
279
441
  LINK {
280
442
  @Override
@@ -286,6 +448,16 @@ public enum KintoneColumnType {
286
448
  public LinkFieldValue getFieldValue(String value, KintoneColumnOption option) {
287
449
  return new LinkFieldValue(value);
288
450
  }
451
+
452
+ @Override
453
+ public StringValue asValue(FieldValue value) {
454
+ return ValueFactory.newString(((LinkFieldValue) value).getValue());
455
+ }
456
+
457
+ @Override
458
+ protected List<Type> getSupportedTypes() {
459
+ return Collections.emptyList();
460
+ }
289
461
  },
290
462
  FILE {
291
463
  @Override
@@ -297,6 +469,16 @@ public enum KintoneColumnType {
297
469
  public FileFieldValue getFieldValue(String value, KintoneColumnOption option) {
298
470
  throw new UnsupportedOperationException();
299
471
  }
472
+
473
+ @Override
474
+ public Value asValue(FieldValue value) {
475
+ throw new UnsupportedOperationException();
476
+ }
477
+
478
+ @Override
479
+ protected List<Type> getSupportedTypes() {
480
+ return Collections.emptyList();
481
+ }
300
482
  },
301
483
  SUBTABLE {
302
484
  @Override
@@ -306,9 +488,20 @@ public enum KintoneColumnType {
306
488
 
307
489
  @Override
308
490
  public SubtableFieldValue getFieldValue(String value, KintoneColumnOption option) {
491
+ return DESERIALIZER.deserialize(value.isEmpty() ? "[]" : value, SubtableFieldValue.class);
492
+ }
493
+
494
+ @Override
495
+ public Value asValue(FieldValue value) {
309
496
  throw new UnsupportedOperationException();
310
497
  }
498
+
499
+ @Override
500
+ protected List<Type> getSupportedTypes() {
501
+ return Collections.singletonList(Types.JSON);
502
+ }
311
503
  };
504
+ private static final Deserializer DESERIALIZER = new Deserializer();
312
505
  private static final Timestamp EPOCH = Timestamp.ofInstant(Instant.EPOCH);
313
506
 
314
507
  public static KintoneColumnType getType(
@@ -319,25 +512,49 @@ public enum KintoneColumnType {
319
512
  public abstract FieldValue getFieldValue();
320
513
 
321
514
  public FieldValue getFieldValue(boolean value, KintoneColumnOption option) {
322
- return getFieldValue(String.valueOf(value), option);
515
+ if (getSupportedTypes().contains(Types.BOOLEAN)) {
516
+ return getFieldValue(String.valueOf(value), option);
517
+ } else {
518
+ throw new UnsupportedOperationException();
519
+ }
323
520
  }
324
521
 
325
522
  public FieldValue getFieldValue(long value, KintoneColumnOption option) {
326
- return getFieldValue(String.valueOf(value), option);
523
+ if (getSupportedTypes().contains(Types.LONG)) {
524
+ return getFieldValue(String.valueOf(value), option);
525
+ } else {
526
+ throw new UnsupportedOperationException();
527
+ }
327
528
  }
328
529
 
329
530
  public FieldValue getFieldValue(double value, KintoneColumnOption option) {
330
- return getFieldValue(String.valueOf(value), option);
531
+ if (getSupportedTypes().contains(Types.DOUBLE)) {
532
+ return getFieldValue(String.valueOf(value), option);
533
+ } else {
534
+ throw new UnsupportedOperationException();
535
+ }
331
536
  }
332
537
 
333
538
  public abstract FieldValue getFieldValue(String value, KintoneColumnOption option);
334
539
 
335
540
  public FieldValue getFieldValue(Timestamp value, KintoneColumnOption option) {
336
- return getFieldValue(value.getInstant().toString(), option);
541
+ if (getSupportedTypes().contains(Types.TIMESTAMP)) {
542
+ return getFieldValue(value.getInstant().toString(), option);
543
+ } else {
544
+ throw new UnsupportedOperationException();
545
+ }
337
546
  }
338
547
 
339
548
  public FieldValue getFieldValue(Value value, KintoneColumnOption option) {
340
- return getFieldValue(value.toJson(), option);
549
+ if (getSupportedTypes().contains(Types.JSON)) {
550
+ return getFieldValue(value.toJson(), option);
551
+ } else {
552
+ throw new UnsupportedOperationException();
553
+ }
554
+ }
555
+
556
+ public Object getValue(Record Record, String fieldCode) {
557
+ throw new UnsupportedOperationException();
341
558
  }
342
559
 
343
560
  public void setUpdateKey(UpdateKey updateKey, String field) {
@@ -348,6 +565,10 @@ public enum KintoneColumnType {
348
565
  throw new UnsupportedOperationException();
349
566
  }
350
567
 
568
+ public abstract Value asValue(FieldValue value);
569
+
570
+ protected abstract List<Type> getSupportedTypes();
571
+
351
572
  private static List<String> asList(String value, KintoneColumnOption option) {
352
573
  return value.isEmpty()
353
574
  ? Collections.emptyList()