From dc27ed4af4da47e3df02b537f196faa7e58271e1 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Wed, 17 Mar 2021 17:55:56 +0100 Subject: [PATCH] implementing methods --- .../AccountingPersistenceQueryPostgreSQL.java | 101 ++++++++++-------- .../persistence/postgresql/Query.java | 37 ++++++- ...ountingPersistenceQueryPostgreSQLTest.java | 32 +++++- .../persistence/postgresql/ContextTest.java | 2 +- .../persistence/postgresql/QueryTest.java | 14 ++- 5 files changed, 136 insertions(+), 50 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 330ee91..5cece82 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 @@ -9,8 +9,10 @@ import java.sql.Statement; import java.time.OffsetDateTime; import java.util.Calendar; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; @@ -84,12 +86,57 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten this.usageRecordDB = new HashMap<>(); } + public SortedMap getTimeSeries(Class> clz, + TemporalConstraint temporalConstraint, List filters, Set contexts) + throws Exception { + Connection connection = getConnection(clz); + try { + Statement statement = connection.createStatement(); + + SortedMap result = new TreeMap<>(); + + Query query = new Query(clz); + query.setTemporalConstraint(temporalConstraint); + query.setFilters(filters); + query.setContexts(contexts); + + String sql = query.getTimeSeriesQuery(); + + List requestedTableField = query.getRequestedTableField(); + RecordToDBMapper recordToDBMapper = query.getRecordToDBMapper(); + + ResultSet resultSet = statement.executeQuery(sql); + + while (resultSet.next()) { + OffsetDateTime offsetDateTime = resultSet.getObject(Query.DATE_OF_TIMESERIES_AS_FIELD, OffsetDateTime.class); + Calendar calendar = getCalendar(offsetDateTime); + + JSONObject jsonObject = new JSONObject(); + + for(String tableField : requestedTableField) { + String usageRecordField = recordToDBMapper.getUsageRecordField(tableField); + Object object = resultSet.getObject(tableField); + jsonObject.put(usageRecordField, object); + } + + Info info = new Info(calendar, jsonObject); + result.put(calendar, info); + } + + return result; + }finally { + connection.close(); + } + } + @Override public SortedMap getTimeSeries(Class> clz, TemporalConstraint temporalConstraint, List filters) throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { - // TODO Auto-generated method stub - return null; + String currentScope = AccountingPersistenceBackendQuery.getScopeToQuery(); + Set contexts = new HashSet<>(); + contexts.add(currentScope); + return getTimeSeries(clz, temporalConstraint, filters, contexts); } protected Calendar getCalendar(OffsetDateTime offsetDateTime) { @@ -103,38 +150,7 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten public SortedMap getNoContextTimeSeries(Class> clz, TemporalConstraint temporalConstraint, List filters) throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { - Connection connection = getConnection(clz); - Statement statement = connection.createStatement(); - - SortedMap result = new TreeMap<>(); - - Query query = new Query(clz); - query.setTemporalConstraint(temporalConstraint); - query.setFilters(filters); - String sql = query.getNoContextTimeSeriesQuery(); - - List requestedTableField = query.getRequestedTableField(); - RecordToDBMapper recordToDBMapper = query.getRecordToDBMapper(); - - ResultSet resultSet = statement.executeQuery(sql); - - while (resultSet.next()) { - OffsetDateTime offsetDateTime = resultSet.getObject(Query.DATE_OF_TIMESERIES_AS_FIELD, OffsetDateTime.class); - Calendar calendar = getCalendar(offsetDateTime); - - JSONObject jsonObject = new JSONObject(); - - for(String tableField : requestedTableField) { - String usageRecordField = recordToDBMapper.getUsageRecordField(tableField); - Object object = resultSet.getObject(tableField); - jsonObject.put(usageRecordField, object); - } - - Info info = new Info(calendar, jsonObject); - result.put(calendar, info); - } - - return result; + return getTimeSeries(clz, temporalConstraint, filters, null); } @Override @@ -145,6 +161,13 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten // TODO Auto-generated method stub return null; } + + @Override + public SortedSet getFilterValues(Class> clz, + TemporalConstraint temporalConstraint, List filters, String key) throws Exception { + // TODO Auto-generated method stub + return null; + } @Override public SortedSet getNextPossibleValues(Class> clz, @@ -164,15 +187,7 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten @Override public void close() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public SortedSet getFilterValues(Class> clz, - TemporalConstraint temporalConstraint, List filters, String key) throws Exception { - // TODO Auto-generated method stub - return null; + // OK } @Override diff --git a/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/Query.java b/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/Query.java index 57cc159..081e8f8 100644 --- a/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/Query.java +++ b/src/main/java/org/gcube/accounting/analytics/persistence/postgresql/Query.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -11,6 +12,7 @@ import org.gcube.accounting.analytics.Filter; import org.gcube.accounting.analytics.TemporalConstraint; import org.gcube.accounting.analytics.TemporalConstraint.AggregationMode; import org.gcube.accounting.analytics.TemporalConstraint.CalendarEnum; +import org.gcube.accounting.datamodel.UsageRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; import org.gcube.documentstore.records.AggregatedRecord; @@ -45,9 +47,18 @@ public class Query { public void setFilters(List filters) { this.filters = filters; } + public void setContexts(Set contexts) { this.contexts = contexts; } + + public void addContext(String context) { + if(contexts == null) { + contexts = new HashSet<>(); + } + contexts.add(context); + } + public RecordToDBMapper getRecordToDBMapper() { return recordToDBMapper; @@ -113,6 +124,26 @@ public class Query { } } + protected void addContextFilter() { + if(contexts!=null && contexts.size()>0) { + // The first filter if the time_bucket + stringBuffer.append(" AND ("); + boolean first = true; + for(String context : contexts) { + if(first) { + first = false; + }else { + stringBuffer.append(" OR "); + } + appendTableField(UsageRecord.SCOPE); + stringBuffer.append("="); + appendValue(context); + } + stringBuffer.append(")"); + } + } + + protected void addEmittedFields() throws Exception { Set aggregatedField = clz.newInstance().getAggregatedFields(); for(String fieldName : aggregatedField) { @@ -209,7 +240,7 @@ public class Query { stringBuffer.append(" ASC"); } - public String getNoContextTimeSeriesQuery() throws Exception { + public String getTimeSeriesQuery() throws Exception { newQuery(); addTimeBucket(); @@ -222,10 +253,12 @@ public class Query { addTemporalConstraintToQuery(); addFilters(); + addContextFilter(); addGropuBy(); addOrderBy(); return stringBuffer.toString(); - } + } + } 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 60c62b5..9f9ad63 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 @@ -42,7 +42,7 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest { } @Test - public void testGetNoContextTimeSeriesQuery() throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { + public void testGetNoContextTimeSeries() throws DuplicatedKeyFilterException, KeyException, ValueException, Exception { Calendar startTimeCalendar = Calendar.getInstance(); startTimeCalendar.set(Calendar.YEAR, 2020); startTimeCalendar.set(Calendar.MONTH, Calendar.MARCH); @@ -68,4 +68,32 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest { } } -} + + @Test + public void testTimeSeries() 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.MINUTELY); + SortedMap timeseries = accountingPersistenceQueryPostgreSQL.getTimeSeries(AggregatedServiceUsageRecord.class, temporalConstraint, filters); + for(Calendar c : timeseries.keySet()) { + Info info = timeseries.get(c); + logger.debug("{}", info); + } + } + +} \ No newline at end of file diff --git a/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/ContextTest.java b/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/ContextTest.java index a386db0..a1dc1ef 100644 --- a/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/ContextTest.java +++ b/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/ContextTest.java @@ -81,7 +81,7 @@ public class ContextTest { setContext(token); } - private static void setContext(String token) throws ObjectNotFound, Exception { + public static void setContext(String token) throws ObjectNotFound, Exception { SecurityTokenProvider.instance.set(token); AuthorizationEntry authorizationEntry = Constants.authorizationService().get(token); ClientInfo clientInfo = authorizationEntry.getClientInfo(); diff --git a/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/QueryTest.java b/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/QueryTest.java index 27d8d94..67af507 100644 --- a/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/QueryTest.java +++ b/src/test/java/org/gcube/accounting/analytics/persistence/postgresql/QueryTest.java @@ -5,12 +5,15 @@ package org.gcube.accounting.analytics.persistence.postgresql; import java.util.ArrayList; import java.util.Calendar; +import java.util.HashSet; import java.util.List; import java.util.Random; +import java.util.Set; import org.gcube.accounting.analytics.Filter; import org.gcube.accounting.analytics.TemporalConstraint; import org.gcube.accounting.analytics.TemporalConstraint.AggregationMode; +import org.gcube.accounting.analytics.persistence.AccountingPersistenceBackendQuery; import org.gcube.accounting.datamodel.UsageRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; import org.junit.Test; @@ -60,9 +63,16 @@ public class QueryTest extends ContextTest { Query query = new Query(AggregatedServiceUsageRecord.class); query.setTemporalConstraint(temporalConstraint); query.setFilters(filters); - String ret = query.getNoContextTimeSeriesQuery(); + String ret = query.getTimeSeriesQuery(); + logger.debug(ret); + + String currentScope = AccountingPersistenceBackendQuery.getScopeToQuery(); + Set contexts = new HashSet<>(); + contexts.add(currentScope); + query.setContexts(contexts); + ret = query.getTimeSeriesQuery(); logger.debug(ret); } - + }