|
6 | 6 | import org.apache.beam.sdk.values.PCollection; |
7 | 7 | import org.apache.beam.sdk.values.PDone; |
8 | 8 | import org.apache.beam.sdk.values.Row; |
| 9 | +import org.checkerframework.checker.initialization.qual.Initialized; |
| 10 | +import org.checkerframework.checker.nullness.qual.Nullable; |
| 11 | +import org.checkerframework.checker.nullness.qual.UnknownKeyFor; |
| 12 | +import org.joda.time.ReadableDateTime; |
9 | 13 | import org.ohnlp.backbone.api.annotations.ComponentDescription; |
10 | 14 | import org.ohnlp.backbone.api.annotations.ConfigurationProperty; |
11 | 15 | import org.ohnlp.backbone.api.annotations.InputColumnProperty; |
|
14 | 18 | import org.ohnlp.backbone.api.exceptions.ComponentInitializationException; |
15 | 19 |
|
16 | 20 | import java.io.Serializable; |
| 21 | +import java.math.BigDecimal; |
17 | 22 | import java.sql.PreparedStatement; |
18 | 23 | import java.sql.SQLException; |
19 | 24 | import java.sql.Timestamp; |
| 25 | +import java.sql.Types; |
20 | 26 | import java.util.LinkedList; |
21 | 27 | import java.util.List; |
22 | 28 |
|
@@ -143,57 +149,112 @@ public void map(Row row, PreparedStatement ps) throws SQLException { |
143 | 149 | switch (type) { |
144 | 150 | case BYTE: |
145 | 151 | this.execute = (data, statement) -> { |
146 | | - statement.setByte(this.idx, data.getByte(this.fieldName)); |
| 152 | + @Nullable @UnknownKeyFor @Initialized Byte val = data.getByte(this.fieldName); |
| 153 | + if (val != null) { |
| 154 | + statement.setByte(this.idx, val); |
| 155 | + } else { |
| 156 | + statement.setNull(this.idx, Types.TINYINT); |
| 157 | + } |
147 | 158 | }; |
148 | 159 | break; |
149 | 160 | case INT16: |
150 | 161 | this.execute = (data, statement) -> { |
151 | | - statement.setShort(this.idx, data.getInt16(this.fieldName)); |
| 162 | + Short val = data.getInt16(this.fieldName); |
| 163 | + if (val != null) { |
| 164 | + statement.setShort(this.idx, val); |
| 165 | + } else { |
| 166 | + statement.setNull(this.idx, Types.SMALLINT); |
| 167 | + } |
152 | 168 | }; |
153 | 169 | break; |
154 | 170 | case INT32: |
155 | 171 | this.execute = (data, statement) -> { |
156 | | - statement.setInt(this.idx, data.getInt32(this.fieldName)); |
| 172 | + Integer val = data.getInt32(this.fieldName); |
| 173 | + if (val != null) { |
| 174 | + statement.setInt(this.idx, val); |
| 175 | + } else { |
| 176 | + statement.setNull(this.idx, Types.INTEGER); |
| 177 | + } |
157 | 178 | }; |
158 | 179 | break; |
159 | 180 | case INT64: |
160 | 181 | this.execute = (data, statement) -> { |
161 | | - statement.setLong(this.idx, data.getInt64(this.fieldName)); |
| 182 | + Long val = data.getInt64(this.fieldName); |
| 183 | + if (val != null) { |
| 184 | + statement.setLong(this.idx, val); |
| 185 | + } else { |
| 186 | + statement.setNull(this.idx, Types.BIGINT); |
| 187 | + } |
162 | 188 | }; |
163 | 189 | break; |
164 | 190 | case DECIMAL: |
165 | 191 | this.execute = (data, statement) -> { |
166 | | - statement.setBigDecimal(this.idx, data.getDecimal(this.fieldName)); |
| 192 | + BigDecimal val = data.getDecimal(this.fieldName); |
| 193 | + if (val != null) { |
| 194 | + statement.setBigDecimal(this.idx, val); |
| 195 | + } else { |
| 196 | + statement.setNull(this.idx, Types.DECIMAL); |
| 197 | + } |
167 | 198 | }; |
168 | 199 | break; |
169 | 200 | case FLOAT: |
170 | 201 | this.execute = (data, statement) -> { |
171 | | - statement.setFloat(this.idx, data.getFloat(this.fieldName)); |
| 202 | + Float val = data.getFloat(this.fieldName); |
| 203 | + if (val != null) { |
| 204 | + statement.setFloat(this.idx, val); |
| 205 | + } else { |
| 206 | + statement.setNull(this.idx, Types.FLOAT); |
| 207 | + } |
172 | 208 | }; |
173 | 209 | break; |
174 | 210 | case DOUBLE: |
175 | 211 | this.execute = (data, statement) -> { |
176 | | - statement.setDouble(this.idx, data.getDouble(this.fieldName)); |
| 212 | + Double val = data.getDouble(this.fieldName); |
| 213 | + if (val != null) { |
| 214 | + statement.setDouble(this.idx, val); |
| 215 | + } else { |
| 216 | + statement.setNull(this.idx, Types.DOUBLE); |
| 217 | + } |
177 | 218 | }; |
178 | 219 | break; |
179 | 220 | case STRING: |
180 | 221 | this.execute = (data, statement) -> { |
181 | | - statement.setString(this.idx, data.getString(this.fieldName)); |
| 222 | + String val = data.getString(this.fieldName); |
| 223 | + if (val != null) { |
| 224 | + statement.setString(this.idx, val); |
| 225 | + } else { |
| 226 | + statement.setNull(this.idx, Types.VARCHAR); |
| 227 | + } |
182 | 228 | }; |
183 | 229 | break; |
184 | 230 | case DATETIME: |
185 | 231 | this.execute = (data, statement) -> { |
186 | | - statement.setTimestamp(this.idx, new Timestamp(data.getDateTime(this.fieldName).getMillis())); |
| 232 | + ReadableDateTime val = data.getDateTime(this.fieldName); |
| 233 | + if (val != null) { |
| 234 | + statement.setTimestamp(this.idx, new Timestamp(val.getMillis())); |
| 235 | + } else { |
| 236 | + statement.setNull(this.idx, Types.TIMESTAMP); |
| 237 | + } |
187 | 238 | }; |
188 | 239 | break; |
189 | 240 | case BOOLEAN: |
190 | 241 | this.execute = (data, statement) -> { |
191 | | - statement.setBoolean(this.idx, data.getBoolean(this.fieldName)); |
| 242 | + Boolean val = data.getBoolean(this.fieldName); |
| 243 | + if (val != null) { |
| 244 | + statement.setBoolean(this.idx, val); |
| 245 | + } else { |
| 246 | + statement.setNull(this.idx, Types.BOOLEAN); |
| 247 | + } |
192 | 248 | }; |
193 | 249 | break; |
194 | 250 | case BYTES: |
195 | 251 | this.execute = (data, statement) -> { |
196 | | - statement.setBytes(this.idx, data.getBytes(this.fieldName)); |
| 252 | + byte[] val = data.getBytes(this.fieldName); |
| 253 | + if (val != null) { |
| 254 | + statement.setBytes(this.idx, val); |
| 255 | + } else { |
| 256 | + statement.setNull(this.idx, Types.VARBINARY); |
| 257 | + } |
197 | 258 | }; |
198 | 259 | break; |
199 | 260 | default: |
|
0 commit comments