git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/accounting/accounting-analytics-persistence-couchbase@131196 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
dc6d7844e1
commit
4acf7a9ac7
4
.project
4
.project
|
@ -16,12 +16,12 @@
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
<buildCommand>
|
<buildCommand>
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
<name>org.eclipse.wst.validation.validationbuilder</name>
|
||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
<buildCommand>
|
<buildCommand>
|
||||||
<name>org.eclipse.wst.validation.validationbuilder</name>
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
|
|
29
pom.xml
29
pom.xml
|
@ -8,7 +8,7 @@
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>org.gcube.accounting</groupId>
|
<groupId>org.gcube.accounting</groupId>
|
||||||
<artifactId>accounting-analytics-persistence-couchbase</artifactId>
|
<artifactId>accounting-analytics-persistence-couchbase</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.1.0-SNAPSHOT</version>
|
||||||
<name>Accounting Analytics Persistence CouchBase</name>
|
<name>Accounting Analytics Persistence CouchBase</name>
|
||||||
<description>Accounting Analytics Persistence CouchBase Implementation</description>
|
<description>Accounting Analytics Persistence CouchBase Implementation</description>
|
||||||
|
|
||||||
|
@ -81,6 +81,33 @@
|
||||||
<version>1.0.13</version>
|
<version>1.0.13</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- use for Junit Test -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.resources</groupId>
|
||||||
|
<artifactId>registry-publisher</artifactId>
|
||||||
|
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.core</groupId>
|
||||||
|
<artifactId>common-encryption</artifactId>
|
||||||
|
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.common</groupId>
|
||||||
|
<artifactId>authorization-client</artifactId>
|
||||||
|
<version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.common</groupId>
|
||||||
|
<artifactId>common-authorization</artifactId>
|
||||||
|
<version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- End Use for Junit Test -->
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -0,0 +1,213 @@
|
||||||
|
package org.gcube.accounting.analytics.persistence.couchbase;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.SortedMap;
|
||||||
|
import java.util.SortedSet;
|
||||||
|
|
||||||
|
import org.gcube.accounting.analytics.Filter;
|
||||||
|
import org.gcube.accounting.analytics.Info;
|
||||||
|
import org.gcube.accounting.analytics.NumberedFilter;
|
||||||
|
import org.gcube.accounting.analytics.TemporalConstraint;
|
||||||
|
import org.gcube.accounting.analytics.TemporalConstraint.AggregationMode;
|
||||||
|
import org.gcube.accounting.analytics.persistence.AccountingPersistenceBackendQueryConfiguration;
|
||||||
|
import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Alessandro Pieve (ISTI - CNR)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AccountingPersistenceQueryCouchBaseTest {
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(AccountingPersistenceQueryCouchBaseTest.class);
|
||||||
|
|
||||||
|
protected AccountingPersistenceQueryCouchBase accountingPersistenceQueryCouchBase;
|
||||||
|
|
||||||
|
public class ExtendedInfo extends Info {
|
||||||
|
|
||||||
|
protected String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the key
|
||||||
|
*/
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key the key to set
|
||||||
|
*/
|
||||||
|
public void setKey(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExtendedInfo(String key, Calendar calendar, JSONObject value){
|
||||||
|
super(calendar, value);
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
String info = String .format("Key : %s, %s ", key, super.toString());
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() throws Exception{
|
||||||
|
|
||||||
|
ScopeProvider.instance.set("/gcube/devNext");
|
||||||
|
|
||||||
|
AccountingPersistenceBackendQueryConfiguration configuration = new
|
||||||
|
AccountingPersistenceBackendQueryConfiguration(AccountingPersistenceQueryCouchBase.class);
|
||||||
|
|
||||||
|
accountingPersistenceQueryCouchBase = new AccountingPersistenceQueryCouchBase();
|
||||||
|
accountingPersistenceQueryCouchBase.prepareConnection(configuration);
|
||||||
|
}
|
||||||
|
@After
|
||||||
|
public void after() throws Exception{
|
||||||
|
//SecurityTokenProvider.instance.reset();
|
||||||
|
ScopeProvider.instance.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void printMap(Map<Calendar, Info> map){
|
||||||
|
for(Info info : map.values()){
|
||||||
|
logger.debug("{}", info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws Exception {
|
||||||
|
Calendar startTime = Calendar.getInstance();
|
||||||
|
startTime.set(2016, Calendar.AUGUST, 29);
|
||||||
|
Calendar endTime = Calendar.getInstance();
|
||||||
|
endTime.set(2016, Calendar.AUGUST, 29,23,59);
|
||||||
|
|
||||||
|
|
||||||
|
List<Filter> filters = new ArrayList<Filter>();
|
||||||
|
|
||||||
|
TemporalConstraint temporalConstraint =
|
||||||
|
new TemporalConstraint(startTime.getTimeInMillis(),
|
||||||
|
endTime.getTimeInMillis(), AggregationMode.DAILY);
|
||||||
|
|
||||||
|
Class<AggregatedServiceUsageRecord> clz =
|
||||||
|
AggregatedServiceUsageRecord.class;
|
||||||
|
|
||||||
|
SortedMap<NumberedFilter, SortedMap<Calendar, Info>> set =
|
||||||
|
accountingPersistenceQueryCouchBase.getTopValues(
|
||||||
|
clz, temporalConstraint, filters,
|
||||||
|
AggregatedServiceUsageRecord.CALLED_METHOD, null);
|
||||||
|
|
||||||
|
logger.debug("Result final{}", set);
|
||||||
|
|
||||||
|
}
|
||||||
|
public static SortedMap<Calendar, Info> padMap(
|
||||||
|
SortedMap<Calendar, Info> unpaddedData,
|
||||||
|
TemporalConstraint temporalConstraint) throws Exception {
|
||||||
|
JSONObject jsonObject = getPaddingJSONObject(unpaddedData);
|
||||||
|
SortedSet<Calendar> sequence = temporalConstraint.getCalendarSequence();
|
||||||
|
for (Calendar progressTime : sequence) {
|
||||||
|
Info info = unpaddedData.get(progressTime);
|
||||||
|
if (info == null) {
|
||||||
|
info = new Info(progressTime, jsonObject);
|
||||||
|
unpaddedData.put(progressTime, info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return unpaddedData;
|
||||||
|
}
|
||||||
|
public static JSONObject getPaddingJSONObject(
|
||||||
|
Map<Calendar, Info> unpaddedResults) throws JSONException {
|
||||||
|
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
//verify data consistency
|
||||||
|
|
||||||
|
if (unpaddedResults.size()!=0){
|
||||||
|
Info auxInfo = new ArrayList<Info>(unpaddedResults.values()).get(0);
|
||||||
|
JSONObject auxJsonObject = auxInfo.getValue();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Iterator<String> keys = auxJsonObject.keys();
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String key = keys.next();
|
||||||
|
jsonObject.put(key, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFull() throws Exception {
|
||||||
|
logger.debug("test full ");
|
||||||
|
try{
|
||||||
|
Calendar startTime = Calendar.getInstance();
|
||||||
|
//startTime.set(2016, Calendar.AUGUST, 20, 00, 00);
|
||||||
|
startTime.set(2016, Calendar.AUGUST, 29,00,00);
|
||||||
|
Calendar endTime = Calendar.getInstance();
|
||||||
|
//endTime.set(2016, Calendar.AUGUST, 29, 23, 59);
|
||||||
|
endTime.set(2016, Calendar.AUGUST, 31,23,59);
|
||||||
|
|
||||||
|
|
||||||
|
List<Filter> filters = new ArrayList<Filter>();
|
||||||
|
|
||||||
|
TemporalConstraint temporalConstraint =
|
||||||
|
new TemporalConstraint(startTime.getTimeInMillis(),
|
||||||
|
endTime.getTimeInMillis(), AggregationMode.DAILY);
|
||||||
|
|
||||||
|
Class<AggregatedServiceUsageRecord> clz =
|
||||||
|
AggregatedServiceUsageRecord.class;
|
||||||
|
|
||||||
|
SortedMap<NumberedFilter, SortedMap<Calendar, Info>> set =
|
||||||
|
accountingPersistenceQueryCouchBase.getTopValues(
|
||||||
|
clz, temporalConstraint, filters,
|
||||||
|
AggregatedServiceUsageRecord.CALLED_METHOD, null);
|
||||||
|
/**pad*/
|
||||||
|
int limit=0;
|
||||||
|
boolean pad=true;
|
||||||
|
int count = set.size() > limit ? limit : set.size();
|
||||||
|
NumberedFilter firstRemovalKey = null;
|
||||||
|
logger.debug("set completo"+set.toString());
|
||||||
|
for(NumberedFilter nf : set.keySet()){
|
||||||
|
if(--count>=0 || limit<=0){
|
||||||
|
if(pad){
|
||||||
|
padMap(set.get(nf), temporalConstraint);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(firstRemovalKey==null){
|
||||||
|
firstRemovalKey = nf;
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(firstRemovalKey!=null){
|
||||||
|
logger.debug("First removal key set:"+set.subMap(set.firstKey(), firstRemovalKey));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
logger.debug("set: "+set);
|
||||||
|
|
||||||
|
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue