2020import org .testingisdocumenting .webtau .data .table .TableData ;
2121import org .testingisdocumenting .webtau .db .gen .SqlQueriesGenerator ;
2222import org .testingisdocumenting .webtau .reporter .MessageToken ;
23+ import org .testingisdocumenting .webtau .reporter .TokenizedMessage ;
2324
2425import java .sql .SQLException ;
26+ import java .util .List ;
2527import java .util .Map ;
28+ import java .util .function .Function ;
29+ import java .util .function .Supplier ;
30+ import java .util .stream .Stream ;
2631
2732import static org .testingisdocumenting .webtau .reporter .IntegrationTestsMessageBuilder .*;
2833import static org .testingisdocumenting .webtau .reporter .TokenizedMessage .tokenizedMessage ;
@@ -39,19 +44,22 @@ public DatabaseTable(LabeledDataSource dataSource, String name) {
3944
4045 public void insert (TableData tableData ) {
4146 createAndExecuteStep (
42- tokenizedMessage (action ("inserting" ), numberValue (tableData .numberOfRows ()), action ("row(s)" ),
43- INTO , createMessageId ()),
44- () -> tokenizedMessage (action ("inserted" ), numberValue (tableData .numberOfRows ()), action ("row(s)" ),
45- INTO , createMessageId ()),
47+ insertingMessage (tableData .numberOfRows ()),
48+ () -> insertedMessage (tableData .numberOfRows ()),
4649 () -> insertTableStep (tableData ));
4750 }
4851
52+ public void insert (List <Map <String , Object >> rows ) {
53+ createAndExecuteStep (
54+ insertingMessage (rows .size ()),
55+ () -> insertedMessage (rows .size ()),
56+ () -> insertTableStep (rows ));
57+ }
58+
4959 public void insert (Map <String , Object > row ) {
5060 createAndExecuteStep (
51- tokenizedMessage (action ("inserting" ), numberValue (1 ), action ("row" ),
52- INTO , createMessageId ()),
53- () -> tokenizedMessage (action ("inserted" ), numberValue (1 ), action ("row" ),
54- INTO , createMessageId ()),
61+ insertingMessage (1 ),
62+ () -> insertedMessage (1 ),
5563 () -> insertRowStep (row ));
5664 }
5765
@@ -63,19 +71,52 @@ public DbQuery query() {
6371 return QueryRunnerUtils .createQuery (dataSource , SqlQueriesGenerator .fullTable (name ));
6472 }
6573
74+
75+ private TokenizedMessage insertingMessage (int numberOfRows ) {
76+ return insertMessageWithLabel ("inserting" , numberOfRows );
77+ }
78+
79+ private TokenizedMessage insertedMessage (int numberOfRows ) {
80+ return insertMessageWithLabel ("inserted" , numberOfRows );
81+ }
82+
83+ private TokenizedMessage insertMessageWithLabel (String actionLabel , int numberOfRows ) {
84+ return tokenizedMessage (action (actionLabel ), numberValue (numberOfRows ),
85+ numberOfRows > 1 ? action ("rows" ) : action ("row" ),
86+ INTO , createMessageId ());
87+ }
88+
6689 private void insertTableStep (TableData tableData ) {
67- if (tableData .isEmpty ()) {
90+ insertMultipleRowsStep (tableData ::isEmpty ,
91+ tableData ::numberOfRows ,
92+ () -> tableData .getHeader ().getNamesStream (),
93+ (idx ) -> tableData .row (idx ).valuesStream ());
94+ }
95+
96+ private void insertTableStep (List <Map <String , Object >> rows ) {
97+ insertMultipleRowsStep (rows ::isEmpty ,
98+ rows ::size ,
99+ () -> rows .get (0 ).keySet ().stream (),
100+ (idx ) -> rows .get (idx ).values ().stream ());
101+ }
102+
103+ private void insertMultipleRowsStep (Supplier <Boolean > isEmpty ,
104+ Supplier <Integer > size ,
105+ Supplier <Stream <String >> header ,
106+ Function <Integer , Stream <Object >> valuesByRowIdx ) {
107+ if (isEmpty .get ()) {
68108 return ;
69109 }
70110
71111 QueryRunner run = new QueryRunner (dataSource .getDataSource ());
72112 try {
73- Object [][] values = new Object [tableData .numberOfRows ()][];
74- for (int idx = 0 ; idx < tableData .numberOfRows (); idx ++) {
75- values [idx ] = tableData .row (idx ).valuesStream ().toArray ();
113+ int numberOfRows = size .get ();
114+ Object [][] values = new Object [numberOfRows ][];
115+ for (int idx = 0 ; idx < numberOfRows ; idx ++) {
116+ values [idx ] = valuesByRowIdx .apply (idx ).toArray ();
76117 }
77118
78- run .batch (SqlQueriesGenerator .insert (name , tableData . row (0 )), values );
119+ run .batch (SqlQueriesGenerator .insert (name , header . get (), valuesByRowIdx . apply (0 )), values );
79120 } catch (SQLException e ) {
80121 throw new RuntimeException (e );
81122 }
@@ -102,4 +143,8 @@ public void leftShift(TableData tableData) {
102143 public void leftShift (Map <String , Object > row ) {
103144 insert (row );
104145 }
146+
147+ public void leftShift (List <Map <String , Object >> rows ) {
148+ insert (rows );
149+ }
105150}
0 commit comments