bugs fixed in showcreatetable and samplings operations. In these operation it is useful to insert the table name in a query as "schema.table" for postgres and "db.table" for mysql.

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-access/DatabasesResourcesManager@98907 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Loredana Liccardo 2014-07-23 15:11:58 +00:00
parent aa3fbea54b
commit 229f351f7d
4 changed files with 63 additions and 17 deletions

View File

@ -18,11 +18,13 @@ import org.hibernate.SessionFactory;
public class Sampler {
// query to perform sample operation on the table
private static final String queryForSampleOnTablePostgres = "select %1$s from \"%2$s\" limit 100";
// private static final String queryForSampleOnTablePostgres = "select %1$s from \"%2$s\" limit 100";
private static final String queryForSampleOnTablePostgres = "select %1$s from %2$s limit 100";
private static final String queryForSampleOnTableMysql = "select %1$s from %2$s limit 100";
// query to perform a smart sample operation randomly on the table
private static final String queryForSmartSampleOnTablePostgres = "select %1$s from \"%2$s\" order by random() limit 200";
// private static final String queryForSmartSampleOnTablePostgres = "select %1$s from \"%2$s\" order by random() limit 200";
private static final String queryForSmartSampleOnTablePostgres = "select %1$s from %2$s order by random() limit 200";
private static final String queryForSmartSampleOnTableMysql = "select %1$s from %2$s order by rand() limit 200";
// private static final String queryForSmartSampleOnTablePostgres =
// "select * from \"%1$s\" order by random() limit 200";
@ -31,7 +33,8 @@ public class Sampler {
// query to perform a smart sample operation on the table considering the
// threshold
private static final String queryForSmartSampleWithThresholdOnTablePostgres = "select %1$s from \"%2$s\" limit 200 offset %3$s";
// private static final String queryForSmartSampleWithThresholdOnTablePostgres = "select %1$s from \"%2$s\" limit 200 offset %3$s";
private static final String queryForSmartSampleWithThresholdOnTablePostgres = "select %1$s from %2$s limit 200 offset %3$s";
// private static final String queryForSmartSampleWithThresholdOnTableMysql
// = "select %1$s from %2$s limit 200 offset %3$s";
@ -40,7 +43,8 @@ public class Sampler {
// "select %1$s from \"%2$s\" order by random() limit 100";
// query to perform a smart sample operation on the table considering the
// threshold
private static final String queryForRandomSampleWithThresholdOnTablePostgres = "select %1$s from \"%2$s\" limit 100 offset %3$s";
// private static final String queryForRandomSampleWithThresholdOnTablePostgres = "select %1$s from \"%2$s\" limit 100 offset %3$s";
private static final String queryForRandomSampleWithThresholdOnTablePostgres = "select %1$s from %2$s limit 100 offset %3$s";
private static final String queryForRandomSampleOnTableMysql = "select %1$s from %2$s order by rand() limit 100";
private static final String queryForRandomSampleOnTablePostgres = "select %1$s from %2$s order by random() limit 100";
@ -92,6 +96,9 @@ public class Sampler {
if (DBType.equals(POSTGRES)) {
//the full name equal to "schemaname.tablename"
tableName=schemaName+"."+tableName;
querySampleOnTable = String.format(queryForSampleOnTablePostgres,
listAttributes, tableName);
@ -99,6 +106,9 @@ public class Sampler {
if (DBType.equals(MYSQL)) {
//the full name equal to "dbname.tablename"
tableName=schemaName+"."+tableName;
querySampleOnTable = String.format(queryForSampleOnTableMysql,
listAttributes, tableName);
@ -499,6 +509,9 @@ public class Sampler {
// build the query for database postgres
if (DBType.equals(POSTGRES)) {
//the full name equal to "schemaname.tablename"
tablename=schemaName+"."+tablename;
query = String.format(queryForSmartSampleOnTablePostgres,
listAttributes, tablename);
@ -506,6 +519,9 @@ public class Sampler {
// build the query for database mysql
if (DBType.equals(MYSQL)) {
//the full name equal to "dbname.tablename"
tablename=schemaName+"."+tablename;
query = String.format(queryForSmartSampleOnTableMysql,
listAttributes, tablename);
@ -886,6 +902,9 @@ public class Sampler {
// build the query for database postgres
if (DBType.equals(POSTGRES)) {
//the full name equal to "schemaname.tablename"
tablename=schemaName+"."+tablename;
query = String.format(
queryForSmartSampleWithThresholdOnTablePostgres,
listAttributes, tablename, indexes[i]);
@ -1204,6 +1223,9 @@ public class Sampler {
if ((NumRows <= 700000) && (DBType.equals(POSTGRES))) { // Postgres
//the full name equal to "schemaname.tablename"
tableName=schemaName+"."+tableName;
querySampleOnTable = String.format(
queryForRandomSampleOnTablePostgres, listAttributes,
tableName);
@ -1212,6 +1234,9 @@ public class Sampler {
if ((NumRows > 700000) && (DBType.equals(POSTGRES))) { // Postgres
//the full name equal to "schemaname.tablename"
tableName=schemaName+"."+tableName;
// generate an index randomly to execute the query
// Define threshold
@ -1255,6 +1280,9 @@ public class Sampler {
if (DBType.equals(MYSQL)) { // MySQL
//the full name equal to "dbname.tablename"
tableName=schemaName+"."+tableName;
querySampleOnTable = String
.format(queryForRandomSampleOnTableMysql, listAttributes,
tableName);

View File

@ -24,6 +24,7 @@ public class MySQLTableStructure extends AbstractTableStructure {
// Retrieve the query
String queryForIndexes = getQueryForIndexes(dbSession);
try {
// List<Object> indexSet = DatabaseFactory.executeSQLQuery(
@ -36,6 +37,9 @@ public class MySQLTableStructure extends AbstractTableStructure {
// String createTableStatement = (String) (((Object[])
// indexSet.get(0))[1]);
//the full name equal to "dbname.tablename"
tableName = this.databaseName+"."+tableName;
List<Object> result = connection.executeQuery(
String.format(queryForIndexes, tableName), dbSession);
@ -79,7 +83,9 @@ public class MySQLTableStructure extends AbstractTableStructure {
throws Exception {
// TODO Auto-generated method stub
String queryForIndexes = "SHOW CREATE TABLE `%1$s`;";
// String queryForIndexes = "SHOW CREATE TABLE `%1$s`;";
String queryForIndexes = "SHOW CREATE TABLE %1$s;";
return queryForIndexes;

View File

@ -610,12 +610,13 @@ public class DatabaseManagement {
}
// Method that returns the estimated number of rows
public long getNumberOfRows(String tablename) throws Exception {
public long getNumberOfRows(String tablename, String schemaName) throws Exception {
long rows;
rows = op.calculateElements(connection, DBType, tablename,
rows = op.calculateElements(connection, DBType, tablename, schemaName,
sourceDBSession);
AnalysisLogger.getLogger().debug(
"DatabaseManagement->rows' number calculated: " + rows);
@ -654,7 +655,7 @@ public class DatabaseManagement {
if (estimatedRows == 0) {
// estimatedRows = Integer.valueOf(getNumberOfRows(tableName));
estimatedRows = getNumberOfRows(tableName);
estimatedRows = getNumberOfRows(tableName, schemaName);
}
// to retrieve datatype columns of a table
@ -861,7 +862,7 @@ public class DatabaseManagement {
if (estimatedRows == 0) {
estimatedRows = getNumberOfRows(tableName);
estimatedRows = getNumberOfRows(tableName, schemaName);
}
Sampler sampler = new Sampler();

View File

@ -21,16 +21,20 @@ public class DatabaseOperations {
// private static final String QueryPostgres =
// "select count(*) from \"%1$s\" limit 1";
private static final String QueryPostgres = "select count(*) from (select * from \"%1$s\" limit 1) as a";
private static final String QueryMysql = "select count(*) from (select * from `%1$s` limit 1) as a";
// private static final String QueryPostgres = "select count(*) from (select * from \"%1$s\" limit 1) as a";
private static final String QueryPostgres = "select count(*) from (select * from %1$s limit 1) as a";
// private static final String QueryMysql = "select count(*) from (select * from `%1$s` limit 1) as a";
private static final String QueryMysql = "select count(*) from (select * from %1$s limit 1) as a";
// private static final String QueryMysql =
// "select count(*) from `%1$s` limit 1";
// private static final String Query = "select * from %1$s limit 1";
// private static final String countQuery = "select count(*) from %1$s";
// private static final String explainQuery = "explain select * from %1$s";
private static final String explainQueryPostgres = "explain select * from \"%1$s\"";
private static final String explainQueryMysql = "explain select * from `%1$s`";
// private static final String explainQueryPostgres = "explain select * from \"%1$s\"";
private static final String explainQueryPostgres = "explain select * from %1$s";
// private static final String explainQueryMysql = "explain select * from `%1$s`";
private static final String explainQueryMysql = "explain select * from %1$s";
private static final String MYSQL = "MySQL";
private static final String POSTGRES = "Postgres";
@ -104,7 +108,7 @@ public class DatabaseOperations {
// Method that calculate the estimated number of rows
public long calculateElements(ConnectionManager connection,
String dbType, String tablename, SessionFactory session)
String dbType, String tablename, String schemaName, SessionFactory session)
throws Exception {
long count = 0;
@ -113,10 +117,15 @@ public class DatabaseOperations {
if (dbType.equals(POSTGRES)) {
//the full name equal to "schemaname.tablename"
tablename=schemaName+"."+tablename;
countingQuery = String.format(QueryPostgres, tablename);
}
if (dbType.equals(MYSQL)) {
//the full name equal to "dbname.tablename"
tablename=schemaName+"."+tablename;
countingQuery = String.format(QueryMysql, tablename);
@ -165,11 +174,13 @@ public class DatabaseOperations {
if (dbType.equals(POSTGRES)) {
explain = String.format(explainQueryPostgres, tablename);
}
if (dbType.equals(MYSQL)) {
explain = String.format(explainQueryMysql, tablename);
}