8
8
import edu .caltech .ipac .firefly .server .ServerContext ;
9
9
import edu .caltech .ipac .firefly .server .db .spring .JdbcFactory ;
10
10
import edu .caltech .ipac .firefly .server .db .spring .mapper .DataGroupUtil ;
11
+ import edu .caltech .ipac .firefly .server .query .SearchProcessor ;
11
12
import edu .caltech .ipac .firefly .server .util .Logger ;
12
13
import edu .caltech .ipac .firefly .server .util .ipactable .DataGroupPart ;
13
14
import edu .caltech .ipac .firefly .server .util .ipactable .TableDef ;
32
33
import java .util .Arrays ;
33
34
import java .util .List ;
34
35
import java .util .Map ;
36
+ import java .util .stream .Collectors ;
35
37
36
38
import static edu .caltech .ipac .firefly .data .TableServerRequest .TBL_FILE_PATH ;
37
39
import static edu .caltech .ipac .firefly .data .TableServerRequest .TBL_FILE_TYPE ;
@@ -54,11 +56,15 @@ public class EmbeddedDbUtil {
54
56
* @return a FileInfo with sizeInBytes representing to the number of rows.
55
57
*/
56
58
public static FileInfo createDbFile (File dbFile , DataGroup dg , DbAdapter dbAdapter ) {
59
+
60
+ // remove ROW_IDX or ROW_NUM if exists
61
+ dg .removeDataDefinition (DataGroup .ROW_IDX );
62
+ dg .removeDataDefinition (DataGroup .ROW_NUM );
63
+
57
64
int rowCount = createDataTbl (dbFile , dg , dbAdapter );
58
- createDDTbl (dbFile , dg , dbAdapter );
59
- createMetaTbl (dbFile , dg , dbAdapter );
65
+ createDDTbl (dbFile , dg , dbAdapter , "data" );
66
+ createMetaTbl (dbFile , dg , dbAdapter , "data" );
60
67
FileInfo finfo = new FileInfo (dbFile );
61
- finfo .setSizeInBytes (rowCount );
62
68
return finfo ;
63
69
}
64
70
@@ -137,36 +143,69 @@ public static String setupDatasetTable(TableServerRequest treq) {
137
143
JdbcFactory .getSimpleTemplate (dbInstance ).queryForInt (String .format ("select count(*) from %s" , datasetID ));
138
144
} catch (Exception e ) {
139
145
// does not exists.. create table from orignal 'data' table
140
- List <String > cols = JdbcFactory . getSimpleTemplate (dbInstance ). query ( "select cname from DD" , ( rs , i ) -> rs . getString ( 1 ) );
146
+ List <String > cols = getColumnNames (dbInstance , "DATA" );
141
147
String wherePart = dbAdapter .wherePart (treq );
142
148
String orderBy = dbAdapter .orderByPart (treq );
143
149
150
+ // copy data
144
151
String datasetSql = String .format ("select %s, %s from data %s %s" , StringUtils .toString (cols ), DataGroup .ROW_IDX , wherePart , orderBy );
145
152
String datasetSqlWithIdx = String .format ("select b.*, (ROWNUM-1) as %s from (%s) as b" , DataGroup .ROW_NUM , datasetSql );
146
153
String sql = dbAdapter .createTableFromSelect (getDatasetID (treq ), datasetSqlWithIdx );
147
154
JdbcFactory .getSimpleTemplate (dbInstance ).update (sql );
155
+
156
+ // copy dd
157
+ String ddSql = "select * from data_dd" ;
158
+ ddSql = dbAdapter .createTableFromSelect (getDatasetID (treq ) + "_dd" , ddSql );
159
+ JdbcFactory .getSimpleTemplate (dbInstance ).update (ddSql );
160
+
161
+ // copy meta
162
+ String metaSql = "select * from data_meta" ;
163
+ metaSql = dbAdapter .createTableFromSelect (getDatasetID (treq ) + "_meta" , metaSql );
164
+ JdbcFactory .getSimpleTemplate (dbInstance ).update (metaSql );
165
+
148
166
}
149
167
150
168
return datasetID ;
151
169
}
152
170
171
+ public static List <String > getColumnNames (DbInstance dbInstance , String forTable ) {
172
+ List <String > cols = JdbcFactory .getSimpleTemplate (dbInstance ).query (String .format ("select cname from %s_DD" , forTable ), (rs , i ) -> rs .getString (1 ));
173
+ cols = cols .stream ().map ((s ) -> "\" " + s .toUpperCase () + "\" " ).collect (Collectors .toList ()); // internally.. columns are stored as uppercase. adding quotes to avoid db reserved words.
174
+ return cols ;
175
+ }
176
+
177
+ /**
178
+ * return the DB file this request mapped to.
179
+ * @param treq
180
+ * @return
181
+ */
153
182
public static File getDbFile (TableServerRequest treq ) {
154
- return ServerContext .convertToFile (treq .getMeta (TBL_FILE_PATH ));
183
+ String fname = String .format ("%s_%s.%s" , treq .getRequestId (), DigestUtils .md5Hex (getUniqueID (treq )), DbAdapter .getAdapter (treq ).getName ());
184
+ return new File (ServerContext .getTempWorkDir (), fname );
155
185
}
156
186
157
187
public static void setDbMetaInfo (TableServerRequest treq , DbAdapter dbAdapter , File dbFile ) {
158
188
treq .setMeta (TBL_FILE_PATH , ServerContext .replaceWithPrefix (dbFile ));
159
189
treq .setMeta (TBL_FILE_TYPE , dbAdapter .getName ());
160
190
}
161
191
192
+ public static String getTblFileType (TableServerRequest treq ) {
193
+ return treq .getMeta (TBL_FILE_TYPE );
194
+ }
195
+
162
196
@ NotNull
163
197
public static String getDatasetID (TableServerRequest treq ) {
164
198
String id = StringUtils .toString (treq .getDataSetParam (), "|" );
165
- return StringUtils .isEmpty (id ) ? "" : "view_" + DigestUtils .md5Hex (id );
199
+ return StringUtils .isEmpty (id ) ? "" : "data_" + DigestUtils .md5Hex (id );
200
+ }
201
+
202
+ @ NotNull
203
+ public static String getUniqueID (TableServerRequest treq ) {
204
+ return SearchProcessor .getUniqueIDDef (treq );
166
205
}
167
206
168
- public static DataGroupPart getResults (TableServerRequest treq , String sql ) {
169
- DataGroup dg = runQuery (DbAdapter .getAdapter (treq ), getDbFile (treq ), sql );
207
+ public static DataGroupPart getResults (TableServerRequest treq , String sql , String tblName ) {
208
+ DataGroup dg = runQuery (DbAdapter .getAdapter (treq ), getDbFile (treq ), sql , tblName );
170
209
TableDef tm = new TableDef ();
171
210
tm .setStatus (DataGroupPart .State .COMPLETED );
172
211
tm .setRowCount (dg .size ());
@@ -208,7 +247,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
208
247
return totalRows ;
209
248
}
210
249
211
- public static DataGroup runQuery (DbAdapter dbAdapter , File dbFile , String sql ) {
250
+ public static DataGroup runQuery (DbAdapter dbAdapter , File dbFile , String sql , String tblName ) {
212
251
DbInstance dbInstance = dbAdapter .getDbInstance (dbFile );
213
252
sql = dbAdapter .translateSql (sql );
214
253
@@ -218,20 +257,22 @@ public static DataGroup runQuery(DbAdapter dbAdapter, File dbFile, String sql) {
218
257
219
258
SimpleJdbcTemplate jdbc = JdbcFactory .getSimpleTemplate (dbAdapter .getDbInstance (dbFile ));
220
259
221
- // insert DD info into the results
222
- try {
223
- String ddSql = dbAdapter .getDDSql ();
224
- jdbc .query (ddSql , (rs , i ) -> EmbeddedDbUtil .insertDD (dg , rs ));
225
- } catch (Exception e ) {
226
- // ignore.. may not have DD table
227
- }
260
+ if (tblName != null ) {
261
+ // insert DD info into the results
262
+ try {
263
+ String ddSql = dbAdapter .getDDSql (tblName );
264
+ jdbc .query (ddSql , (rs , i ) -> EmbeddedDbUtil .insertDD (dg , rs ));
265
+ } catch (Exception e ) {
266
+ // ignore.. may not have DD table
267
+ }
228
268
229
- // insert table meta info into the results
230
- try {
231
- String metaSql = dbAdapter .getMetaSql ();
232
- jdbc .query (metaSql , (rs , i ) -> EmbeddedDbUtil .insertMeta (dg , rs ));
233
- } catch (Exception e ) {
234
- // ignore.. may not have meta table
269
+ // insert table meta info into the results
270
+ try {
271
+ String metaSql = dbAdapter .getMetaSql (tblName );
272
+ jdbc .query (metaSql , (rs , i ) -> EmbeddedDbUtil .insertMeta (dg , rs ));
273
+ } catch (Exception e ) {
274
+ // ignore.. may not have meta table
275
+ }
235
276
}
236
277
237
278
return dg ;
@@ -259,10 +300,10 @@ public int getBatchSize() {
259
300
});
260
301
}
261
302
262
- public static void createMetaTbl (File dbFile , DataGroup dg , DbAdapter dbAdapter ) {
303
+ public static void createMetaTbl (File dbFile , DataGroup dg , DbAdapter dbAdapter , String forTable ) {
263
304
if (dg .getAttributeKeys ().size () == 0 ) return ;
264
305
265
- String createMetaSql = dbAdapter .createMetaSql (dg . getDataDefinitions () );
306
+ String createMetaSql = dbAdapter .createMetaSql (forTable );
266
307
logger .debug ("createMetaSql:" + createMetaSql );
267
308
JdbcFactory .getSimpleTemplate (dbAdapter .getDbInstance (dbFile )).update (createMetaSql );
268
309
@@ -272,16 +313,16 @@ public static void createMetaTbl(File dbFile, DataGroup dg, DbAdapter dbAdapter)
272
313
String val = meta .get (key ).getValue ();
273
314
data .add (new Object []{key , val });
274
315
}
275
- String insertDDSql = dbAdapter .insertMetaSql (dg . getDataDefinitions () );
316
+ String insertDDSql = dbAdapter .insertMetaSql (forTable );
276
317
logger .debug ("insertDDSql:" + insertDDSql );
277
318
JdbcFactory .getSimpleTemplate (dbAdapter .getDbInstance (dbFile )).batchUpdate (insertDDSql , data );
278
319
}
279
320
280
321
281
- public static void createDDTbl (File dbFile , DataGroup dg , DbAdapter dbAdapter ) {
322
+ public static void createDDTbl (File dbFile , DataGroup dg , DbAdapter dbAdapter , String forTable ) {
282
323
283
324
makeDbCols (dg );
284
- String createDDSql = dbAdapter .createDDSql (dg . getDataDefinitions () );
325
+ String createDDSql = dbAdapter .createDDSql (forTable );
285
326
logger .debug ("createDDSql:" + createDDSql );
286
327
JdbcFactory .getSimpleTemplate (dbAdapter .getDbInstance (dbFile )).update (createDDSql );
287
328
@@ -310,7 +351,7 @@ public static void createDDTbl(File dbFile, DataGroup dg, DbAdapter dbAdapter) {
310
351
}
311
352
);
312
353
}
313
- String insertDDSql = dbAdapter .insertDDSql (dg . getDataDefinitions () );
354
+ String insertDDSql = dbAdapter .insertDDSql (forTable );
314
355
logger .debug ("insertDDSql:" + insertDDSql );
315
356
JdbcFactory .getSimpleTemplate (dbAdapter .getDbInstance (dbFile )).batchUpdate (insertDDSql , data );
316
357
}
0 commit comments