2525import io .cdap .cdap .etl .api .batch .BatchSink ;
2626import io .cdap .cdap .etl .mock .batch .MockSource ;
2727import io .cdap .cdap .etl .proto .v2 .ETLPlugin ;
28+ import io .cdap .cdap .test .ApplicationManager ;
2829import io .cdap .cdap .test .DataSetManager ;
2930import io .cdap .plugin .common .Constants ;
3031import io .cdap .plugin .db .batch .sink .AbstractDBSink ;
5152 * Test for ETL using databases.
5253 */
5354public class Db2SinkTestRun extends Db2PluginTestBase {
55+ private static final Schema SCHEMA = Schema .recordOf (
56+ "dbRecord" ,
57+ Schema .Field .of ("SMALLINT_COL" , Schema .of (Schema .Type .INT )),
58+ Schema .Field .of ("INTEGER_COL" , Schema .of (Schema .Type .INT )),
59+ Schema .Field .of ("BIGINT_COL" , Schema .of (Schema .Type .LONG )),
60+ Schema .Field .of ("DECIMAL_COL" , Schema .decimalOf (10 , 6 )),
61+ Schema .Field .of ("NUMERIC_COL" , Schema .decimalOf (10 , 6 )),
62+ Schema .Field .of ("DECFLOAT_COL" , Schema .of (Schema .Type .STRING )),
63+ Schema .Field .of ("REAL_COL" , Schema .of (Schema .Type .FLOAT )),
64+ Schema .Field .of ("DOUBLE_COL" , Schema .of (Schema .Type .DOUBLE )),
65+ Schema .Field .of ("CHAR_COL" , Schema .of (Schema .Type .STRING )),
66+ Schema .Field .of ("VARCHAR_COL" , Schema .of (Schema .Type .STRING )),
67+ Schema .Field .of ("CHAR_BIT_COL" , Schema .of (Schema .Type .BYTES )),
68+ Schema .Field .of ("VARCHAR_BIT_COL" , Schema .of (Schema .Type .BYTES )),
69+ Schema .Field .of ("GRAPHIC_COL" , Schema .of (Schema .Type .STRING )),
70+ Schema .Field .of ("CLOB_COL" , Schema .of (Schema .Type .STRING )),
71+ Schema .Field .of ("BLOB_COL" , Schema .of (Schema .Type .BYTES )),
72+ Schema .Field .of ("DATE_COL" , Schema .of (Schema .LogicalType .DATE )),
73+ Schema .Field .of ("TIME_COL" , Schema .of (Schema .LogicalType .TIME_MICROS )),
74+ Schema .Field .of ("TIMESTAMP_COL" , Schema .of (Schema .LogicalType .TIMESTAMP_MICROS )),
75+ Schema .Field .of ("BINARY_COL" , Schema .of (Schema .Type .BYTES )),
76+ Schema .Field .of ("VARBINARY_COL" , Schema .of (Schema .Type .BYTES )),
77+ Schema .Field .of ("VARGRAPHIC_COL" , Schema .of (Schema .Type .STRING )),
78+ Schema .Field .of ("DBCLOB_COL" , Schema .of (Schema .Type .STRING ))
79+ );
5480
5581 @ Before
5682 public void setup () throws Exception {
@@ -82,27 +108,55 @@ public void testDBSinkWithDBSchemaAndInvalidData() throws Exception {
82108 }
83109
84110 @ Test
85- public void testDBSink () throws Exception {
111+ public void testDBSinkWithExplicitInputSchema () throws Exception {
112+ testDBSink ("testDBSinkWithExplicitInputSchema" , "input-dbsinktest-explicit" , true );
113+ }
114+
115+ @ Test
116+ public void testDBSinkWithInferredInputSchema () throws Exception {
117+ testDBSink ("testDBSinkWithInferredInputSchema" , "input-dbsinktest-inferred" , false );
118+ }
86119
87- String inputDatasetName = "input-dbsinktest" ;
120+ public void testDBSink (String appName , String inputDatasetName , boolean setInputSchema ) throws Exception {
121+ ETLPlugin sourceConfig = (setInputSchema )
122+ ? MockSource .getPlugin (inputDatasetName , SCHEMA )
123+ : MockSource .getPlugin (inputDatasetName );
88124
89- ETLPlugin sourceConfig = MockSource .getPlugin (inputDatasetName );
90125 ETLPlugin sinkConfig = getSinkConfig ();
91126
92- deployETL (sourceConfig , sinkConfig , DATAPIPELINE_ARTIFACT , "testDBSink" );
127+ ApplicationManager appManager = deployETL (sourceConfig , sinkConfig , DATAPIPELINE_ARTIFACT , appName );
93128 createInputData (inputDatasetName );
94-
129+ runETLOnce ( appManager , ImmutableMap . of ( "logical.start.time" , String . valueOf ( CURRENT_TS )));
95130
96131 try (Connection conn = createConnection ();
97132 Statement stmt = conn .createStatement ();
98- ResultSet resultSet = stmt .executeQuery ("SELECT * FROM my_table " )) {
133+ ResultSet resultSet = stmt .executeQuery ("SELECT * FROM MY_DEST_TABLE ORDER BY SMALLINT_COL " )) {
99134 Set <String > users = new HashSet <>();
135+
100136 Assert .assertTrue (resultSet .next ());
101137 users .add (resultSet .getString ("VARCHAR_COL" ));
138+ Assert .assertEquals (1 , resultSet .getInt ("SMALLINT_COL" ));
139+ Assert .assertEquals (1 , resultSet .getInt ("INTEGER_COL" ));
140+ Assert .assertEquals (1L , resultSet .getLong ("BIGINT_COL" ));
141+ Assert .assertEquals (3.458 , resultSet .getBigDecimal ("NUMERIC_COL" ).doubleValue (), 0.00001 );
142+ Assert .assertEquals (3.459 , resultSet .getBigDecimal ("DECIMAL_COL" ).doubleValue (), 0.00001 );
143+ Assert .assertEquals (1.42 , resultSet .getDouble ("DECFLOAT_COL" ), 0.00001 );
144+ Assert .assertEquals (25.123f , resultSet .getFloat ("REAL_COL" ), 0.00001f );
145+ Assert .assertEquals (3.456 , resultSet .getDouble ("DOUBLE_COL" ), 0.00001 );
146+ Assert .assertEquals ("user1" , resultSet .getString ("CHAR_COL" ).trim ());
147+ Assert .assertEquals ("user1" , resultSet .getString ("VARCHAR_COL" ));
148+ Assert .assertEquals ("user1" , Bytes .toString (resultSet .getBytes ("CHAR_BIT_COL" ), 0 , 5 ));
149+ Assert .assertEquals ("user1" , Bytes .toString (resultSet .getBytes ("VARCHAR_BIT_COL" )));
150+ Assert .assertEquals ("user1" , resultSet .getString ("GRAPHIC_COL" ).trim ());
102151 Assert .assertEquals (new Date (CURRENT_TS ).toString (), resultSet .getDate ("DATE_COL" ).toString ());
103152 Assert .assertEquals (new Time (CURRENT_TS ).toString (), resultSet .getTime ("TIME_COL" ).toString ());
104153 Assert .assertEquals (new Timestamp (CURRENT_TS ), resultSet .getTimestamp ("TIMESTAMP_COL" ));
154+ Assert .assertEquals ("user1" , Bytes .toString (resultSet .getBytes ("BINARY_COL" ), 0 , 5 ));
155+ Assert .assertEquals ("user1" , Bytes .toString (resultSet .getBytes ("VARBINARY_COL" )));
156+ Assert .assertEquals ("user1" , resultSet .getString ("VARGRAPHIC_COL" ).trim ());
157+ Assert .assertEquals ("user1" , resultSet .getString ("DBCLOB_COL" ));
105158 Assert .assertTrue (resultSet .next ());
159+ users .add (resultSet .getString ("VARCHAR_COL" ));
106160 Assert .assertEquals ("user2" , Bytes .toString (resultSet .getBytes ("BLOB_COL" ), 0 , 5 ));
107161 Assert .assertEquals ("user2" , resultSet .getString ("CLOB_COL" ));
108162 Assert .assertEquals (new BigDecimal (3.458 , new MathContext (PRECISION )).setScale (SCALE ),
@@ -111,7 +165,6 @@ public void testDBSink() throws Exception {
111165 resultSet .getBigDecimal ("DECIMAL_COL" ));
112166 users .add (resultSet .getString ("VARCHAR_COL" ));
113167 Assert .assertEquals (ImmutableSet .of ("user1" , "user2" ), users );
114-
115168 }
116169 }
117170
@@ -146,50 +199,33 @@ protected void writeDataForInvalidDataWriteTest(String inputDatasetName, String
146199 private void createInputData (String inputDatasetName ) throws Exception {
147200 // add some data to the input table
148201 DataSetManager <Table > inputManager = getDataset (inputDatasetName );
149- Schema schema = Schema .recordOf (
150- "dbRecord" ,
151- Schema .Field .of ("SMALLINT_COL" , Schema .of (Schema .Type .INT )),
152- Schema .Field .of ("INTEGER_COL" , Schema .of (Schema .Type .INT )),
153- Schema .Field .of ("BIGINT_COL" , Schema .of (Schema .Type .LONG )),
154- Schema .Field .of ("DECIMAL_COL" , Schema .decimalOf (PRECISION , SCALE )),
155- Schema .Field .of ("NUMERIC_COL" , Schema .decimalOf (PRECISION , SCALE )),
156- Schema .Field .of ("DECFLOAT_COL" , Schema .of (Schema .Type .DOUBLE )),
157- Schema .Field .of ("REAL_COL" , Schema .of (Schema .Type .FLOAT )),
158- Schema .Field .of ("DOUBLE_COL" , Schema .of (Schema .Type .DOUBLE )),
159- Schema .Field .of ("CHAR_COL" , Schema .of (Schema .Type .STRING )),
160- Schema .Field .of ("VARCHAR_COL" , Schema .of (Schema .Type .STRING )),
161- Schema .Field .of ("CHAR_BIT_COL" , Schema .of (Schema .Type .STRING )),
162- Schema .Field .of ("VARCHAR_BIT_COL" , Schema .of (Schema .Type .STRING )),
163- Schema .Field .of ("GRAPHIC_COL" , Schema .of (Schema .Type .STRING )),
164- Schema .Field .of ("CLOB_COL" , Schema .of (Schema .Type .BYTES )),
165- Schema .Field .of ("BLOB_COL" , Schema .of (Schema .Type .BYTES )),
166- Schema .Field .of ("DATE_COL" , Schema .of (Schema .LogicalType .DATE )),
167- Schema .Field .of ("TIME_COL" , Schema .of (Schema .LogicalType .TIME_MICROS )),
168- Schema .Field .of ("TIMESTAMP_COL" , Schema .of (Schema .LogicalType .TIMESTAMP_MICROS ))
169- );
170202 List <StructuredRecord > inputRecords = new ArrayList <>();
171203 LocalDateTime localDateTime = new Timestamp (CURRENT_TS ).toLocalDateTime ();
172204 for (int i = 1 ; i <= 2 ; i ++) {
173205 String name = "user" + i ;
174- inputRecords .add (StructuredRecord .builder (schema )
206+ inputRecords .add (StructuredRecord .builder (SCHEMA )
175207 .set ("SMALLINT_COL" , i )
176208 .set ("INTEGER_COL" , i )
177209 .set ("BIGINT_COL" , (long ) i )
178210 .setDecimal ("NUMERIC_COL" , new BigDecimal (3.458d , new MathContext (PRECISION )).setScale (SCALE ))
179211 .setDecimal ("DECIMAL_COL" , new BigDecimal (3.459d , new MathContext (PRECISION )).setScale (SCALE ))
180- .set ("DECFLOAT_COL" , . 42 + i )
181- .set ("REAL_COL" , 24f + i )
212+ .set ("DECFLOAT_COL" , Double . toString ( . 42 + i ) )
213+ .set ("REAL_COL" , 24.123f + i )
182214 .set ("DOUBLE_COL" , 3.456 )
183215 .set ("CHAR_COL" , name )
184216 .set ("VARCHAR_COL" , name )
185- .set ("CHAR_BIT_COL" , name )
186- .set ("VARCHAR_BIT_COL" , name )
217+ .set ("CHAR_BIT_COL" , name . getBytes () )
218+ .set ("VARCHAR_BIT_COL" , name . getBytes () )
187219 .set ("GRAPHIC_COL" , name )
188- .set ("CLOB_COL" , name . getBytes () )
220+ .set ("CLOB_COL" , name )
189221 .set ("BLOB_COL" , name .getBytes ())
190222 .setDate ("DATE_COL" , localDateTime .toLocalDate ())
191223 .setTime ("TIME_COL" , localDateTime .toLocalTime ())
192224 .setTimestamp ("TIMESTAMP_COL" , localDateTime .atZone (ZoneId .systemDefault ()))
225+ .set ("BINARY_COL" , name .getBytes ())
226+ .set ("VARBINARY_COL" , name .getBytes ())
227+ .set ("VARGRAPHIC_COL" , name )
228+ .set ("DBCLOB_COL" , name )
193229 .build ());
194230 }
195231 MockSource .writeInput (inputManager , inputRecords );
0 commit comments