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 2c156a7..0b764a2 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 @@ -3,6 +3,7 @@ */ package org.gcube.accounting.analytics.persistence.postgresql; +import java.io.Serializable; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; @@ -263,7 +264,46 @@ public class AccountingPersistenceQueryPostgreSQL implements AccountingPersisten @Override public Record getRecord(String recordId, String type) throws Exception { - return null; + Class> aggregatedRecordClass = RecordUtility.getAggregatedRecordClass(type); + Connection connection = getConnection(aggregatedRecordClass); + try { + Statement statement = connection.createStatement(); + + Query query = new Query(aggregatedRecordClass); + query.setRecordId("fa573711-ceb6-44ba-9c83-bd47e0915b80"); + String sql = query.getRecordQuery(); + + RecordToDBFields recordToDBMapper = query.getRecordToDBMapper(); + + ResultSet resultSet = statement.executeQuery(sql); + resultSet.next(); + + AggregatedRecord instance = aggregatedRecordClass.newInstance(); + Set requiredFields = instance.getRequiredFields(); + + for(String recordField : requiredFields) { + String tableField = recordToDBMapper.getTableField(recordField); + Serializable serializable; + switch (recordField) { + case AggregatedRecord.START_TIME: case AggregatedRecord.END_TIME: case AggregatedRecord.CREATION_TIME: + OffsetDateTime offsetDateTime = resultSet.getObject(tableField, OffsetDateTime.class); + Calendar calendar = getCalendar(offsetDateTime); + serializable = calendar.getTimeInMillis(); + break; + + default: + serializable = resultSet.getObject(tableField).toString(); + break; + } + instance.setResourceProperty(recordField, serializable); + } + + return instance; + + }finally { + connection.close(); + } + } @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 97d9661..6287126 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 @@ -34,7 +34,8 @@ public class Query extends PostgreSQLQuery { private String fieldOfRequesteValues; private String orderByField; private Integer limit; - + + private String recordId; public Query(Class> clz) throws Exception { this.clz = clz; @@ -76,7 +77,11 @@ public class Query extends PostgreSQLQuery { contexts.add(context); } - + public void setRecordId(String recordId) { + this.recordId = recordId; + } + + public RecordToDBFields getRecordToDBMapper() { return recordToDBFields; } @@ -300,4 +305,15 @@ public class Query extends PostgreSQLQuery { return stringBuffer.toString(); } + public String getRecordQuery(){ + newQuery(); + stringBuffer.append("* "); + stringBuffer.append(" FROM "); + stringBuffer.append(recordToDBFields.getTableName()); + stringBuffer.append(" WHERE "); + stringBuffer.append(" id="); + appendString(recordId); + 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 96e2db1..b11551b 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 @@ -21,6 +21,8 @@ import org.gcube.accounting.analytics.persistence.AccountingPersistenceBackendQu import org.gcube.accounting.analytics.persistence.AccountingPersistenceQuery; import org.gcube.accounting.datamodel.UsageRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; +import org.gcube.accounting.utility.postgresql.RecordToDBMapping; +import org.gcube.documentstore.records.Record; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; @@ -204,8 +206,13 @@ public class AccountingPersistenceQueryPostgreSQLTest extends ContextTest { Info info = timeseries.get(c); logger.debug("{}", info); } - } - - + } + } + + @Test + public void testGetRecord() throws Exception { + String type = RecordToDBMapping.getRecordTypeByClass(AggregatedServiceUsageRecord.class); + Record record = accountingPersistenceQueryPostgreSQL.getRecord("fa573711-ceb6-44ba-9c83-bd47e0915b80", type); + logger.debug("{}", record); } } \ No newline at end of file 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 cc35a9f..2bcbea6 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 @@ -85,7 +85,15 @@ public class QueryTest extends ContextTest { query.setOrderByField(AccountingPersistenceQuery.getDefaultOrderingProperties(AggregatedServiceUsageRecord.class)); ret = query.getNextPossibleValueQuery(); logger.debug(ret); - + } + + + @Test + public void testGetRecordQuery() throws Exception { + Query query = new Query(AggregatedServiceUsageRecord.class); + query.setRecordId("fa573711-ceb6-44ba-9c83-bd47e0915b80"); + String ret = query.getRecordQuery(); + logger.debug(ret); } }