From 94f42198522a60a15293a44891e7eb9ae3cee78b Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Mon, 22 Mar 2021 11:53:12 +0100 Subject: [PATCH] Implementing query --- .../AccountingPersistenceQueryPostgreSQL.java | 61 ++++++++++----- ...ountingPersistenceQueryPostgreSQLTest.java | 77 ++++++++++++++++++- 2 files changed, 115 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQL.java b/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQL.java index 0b4c344..44462f1 100644 --- a/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQL.java +++ b/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQL.java @@ -131,9 +131,9 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten public SortedMap getTimeSeries(Class> clz, TemporalConstraint temporalConstraint, List filters) throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { - String currentScope = AccountingPersistenceBackendQuery.getScopeToQuery(); + String context = AccountingPersistenceBackendQuery.getScopeToQuery(); Set contexts = new HashSet<>(); - contexts.add(currentScope); + contexts.add(context); return getTimeSeries(clz, temporalConstraint, filters, contexts); } @@ -151,6 +151,25 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten return getTimeSeries(clz, temporalConstraint, filters, null); } + + @Override + public SortedMap> getContextTimeSeries( + Class> clz, TemporalConstraint temporalConstraint, List filters, + List contexts) throws Exception { + + SortedMap> ret = new TreeMap<>(); + for(String context : contexts) { + Filter contextFilter = new Filter("context", context); + Set timeSeriesContexts = new HashSet<>(); + timeSeriesContexts.add(context); + SortedMap timeSeries = getTimeSeries(clz, temporalConstraint, filters, timeSeriesContexts); + if(!timeSeries.isEmpty()) { + ret.put(contextFilter, timeSeries); + } + } + return ret; + } + protected SortedSet getNumberedValues(Class> clz, TemporalConstraint temporalConstraint, List filters, String key, String orderingProperty, Integer limit) throws Exception { @@ -168,9 +187,9 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten SortedSet result = new TreeSet<>(); - String currentScope = AccountingPersistenceBackendQuery.getScopeToQuery(); + String context = AccountingPersistenceBackendQuery.getScopeToQuery(); Set contexts = new HashSet<>(); - contexts.add(currentScope); + contexts.add(context); Query query = new Query(clz); query.setTemporalConstraint(temporalConstraint); @@ -218,15 +237,23 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten Class> clz, TemporalConstraint temporalConstraint, List filters, String topKey, String orderingProperty) throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { - // TODO Auto-generated method stub - return null; - } - - @Override - public JSONObject getUsageValue(Class> clz, TemporalConstraint temporalConstraint, - Filter applicant) throws Exception { - // TODO Auto-generated method stub - return null; + + String context = AccountingPersistenceBackendQuery.getScopeToQuery(); + Set contexts = new HashSet<>(); + contexts.add(context); + + SortedMap> ret = new TreeMap<>(); + + SortedSet top = getNumberedValues(clz, temporalConstraint, filters, topKey, orderingProperty, 3); + + for(NumberedFilter numberedFilter : top) { + filters.add(numberedFilter); + SortedMap map = getTimeSeries(clz, temporalConstraint, filters, contexts); + ret.put(numberedFilter, map); + filters.remove(numberedFilter); + } + + return ret; } @Override @@ -235,14 +262,6 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten return null; } - @Override - public SortedMap> getContextTimeSeries( - Class> clz, TemporalConstraint temporalConstraint, List filters, - List contexts) throws Exception { - // TODO Auto-generated method stub - return null; - } - @Override public String getRecord(String recordId, String type) throws Exception { // TODO Auto-generated method stub diff --git a/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQLTest.java b/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQLTest.java index 194ceb3..96e2db1 100644 --- a/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQLTest.java +++ b/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/AccountingPersistenceQueryPostgreSQLTest.java @@ -18,6 +18,7 @@ import org.gcube.accounting.analytics.exception.DuplicatedKeyFilterException; import org.gcube.accounting.analytics.exception.KeyException; import org.gcube.accounting.analytics.exception.ValueException; import org.gcube.accounting.analytics.persistence.AccountingPersistenceBackendQueryConfiguration; +import org.gcube.accounting.analytics.persistence.AccountingPersistenceQuery; import org.gcube.accounting.datamodel.UsageRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; import org.junit.Before; @@ -70,7 +71,6 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest { } } - @Test public void testTimeSeries() throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { Calendar startTimeCalendar = Calendar.getInstance(); @@ -98,6 +98,43 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest { } } + + @Test + public void testContextTimeSeries() throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { + Calendar startTimeCalendar = Calendar.getInstance(); + startTimeCalendar.set(Calendar.YEAR, 2020); + startTimeCalendar.set(Calendar.MONTH, Calendar.MARCH); + startTimeCalendar.set(Calendar.DAY_OF_MONTH, 1); + startTimeCalendar.set(Calendar.HOUR_OF_DAY, 0); + startTimeCalendar.set(Calendar.MINUTE, 0); + + Calendar entTimeCalendar = Calendar.getInstance(); + entTimeCalendar.set(Calendar.MONTH, Calendar.MARCH); + entTimeCalendar.set(Calendar.DAY_OF_MONTH, 15); + entTimeCalendar.set(Calendar.HOUR_OF_DAY, 16); + entTimeCalendar.set(Calendar.MINUTE, 17); + + List filters = new ArrayList<>(); + Filter filter = new Filter(UsageRecord.CONSUMER_ID, QueryTest.getRandomUser()); + filters.add(filter); + + TemporalConstraint temporalConstraint = new TemporalConstraint(startTimeCalendar.getTimeInMillis(), entTimeCalendar.getTimeInMillis(), AggregationMode.MONTHLY); + + List contexts = new ArrayList<>(); + contexts.add("/gcube/devsec/devVRE"); + contexts.add("/gcube/devNext/NextNext"); + + SortedMap> contextTimeseries = accountingPersistenceQueryPostgreSQL.getContextTimeSeries(AggregatedServiceUsageRecord.class, temporalConstraint, filters, contexts); + for(Filter f : contextTimeseries.keySet()) { + logger.debug("{}", f); + SortedMap timeseries = contextTimeseries.get(f); + for(Calendar c : timeseries.keySet()) { + Info info = timeseries.get(c); + logger.debug("{}", info); + } + } + } + @Test public void testGetFilterValues() throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { @@ -130,9 +167,45 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest { } - numberedFilters = accountingPersistenceQueryPostgreSQL.getFilterValues(AggregatedServiceUsageRecord.class, temporalConstraint, filters, AggregatedServiceUsageRecord.CALLED_METHOD, 2); + numberedFilters = accountingPersistenceQueryPostgreSQL.getFilterValues(AggregatedServiceUsageRecord.class, temporalConstraint, filters, AggregatedServiceUsageRecord.CALLED_METHOD, 3); for(NumberedFilter numberedFilter : numberedFilters) { logger.debug("{}", numberedFilter); } } + + @Test + public void testTopValues() throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { + String orderingProperty = AccountingPersistenceQuery.getDefaultOrderingProperties(AggregatedServiceUsageRecord.class); + + Calendar startTimeCalendar = Calendar.getInstance(); + startTimeCalendar.set(Calendar.YEAR, 2020); + startTimeCalendar.set(Calendar.MONTH, Calendar.MARCH); + startTimeCalendar.set(Calendar.DAY_OF_MONTH, 1); + startTimeCalendar.set(Calendar.HOUR_OF_DAY, 0); + startTimeCalendar.set(Calendar.MINUTE, 0); + + Calendar entTimeCalendar = Calendar.getInstance(); + entTimeCalendar.set(Calendar.MONTH, Calendar.MARCH); + entTimeCalendar.set(Calendar.DAY_OF_MONTH, 15); + entTimeCalendar.set(Calendar.HOUR_OF_DAY, 16); + entTimeCalendar.set(Calendar.MINUTE, 17); + + List filters = new ArrayList<>(); + Filter filter = new Filter(UsageRecord.CONSUMER_ID, QueryTest.getRandomUser()); + filters.add(filter); + + TemporalConstraint temporalConstraint = new TemporalConstraint(startTimeCalendar.getTimeInMillis(), entTimeCalendar.getTimeInMillis(), AggregationMode.MONTHLY); + + SortedMap> topTimeSeries = accountingPersistenceQueryPostgreSQL.getTopValues(AggregatedServiceUsageRecord.class, temporalConstraint, filters, AggregatedServiceUsageRecord.CALLED_METHOD, orderingProperty); + for(NumberedFilter numberedFilter : topTimeSeries.keySet()) { + logger.debug("{}", numberedFilter); + SortedMap timeseries = topTimeSeries.get(numberedFilter); + for(Calendar c : timeseries.keySet()) { + Info info = timeseries.get(c); + logger.debug("{}", info); + } + } + + + } } \ No newline at end of file