Timeseries required a nested query
This commit is contained in:
parent
413cfddb37
commit
aae19295ca
|
@ -103,7 +103,7 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten
|
||||||
|
|
||||||
String sql = query.getTimeSeriesQuery();
|
String sql = query.getTimeSeriesQuery();
|
||||||
|
|
||||||
List<String> requestedTableField = query.getRequestedTableField();
|
Set<String> requestedTableField = query.getRequestedTableField();
|
||||||
RecordToDBFields recordToDBMapper = query.getRecordToDBMapper();
|
RecordToDBFields recordToDBMapper = query.getRecordToDBMapper();
|
||||||
|
|
||||||
ResultSet resultSet = statement.executeQuery(sql);
|
ResultSet resultSet = statement.executeQuery(sql);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package org.gcube.accounting.analytics.persistence.postgresql;
|
package org.gcube.accounting.analytics.persistence.postgresql;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -24,10 +23,12 @@ public class Query extends PostgreSQLQuery {
|
||||||
|
|
||||||
public static final String DATE_OF_TIMESERIES_AS_FIELD = AggregatedRecord.START_TIME;
|
public static final String DATE_OF_TIMESERIES_AS_FIELD = AggregatedRecord.START_TIME;
|
||||||
|
|
||||||
|
public static final String NESTED_TABLE_NAME = "nested";
|
||||||
|
|
||||||
private Class<? extends AggregatedRecord<?, ?>> clz;
|
private Class<? extends AggregatedRecord<?, ?>> clz;
|
||||||
private final RecordToDBFields recordToDBFields;
|
private final RecordToDBFields recordToDBFields;
|
||||||
|
|
||||||
private List<String> requestedTableField;
|
private Set<String> requestedTableField;
|
||||||
|
|
||||||
protected TemporalConstraint temporalConstraint;
|
protected TemporalConstraint temporalConstraint;
|
||||||
protected List<Filter> filters;
|
protected List<Filter> filters;
|
||||||
|
@ -62,7 +63,7 @@ public class Query extends PostgreSQLQuery {
|
||||||
this.recordToDBFields = RecordToDBMapping.getRecordToDBFields(clz);
|
this.recordToDBFields = RecordToDBMapping.getRecordToDBFields(clz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getRequestedTableField() {
|
public Set<String> getRequestedTableField() {
|
||||||
return requestedTableField;
|
return requestedTableField;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +166,7 @@ public class Query extends PostgreSQLQuery {
|
||||||
addOrConditions(orConditionKey, orConditionValues);
|
addOrConditions(orConditionKey, orConditionValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addEmittedFields() throws Exception {
|
protected void addEmittedFields(boolean addNested) throws Exception {
|
||||||
Set<String> aggregatedField = clz.newInstance().getAggregatedFields();
|
Set<String> aggregatedField = clz.newInstance().getAggregatedFields();
|
||||||
for(String fieldName : aggregatedField) {
|
for(String fieldName : aggregatedField) {
|
||||||
String dbField = getTableField(fieldName);
|
String dbField = getTableField(fieldName);
|
||||||
|
@ -177,12 +178,20 @@ public class Query extends PostgreSQLQuery {
|
||||||
|
|
||||||
case AggregatedRecord.OPERATION_COUNT:
|
case AggregatedRecord.OPERATION_COUNT:
|
||||||
stringBuffer.append(", SUM(");
|
stringBuffer.append(", SUM(");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
stringBuffer.append(dbField);
|
stringBuffer.append(dbField);
|
||||||
stringBuffer.append(") AS ");
|
stringBuffer.append(") AS ");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AggregatedStorageUsageRecord.DATA_VOLUME:
|
case AggregatedStorageUsageRecord.DATA_VOLUME:
|
||||||
stringBuffer.append(", SUM(");
|
stringBuffer.append(", SUM(");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
stringBuffer.append(dbField);
|
stringBuffer.append(dbField);
|
||||||
stringBuffer.append(") AS ");
|
stringBuffer.append(") AS ");
|
||||||
break;
|
break;
|
||||||
|
@ -190,22 +199,42 @@ public class Query extends PostgreSQLQuery {
|
||||||
// WEIGHTED AVERAGE
|
// WEIGHTED AVERAGE
|
||||||
case AggregatedServiceUsageRecord.DURATION:
|
case AggregatedServiceUsageRecord.DURATION:
|
||||||
stringBuffer.append(", ROUND(SUM(");
|
stringBuffer.append(", ROUND(SUM(");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
stringBuffer.append(dbField);
|
stringBuffer.append(dbField);
|
||||||
stringBuffer.append("*");
|
stringBuffer.append("*");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
appendTableField(AggregatedRecord.OPERATION_COUNT);
|
appendTableField(AggregatedRecord.OPERATION_COUNT);
|
||||||
stringBuffer.append(")/SUM(");
|
stringBuffer.append(")/SUM(");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
appendTableField(AggregatedRecord.OPERATION_COUNT);
|
appendTableField(AggregatedRecord.OPERATION_COUNT);
|
||||||
stringBuffer.append(")) AS ");
|
stringBuffer.append(")) AS ");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AggregatedServiceUsageRecord.MAX_INVOCATION_TIME:
|
case AggregatedServiceUsageRecord.MAX_INVOCATION_TIME:
|
||||||
stringBuffer.append(", MAX(");
|
stringBuffer.append(", MAX(");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
stringBuffer.append(dbField);
|
stringBuffer.append(dbField);
|
||||||
stringBuffer.append(") AS ");
|
stringBuffer.append(") AS ");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AggregatedServiceUsageRecord.MIN_INVOCATION_TIME:
|
case AggregatedServiceUsageRecord.MIN_INVOCATION_TIME:
|
||||||
stringBuffer.append(", MIN(");
|
stringBuffer.append(", MIN(");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
stringBuffer.append(dbField);
|
stringBuffer.append(dbField);
|
||||||
stringBuffer.append(") AS ");
|
stringBuffer.append(") AS ");
|
||||||
break;
|
break;
|
||||||
|
@ -225,21 +254,9 @@ public class Query extends PostgreSQLQuery {
|
||||||
return calendarEnum.name().toLowerCase();
|
return calendarEnum.name().toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addRequestedDate() {
|
|
||||||
String calendarInterval = getTimeBucketCalendarInterval(temporalConstraint.getAggregationMode());
|
|
||||||
String tableField = getTableField(DATE_OF_TIMESERIES_AS_FIELD);
|
|
||||||
stringBuffer.append("date_trunc('");
|
|
||||||
stringBuffer.append(calendarInterval);
|
|
||||||
stringBuffer.append("', ");
|
|
||||||
stringBuffer.append(tableField);
|
|
||||||
stringBuffer.append(") ");
|
|
||||||
stringBuffer.append(tableField);
|
|
||||||
requestedTableField.add(tableField);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void newQuery() {
|
private void newQuery() {
|
||||||
stringBuffer = new StringBuffer();
|
stringBuffer = new StringBuffer();
|
||||||
requestedTableField = new ArrayList<>();
|
requestedTableField = new HashSet<>();
|
||||||
stringBuffer.append("SELECT ");
|
stringBuffer.append("SELECT ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,13 +274,21 @@ public class Query extends PostgreSQLQuery {
|
||||||
appendValue(temporalConstraint.getAlignedEndTime());
|
appendValue(temporalConstraint.getAlignedEndTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addDateGroupBy() {
|
protected void addDateGroupBy(boolean addNested) {
|
||||||
stringBuffer.append(" GROUP BY ");
|
stringBuffer.append(" GROUP BY ");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
appendTableField(DATE_OF_TIMESERIES_AS_FIELD);
|
appendTableField(DATE_OF_TIMESERIES_AS_FIELD);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addDateOrderBy() {
|
protected void addDateOrderBy(boolean addNested) {
|
||||||
stringBuffer.append(" ORDER BY ");
|
stringBuffer.append(" ORDER BY ");
|
||||||
|
if(addNested) {
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
}
|
||||||
appendTableField(DATE_OF_TIMESERIES_AS_FIELD);
|
appendTableField(DATE_OF_TIMESERIES_AS_FIELD);
|
||||||
stringBuffer.append(" ASC");
|
stringBuffer.append(" ASC");
|
||||||
}
|
}
|
||||||
|
@ -299,12 +324,33 @@ public class Query extends PostgreSQLQuery {
|
||||||
stringBuffer.append(dbField);
|
stringBuffer.append(dbField);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void addRequestedDate() {
|
||||||
|
String calendarInterval = getTimeBucketCalendarInterval(temporalConstraint.getAggregationMode());
|
||||||
|
String tableField = getTableField(DATE_OF_TIMESERIES_AS_FIELD);
|
||||||
|
stringBuffer.append("date_trunc('");
|
||||||
|
stringBuffer.append(calendarInterval);
|
||||||
|
stringBuffer.append("', ");
|
||||||
|
stringBuffer.append(tableField);
|
||||||
|
stringBuffer.append(" AT TIME ZONE 'UTC') ");
|
||||||
|
stringBuffer.append(tableField);
|
||||||
|
requestedTableField.add(tableField);
|
||||||
|
}
|
||||||
|
|
||||||
public String getTimeSeriesQuery() throws Exception {
|
public String getTimeSeriesQuery() throws Exception {
|
||||||
newQuery();
|
newQuery();
|
||||||
|
|
||||||
addRequestedDate();
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
stringBuffer.append(".");
|
||||||
|
String tableField = getTableField(DATE_OF_TIMESERIES_AS_FIELD);
|
||||||
|
stringBuffer.append(tableField);
|
||||||
|
|
||||||
addEmittedFields();
|
addEmittedFields(true);
|
||||||
|
|
||||||
|
/* Nested Query */
|
||||||
|
stringBuffer.append(" FROM ( SELECT ");
|
||||||
|
|
||||||
|
addRequestedDate();
|
||||||
|
addEmittedFields(false);
|
||||||
|
|
||||||
stringBuffer.append(" FROM ");
|
stringBuffer.append(" FROM ");
|
||||||
stringBuffer.append(recordToDBFields.getTableName());
|
stringBuffer.append(recordToDBFields.getTableName());
|
||||||
|
@ -314,8 +360,16 @@ public class Query extends PostgreSQLQuery {
|
||||||
addFilters();
|
addFilters();
|
||||||
addContextFilter();
|
addContextFilter();
|
||||||
|
|
||||||
addDateGroupBy();
|
addDateGroupBy(false);
|
||||||
addDateOrderBy();
|
addDateOrderBy(false);
|
||||||
|
|
||||||
|
stringBuffer.append(") AS ");
|
||||||
|
stringBuffer.append(NESTED_TABLE_NAME);
|
||||||
|
|
||||||
|
/* Nested Query */
|
||||||
|
|
||||||
|
addDateGroupBy(true);
|
||||||
|
addDateOrderBy(true);
|
||||||
|
|
||||||
return stringBuffer.toString();
|
return stringBuffer.toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest {
|
||||||
protected TemporalConstraint getTemporalConstraint() {
|
protected TemporalConstraint getTemporalConstraint() {
|
||||||
Calendar startTimeCalendar = Calendar.getInstance();
|
Calendar startTimeCalendar = Calendar.getInstance();
|
||||||
startTimeCalendar.set(Calendar.YEAR, 2015);
|
startTimeCalendar.set(Calendar.YEAR, 2015);
|
||||||
startTimeCalendar.set(Calendar.MONTH, Calendar.MARCH);
|
startTimeCalendar.set(Calendar.MONTH, Calendar.JANUARY);
|
||||||
startTimeCalendar.set(Calendar.DAY_OF_MONTH, 1);
|
startTimeCalendar.set(Calendar.DAY_OF_MONTH, 1);
|
||||||
startTimeCalendar.set(Calendar.HOUR_OF_DAY, 0);
|
startTimeCalendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
startTimeCalendar.set(Calendar.MINUTE, 0);
|
startTimeCalendar.set(Calendar.MINUTE, 0);
|
||||||
|
@ -75,7 +75,7 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest {
|
||||||
entTimeCalendar.set(Calendar.HOUR_OF_DAY, 0);
|
entTimeCalendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
entTimeCalendar.set(Calendar.MINUTE, 0);
|
entTimeCalendar.set(Calendar.MINUTE, 0);
|
||||||
|
|
||||||
TemporalConstraint temporalConstraint = new TemporalConstraint(startTimeCalendar.getTimeInMillis(), entTimeCalendar.getTimeInMillis(), AggregationMode.MINUTELY);
|
TemporalConstraint temporalConstraint = new TemporalConstraint(startTimeCalendar.getTimeInMillis(), entTimeCalendar.getTimeInMillis(), AggregationMode.MONTHLY);
|
||||||
|
|
||||||
return temporalConstraint;
|
return temporalConstraint;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue