diff --git a/config/log4j.properties b/config/log4j.properties
index 9c1f0e036b..efe37bca77 100644
--- a/config/log4j.properties
+++ b/config/log4j.properties
@@ -1,7 +1,7 @@
log4j.rootLogger=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{MM/dd HH:mm:ss} %5p - %m [%t] (%c{2}#%M:%L)%n
+log4j.appender.console.layout.ConversionPattern=%d{MM/dd HH:mm:ss} %5p - %.2000m [%t] (%c{2}#%M:%L)%n
# ${host.name} is defined as an evironment variable at tomcat startup... not a log4j variable.
log4j.appender.@app-name@_stats=org.apache.log4j.DailyRollingFileAppender
@@ -14,7 +14,7 @@ log4j.appender.@app-name@_brief=org.apache.log4j.DailyRollingFileAppender
log4j.appender.@app-name@_brief.File=${catalina.base}/logs/@app-name@.log
log4j.appender.@app-name@_brief.DatePattern='.'yyyy-ww
log4j.appender.@app-name@_brief.layout=org.apache.log4j.PatternLayout
-log4j.appender.@app-name@_brief.layout.ConversionPattern=%d{MM/dd HH:mm:ss} %5p - %m [%t] (%c{2}#%M:%L)%n
+log4j.appender.@app-name@_brief.layout.ConversionPattern=%d{MM/dd HH:mm:ss} %5p - %.2000m [%t] (%c{2}#%M:%L)%n
log4j.appender.@app-name@=org.apache.log4j.DailyRollingFileAppender
log4j.appender.@app-name@.File=${catalina.base}/logs/@app-name@.log
@@ -22,7 +22,7 @@ log4j.appender.@app-name@.DatePattern='.'yyyy-ww
log4j.appender.@app-name@.layout=org.apache.log4j.PatternLayout
log4j.appender.@app-name@.layout.ConversionPattern=\
%d{MM/dd HH:mm:ss} %5p Thread: %t %c{2}#%M:%L\
-%n %m%n
+%n %.2000m%n
# this renderer print the object into multiple lines
diff --git a/src/firefly/html/demo/ffapi-highlevel-charttest.html b/src/firefly/html/demo/ffapi-highlevel-charttest.html
index 5c3b12eeb2..ebb82a3386 100644
--- a/src/firefly/html/demo/ffapi-highlevel-charttest.html
+++ b/src/firefly/html/demo/ffapi-highlevel-charttest.html
@@ -184,7 +184,7 @@
Default chart for 'allwise' table group below
firefly.showChart('defaultChart', {tbl_group: 'allwise'});
// using column expressions
- var tblReqXpr = Object.assign({}, tblReq, {inclCols: 'ra + dec as radec, ra, dec, ln(dec) as LnOfDec, power(ra, 2) as ra_sq'});
+ var tblReqXpr = Object.assign({}, tblReq, {inclCols: '"ra" + "dec" as "radec", "ra", "dec", ln("dec") as "LnOfDec", power("ra", 2) as "ra_sq"'});
tblReqXpr.META_INFO.tbl_id = 'tblwithXpr';
tblReqXpr.META_INFO.title = 'table with expressions';
tblReqXpr.tbl_id = 'tblwithXpr';
diff --git a/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/CatMasterTableQuery.java b/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/CatMasterTableQuery.java
index 0c95f3abeb..27446e9883 100644
--- a/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/CatMasterTableQuery.java
+++ b/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/CatMasterTableQuery.java
@@ -25,9 +25,6 @@
import edu.caltech.ipac.util.DataObject;
import edu.caltech.ipac.util.DataType;
import edu.caltech.ipac.util.StringUtils;
-import edu.caltech.ipac.util.cache.Cache;
-import edu.caltech.ipac.util.cache.CacheManager;
-import edu.caltech.ipac.util.cache.StringKey;
import java.io.File;
import java.io.IOException;
@@ -257,17 +254,7 @@ public static DataGroup getBaseGatorData(String originalFilename) throws IOExcep
}
protected File loadDataFile(TableServerRequest request) throws IOException, DataAccessException {
- File retFile;
-
- StringKey key = new StringKey(CatMasterTableQuery.class.getName(), getUniqueID(request));
- Cache cache = CacheManager.getCache(Cache.TYPE_TEMP_FILE);
- retFile = (File) cache.get(key);
- if (retFile == null) {
- retFile = getMasterCatalogFile(request);
- cache.put(key, retFile);
- }
-
- return retFile;
+ return getMasterCatalogFile(request);
}
}
diff --git a/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/GatorDD.java b/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/GatorDD.java
index 3456fe93bd..5e7ec2afdb 100644
--- a/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/GatorDD.java
+++ b/src/firefly/java/edu/caltech/ipac/firefly/server/catquery/GatorDD.java
@@ -19,7 +19,9 @@
import edu.caltech.ipac.firefly.server.query.EmbeddedDbProcessor;
import edu.caltech.ipac.firefly.server.query.ParamDoc;
import edu.caltech.ipac.firefly.server.query.SearchProcessorImpl;
+import edu.caltech.ipac.firefly.server.query.SharedDbProcessor;
import edu.caltech.ipac.firefly.server.util.ipactable.DataGroupPart;
+import edu.caltech.ipac.firefly.server.util.ipactable.DataGroupReader;
import edu.caltech.ipac.firefly.server.util.ipactable.TableDef;
import edu.caltech.ipac.util.AppProperties;
import edu.caltech.ipac.util.DataGroup;
@@ -52,69 +54,23 @@
@ParamDoc(name = CatalogRequest.SERVICE_ROOT, desc = "the part of the URL string that specifies the service and first params. " +
"optional: almost never used")
})
-public class GatorDD extends EmbeddedDbProcessor {
+public class GatorDD extends SharedDbProcessor {
- public FileInfo createDbFile(TableServerRequest treq) throws DataAccessException {
-
- DbAdapter dbAdapter = DbAdapter.getAdapter(treq);
- File dbFile = new File(ServerContext.getTempWorkDir(), String.format("GatorDD-%s.%s", FileUtil.getHostname(), dbAdapter.getName()));
+ public DataGroup fetchData(TableServerRequest treq) throws DataAccessException {
+ TableServerRequest ntreq = (TableServerRequest) treq.cloneRequest();
+ ntreq.keepBaseParamOnly();
try {
- if (dbFile.createNewFile()) {
- // created for the first time... populate dd and meta tables
- DataGroup dd = new DataGroup("DD for GatorDD", new DataType[]{
- new DataType("name", String.class),
- new DataType("description", String.class),
- new DataType("units", String.class),
- new DataType("indx", String.class),
- new DataType("dbtype", String.class),
- new DataType("tableflg", Integer.class),
- new DataType("sel", String.class)
- });
- EmbeddedDbUtil.createDDTbl(dbFile, dd, dbAdapter, "data");
- EmbeddedDbUtil.setDbMetaInfo(treq, DbAdapter.getAdapter(treq), dbFile);
- }
+ File results = new GatorDDImpl().loadDataFile(treq);
+ return DataGroupReader.read(results);
} catch (IOException e) {
- // should not happen.
+ throw new DataAccessException(e.getMessage(), e);
}
- return new FileInfo(dbFile);
- }
-
- @Override
- protected DataGroupPart getResultSet(TableServerRequest treq, File dbFile) throws DataAccessException {
- DbAdapter dbAdapter = DbAdapter.getAdapter(treq);
- DbInstance dbInstance = dbAdapter.getDbInstance(dbFile);
- String tblName = treq.getParam(CatalogRequest.CATALOG);
-
- String tblExists = String.format("select count(*) from %s", tblName);
- try {
- JdbcFactory.getSimpleTemplate(dbInstance).queryForInt(tblExists);
- } catch (Exception e) {
- // DD for this catalog does not exists.. fetch data and populate
- fetchDataIntoTable(treq, tblName, dbFile, dbAdapter);
- }
-
- treq.setParam(TableServerRequest.SQL_FROM, tblName);
- treq.setPageSize(Integer.MAX_VALUE);
- String sql = String.format("%s %s %s", dbAdapter.selectPart(treq), dbAdapter.fromPart(treq), dbAdapter.wherePart(treq));
- sql = dbAdapter.translateSql(sql);
-
- DataGroup dg = EmbeddedDbUtil.runQuery(dbAdapter, dbFile, sql, "data");
- TableDef tm = new TableDef();
- tm.setStatus(DataGroupPart.State.COMPLETED);
- return new DataGroupPart(tm, dg, treq.getStartIndex(), dg.size());
}
@Override
public boolean doLogging() {
return false;
}
-
- private void fetchDataIntoTable(TableServerRequest treq, String tblName, File dbFile, DbAdapter dbAdapter) throws DataAccessException {
- TableServerRequest ntreq = (TableServerRequest) treq.cloneRequest();
- ntreq.keepBaseParamOnly();
- DataGroupPart dgp = new GatorDDImpl().getData(treq);
- EmbeddedDbUtil.createDataTbl(dbFile, dgp.getData(), dbAdapter, tblName);
- }
}
diff --git a/src/firefly/java/edu/caltech/ipac/firefly/server/db/BaseDbAdapter.java b/src/firefly/java/edu/caltech/ipac/firefly/server/db/BaseDbAdapter.java
index d2312a2dbb..b8ba7a195d 100644
--- a/src/firefly/java/edu/caltech/ipac/firefly/server/db/BaseDbAdapter.java
+++ b/src/firefly/java/edu/caltech/ipac/firefly/server/db/BaseDbAdapter.java
@@ -28,7 +28,7 @@
* @version $Id: DbInstance.java,v 1.3 2012/03/15 20:35:40 loi Exp $
*/
abstract public class BaseDbAdapter implements DbAdapter {
- private static long MAX_IDLE_TIME = 1000 * 60 * 5; // will be cleaned up if idle more than 5 minutes.
+ private static long MAX_IDLE_TIME = 1000 * 60 * 15; // will be purged up if idle more than 15 minutes.
private static Map dbInstances = new HashMap<>();
private static Logger.LoggerImpl LOGGER = Logger.getLogger();
@@ -75,7 +75,7 @@ public String createDataSql(DataType[] dtTypes, String tblName) {
tblName = StringUtils.isEmpty(tblName) ? "data" : tblName;
List coldefs = new ArrayList<>();
for(DataType dt : dtTypes) {
- coldefs.add( String.format("\"%s\" %s", dt.getKeyName().toUpperCase(),getDataType(dt.getDataType())));
+ coldefs.add( String.format("\"%s\" %s", dt.getKeyName(), getDataType(dt.getDataType()))); // add quotes to avoid reserved words clashes
}
return String.format("create table %s (%s)", tblName, StringUtils.toString(coldefs, ","));
@@ -103,13 +103,6 @@ public String selectPart(TableServerRequest treq) {
return cols;
}
- public String fromPart(TableServerRequest treq) {
- String from = treq.getParam(TableServerRequest.SQL_FROM);
- from = from == null ? EmbeddedDbUtil.getResultSetID(treq) : from;
- from = "from " + (StringUtils.isEmpty(from) ? "data" : from);
- return from;
- }
-
public String wherePart(TableServerRequest treq) {
String where = "";
if (treq.getFilters() != null && treq.getFilters().size() > 0) {
@@ -171,12 +164,16 @@ public String getDataType(Class type) {
}
public DbInstance getDbInstance(File dbFile) {
+ return getDbInstance(dbFile, true);
+ }
+
+ public DbInstance getDbInstance(File dbFile, boolean create) {
EmbeddedDbInstance ins = dbInstances.get(dbFile.getPath());
- if (ins == null) {
+ if (ins == null && create) {
ins = createDbInstance(dbFile);
dbInstances.put(dbFile.getPath(), ins);
}
- ins.touch();
+ if (ins != null ) ins.touch();
return ins;
}
diff --git a/src/firefly/java/edu/caltech/ipac/firefly/server/db/DbAdapter.java b/src/firefly/java/edu/caltech/ipac/firefly/server/db/DbAdapter.java
index c45363afb5..3880f6987e 100644
--- a/src/firefly/java/edu/caltech/ipac/firefly/server/db/DbAdapter.java
+++ b/src/firefly/java/edu/caltech/ipac/firefly/server/db/DbAdapter.java
@@ -60,7 +60,6 @@ public interface DbAdapter {
String getMetaSql(String forTable);
String selectPart(TableServerRequest treq);
- String fromPart(TableServerRequest treq);
String wherePart(TableServerRequest treq);
String orderByPart(TableServerRequest treq) ;
String pagingPart(TableServerRequest treq) ;
diff --git a/src/firefly/java/edu/caltech/ipac/firefly/server/db/EmbeddedDbUtil.java b/src/firefly/java/edu/caltech/ipac/firefly/server/db/EmbeddedDbUtil.java
index 251220b71c..02e432521e 100644
--- a/src/firefly/java/edu/caltech/ipac/firefly/server/db/EmbeddedDbUtil.java
+++ b/src/firefly/java/edu/caltech/ipac/firefly/server/db/EmbeddedDbUtil.java
@@ -8,6 +8,7 @@
import edu.caltech.ipac.firefly.server.ServerContext;
import edu.caltech.ipac.firefly.server.db.spring.JdbcFactory;
import edu.caltech.ipac.firefly.server.db.spring.mapper.DataGroupUtil;
+import edu.caltech.ipac.firefly.server.query.DataAccessException;
import edu.caltech.ipac.firefly.server.query.SearchProcessor;
import edu.caltech.ipac.firefly.server.util.Logger;
import edu.caltech.ipac.firefly.server.util.ipactable.DataGroupPart;
@@ -16,8 +17,6 @@
import edu.caltech.ipac.util.DataGroup;
import edu.caltech.ipac.util.DataType;
import edu.caltech.ipac.util.StringUtils;
-import edu.caltech.ipac.util.decimate.DecimateKey;
-import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
@@ -27,6 +26,7 @@
import javax.validation.constraints.NotNull;
import java.io.File;
+import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -49,23 +49,38 @@
public class EmbeddedDbUtil {
private static final Logger.LoggerImpl logger = Logger.getLogger();
+ /**
+ * setup a database
+ * @param dbFile the file to save the database to.
+ * @param dbAdapter DbAdapter to use.. ie sqlite, h2, etc.
+ */
+ public static void createDbFile(File dbFile, DbAdapter dbAdapter) throws IOException {
+ dbAdapter.close(dbFile); // in case database exists in memory.
+ File[] toRemove = dbFile.getParentFile().listFiles((dir, name) -> name.startsWith(dbFile.getName()));
+ if (toRemove != null && toRemove.length > 0) {
+ Arrays.stream(toRemove).forEach(f -> f.delete());
+ }
+ dbFile.createNewFile(); // creates the file
+ createCustomFunctions(dbFile, dbAdapter); // add custom functions
+ }
+
/**
* ingest the given datagroup into a database file using the provided DbAdpater.
* @param dbFile the file to save the database to.
* @param dg the datagroup containing the data
* @param dbAdapter DbAdapter to use.. ie sqlite, h2, etc.
+ * @param forTable the name of the table to ingest to
* @return a FileInfo with sizeInBytes representing to the number of rows.
*/
- public static FileInfo createDbFile(File dbFile, DataGroup dg, DbAdapter dbAdapter) {
+ public static FileInfo ingestDataGroup(File dbFile, DataGroup dg, DbAdapter dbAdapter, String forTable) {
// remove ROW_IDX or ROW_NUM if exists
dg.removeDataDefinition(DataGroup.ROW_IDX);
dg.removeDataDefinition(DataGroup.ROW_NUM);
- createCustomFunctions(dbFile, dbAdapter);
- int rowCount = createDataTbl(dbFile, dg, dbAdapter);
- createDDTbl(dbFile, dg, dbAdapter, "data");
- createMetaTbl(dbFile, dg, dbAdapter, "data");
+ createDataTbl(dbFile, dg, dbAdapter, forTable);
+ createDDTbl(dbFile, dg, dbAdapter, forTable);
+ createMetaTbl(dbFile, dg, dbAdapter, forTable);
FileInfo finfo = new FileInfo(dbFile);
return finfo;
}
@@ -134,93 +149,48 @@ public static int insertDD(DataGroup dg, ResultSet rs) {
return 0;
}
- public static String setupDatasetTable(TableServerRequest treq) {
- String resultSetID = getResultSetID(treq);
-
- DbAdapter dbAdapter = DbAdapter.getAdapter(treq);
- DbInstance dbInstance = dbAdapter.getDbInstance(getDbFile(treq));
-
- try {
- JdbcFactory.getSimpleTemplate(dbInstance).queryForInt(String.format("select count(*) from %s", resultSetID));
- } catch (Exception e) {
- // does not exists.. create table from orignal 'data' table
- List cols = treq.getInclColumns() == null ? getColumnNames(dbInstance, "DATA")
- : StringUtils.asList(treq.getInclColumns(), ",");
- String wherePart = dbAdapter.wherePart(treq);
- String orderBy = dbAdapter.orderByPart(treq);
- String tblName = getResultSetID(treq);
-
- cols = cols.stream().filter((s) -> !(s.equals(DataGroup.ROW_IDX) || s.equals(DataGroup.ROW_NUM))).collect(Collectors.toList()); // remove this cols because it will be automatically added
-
- // copy data
- String datasetSql = String.format("select %s, %s from data %s %s", StringUtils.toString(cols), DataGroup.ROW_IDX, wherePart, orderBy);
- String datasetSqlWithIdx = String.format("select b.*, (ROWNUM-1) as %s from (%s) as b", DataGroup.ROW_NUM, datasetSql);
- String sql = dbAdapter.createTableFromSelect(tblName, datasetSqlWithIdx);
- JdbcFactory.getSimpleTemplate(dbInstance).update(sql);
-
- // copy dd
- String ddSql = "select * from data_dd";
- ddSql = dbAdapter.createTableFromSelect(tblName + "_dd", ddSql);
- JdbcFactory.getSimpleTemplate(dbInstance).update(ddSql);
-
- // copy meta
- String metaSql = "select * from data_meta";
- metaSql = dbAdapter.createTableFromSelect(tblName + "_meta", metaSql);
- JdbcFactory.getSimpleTemplate(dbInstance).update(metaSql);
-
- }
-
- return resultSetID;
- }
-
- public static List getColumnNames(DbInstance dbInstance, String forTable) {
- List cols = JdbcFactory.getSimpleTemplate(dbInstance).query(String.format("select cname from %s_DD", forTable), (rs, i) -> rs.getString(1));
- cols = cols.stream().map((s) -> "\"" + s.toUpperCase() + "\"").collect(Collectors.toList()); // internally.. columns are stored as uppercase. adding quotes to avoid db reserved words.
- return cols;
- }
-
- /**
- * return the DB file this request mapped to.
- * @param treq
- * @return
- */
- public static File getDbFile(TableServerRequest treq) {
- String fname = String.format("%s_%s.%s", treq.getRequestId(), DigestUtils.md5Hex(getUniqueID(treq)), DbAdapter.getAdapter(treq).getName());
- return new File(ServerContext.getTempWorkDir(), fname);
- }
-
public static void setDbMetaInfo(TableServerRequest treq, DbAdapter dbAdapter, File dbFile) {
treq.setMeta(TBL_FILE_PATH, ServerContext.replaceWithPrefix(dbFile));
treq.setMeta(TBL_FILE_TYPE, dbAdapter.getName());
}
- public static String getTblFileType(TableServerRequest treq) {
- return treq.getMeta(TBL_FILE_TYPE);
- }
-
- @NotNull
- public static String getResultSetID(TableServerRequest treq) {
- String id = StringUtils.toString(treq.getResultSetParam(), "|");
- return StringUtils.isEmpty(id) ? "data" : "data_" + DigestUtils.md5Hex(id);
- }
@NotNull
public static String getUniqueID(TableServerRequest treq) {
return SearchProcessor.getUniqueIDDef(treq);
}
- public static DataGroupPart getResults(TableServerRequest treq, String sql, String tblName) {
- DataGroup dg = runQuery(DbAdapter.getAdapter(treq), getDbFile(treq), sql, tblName);
+ public static DataGroupPart getResultForTable(TableServerRequest treq, File dbFile, String tblName) throws DataAccessException {
+ try {
+ DbAdapter dbAdapter = DbAdapter.getAdapter(treq);
+
+ // select a page from the dataset table
+ String pageSql = getPageSql(dbAdapter, treq, tblName);
+ DataGroupPart page = EmbeddedDbUtil.getResults(treq, pageSql, dbFile, tblName);
+
+ // fetch total row count for the query.. datagroup may contain partial results(paging)
+ String cntSql = String.format("select count(*) from %s", tblName);
+ int rowCnt = JdbcFactory.getSimpleTemplate(dbAdapter.getDbInstance(dbFile)).queryForInt(cntSql);
+
+ page.setRowCount(rowCnt);
+ page.getTableDef().setAttribute(TableServerRequest.RESULTSET_ID, tblName);
+ if (!StringUtils.isEmpty(treq.getTblTitle())) {
+ page.getData().setTitle(treq.getTblTitle()); // set the datagroup's title to the request title.
+ }
+ return page;
+ } catch (Exception ex) {
+ throw new DataAccessException(ex);
+ }
+ }
+
+ public static DataGroupPart getResults(TableServerRequest treq, String sql, File dbFile, String tblName) {
+ DataGroup dg = runQuery(DbAdapter.getAdapter(treq), dbFile, sql, tblName);
TableDef tm = new TableDef();
tm.setStatus(DataGroupPart.State.COMPLETED);
tm.setRowCount(dg.size());
return new DataGroupPart(tm, dg, treq.getStartIndex(), dg.size());
}
- public static int createDataTbl(File dbFile, DataGroup dg, DbAdapter dbAdapter) {
- return createDataTbl(dbFile, dg, dbAdapter, null);
- }
-
public static int createDataTbl(File dbFile, DataGroup dg, DbAdapter dbAdapter, String tblName) {
DataType[] colsAry = makeDbCols(dg);
@@ -319,16 +289,21 @@ public static void createMetaTbl(File dbFile, DataGroup dg, DbAdapter dbAdapter,
JdbcFactory.getSimpleTemplate(dbAdapter.getDbInstance(dbFile)).batchUpdate(insertDDSql, data);
}
+ /**
+ * @param dbFile
+ * @param dg
+ * @param dbAdapter
+ * @param tblName
+ */
+ public static void createDDTbl(File dbFile, DataGroup dg, DbAdapter dbAdapter, String tblName) {
- public static void createDDTbl(File dbFile, DataGroup dg, DbAdapter dbAdapter, String forTable) {
-
- makeDbCols(dg);
- String createDDSql = dbAdapter.createDDSql(forTable);
+ DataType[] colsAry = makeDbCols(dg);
+ String createDDSql = dbAdapter.createDDSql(tblName);
JdbcFactory.getSimpleTemplate(dbAdapter.getDbInstance(dbFile)).update(createDDSql);
Map meta = dg.getAttributes();
List