diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/pom.xml b/pom.xml index a50342c..d3516c1 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.gcube.accounting accounting-analytics-persistence-couchbase - 1.3.0-SNAPSHOT + 1.4.0-SNAPSHOT Accounting Analytics Persistence CouchBase Accounting Analytics Persistence CouchBase Implementation diff --git a/src/main/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBase.java b/src/main/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBase.java index 8f0a64d..008d158 100644 --- a/src/main/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBase.java +++ b/src/main/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBase.java @@ -46,6 +46,7 @@ import org.gcube.common.scope.api.ScopeProvider; import org.gcube.documentstore.records.AggregatedRecord; import org.gcube.documentstore.records.Record; import org.gcube.documentstore.records.RecordUtility; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; @@ -55,6 +56,7 @@ import com.couchbase.client.java.Bucket; import com.couchbase.client.java.Cluster; import com.couchbase.client.java.CouchbaseCluster; import com.couchbase.client.java.bucket.BucketManager; +import com.couchbase.client.java.document.JsonDocument; import com.couchbase.client.java.document.json.JsonArray; import com.couchbase.client.java.document.json.JsonObject; import com.couchbase.client.java.env.CouchbaseEnvironment; @@ -149,27 +151,23 @@ AccountingPersistenceBackendQuery { String url = configuration.getProperty(URL_PROPERTY_KEY); String password = configuration.getProperty(PASSWORD_PROPERTY_KEY); - cluster = CouchbaseCluster.create(ENV, url); bucketNameStorage = configuration.getProperty(BUCKET_STORAGE_NAME_PROPERTY_KEY); - bucketNameStorageStatus = configuration.getProperty(BUCKET_STORAGESTATUS_NAME_PROPERTY_KEY); - bucketNameService = configuration.getProperty(BUCKET_SERVICE_NAME_PROPERTY_KEY); bucketNameJob = configuration.getProperty(BUCKET_JOB_NAME_PROPERTY_KEY); bucketNamePortlet = configuration.getProperty(BUCKET_PORTLET_NAME_PROPERTY_KEY); bucketNameTask = configuration.getProperty(BUCKET_TASK_NAME_PROPERTY_KEY); connectionMap = new HashMap(); - + + //bucketStorage = cluster.openBucket(bucketNameStorage, password); bucketStorage = cluster.openBucket(bucketNameStorage, password); connectionMap.put(BUCKET_STORAGE_NAME_PROPERTY_KEY, bucketStorage); - + bucketStorageStatus = cluster.openBucket( bucketNameStorageStatus,password); connectionMap.put(BUCKET_STORAGESTATUS_NAME_PROPERTY_KEY, bucketStorageStatus); - logger.debug("connectionMap"+connectionMap.toString()); - bucketService = cluster.openBucket(bucketNameService, password); connectionMap.put(BUCKET_SERVICE_NAME_PROPERTY_KEY, bucketService); @@ -417,7 +415,6 @@ AccountingPersistenceBackendQuery { if (!collection.isEmpty()){ reduceFunction = top; - //reduceFunction = null; for (String property : collection) { if (!property.equals(top)){ @@ -466,6 +463,7 @@ AccountingPersistenceBackendQuery { *Return: * List of service class used by alessandro in the required period */ + /* public SortedMap getListUsage(Class> clz, TemporalConstraint temporalConstraint, List filters,String context,List parameters)throws Exception{ //TODO @@ -520,13 +518,7 @@ AccountingPersistenceBackendQuery { } } } - /* - int scopeDateGroupLevel = aggregationMode.ordinal() + 1 + 1; - int groupLevel = scopeDateGroupLevel; - if (filters != null) { - groupLevel += keys.size(); - } - */ + for (Object temporal: temporalStartKey.toList()){ if (!temporal.toString().isEmpty()) startKey.add(temporal); @@ -587,7 +579,7 @@ AccountingPersistenceBackendQuery { } - +*/ protected SortedMap mapReduceQuery( Class> clz, @@ -1499,7 +1491,7 @@ AccountingPersistenceBackendQuery { } /** - * SPERIMENTAL + * * Used for calculate a usage value for each element of list * (QUOTA) * @param listUsage @@ -1518,14 +1510,6 @@ AccountingPersistenceBackendQuery { for (UsageValue totalFilters:listUsage){ logger.debug("-----------------/ init for totalFilters"); - - - /* - UsageValue totalfilter= - new UsageServiceValue(context,"lucio.lelii",AggregatedServiceUsageRecord.class,temporalConstraint,filters); - */ - - String currentScope = totalFilters.getContext(); Collection keys= new TreeSet<>(); @@ -1547,13 +1531,15 @@ AccountingPersistenceBackendQuery { temporalConstraint = new TemporalConstraint(startTime.getTimeInMillis(), endTime.getTimeInMillis(), AggregationMode.DAILY); - //if type=storage then bucket =accounting_storage_status and designDocId = quotaTotal - //logger.trace("totalFilters.getClass().getSimpleName():{}",totalFilters.getClass().getSimpleName()); - //logger.trace("totalFilters.getClz().getSimpleName():{}",totalFilters.getClz().getSimpleName()); - if (totalFilters.getClz().getSimpleName().equals(AggregatedStorageStatusRecord.class.getSimpleName())){ + if (totalFilters instanceof UsageStorageValue){ + +// if (totalFilters.getClz().getSimpleName().equals(AggregatedStorageStatusRecord.class.getSimpleName())){ //TODO sarebbe possibile invece con il nome verificare che getClz e' un istanza di AggregatedStorageStatusRecord? - designDocId = "QuotaTotal"; + //designDocId = "QuotaTotal"; + //TEST + designDocId="QuotaTotalSeparated"; + } } @@ -1628,6 +1614,7 @@ AccountingPersistenceBackendQuery { ViewQuery query = ViewQuery.from(designDocId, viewNameTmp); //if storage query.inclusiveEnd(); + /* if (designDocId == "QuotaTotal"){ query.startKey(endKeyTmp); @@ -1638,13 +1625,13 @@ AccountingPersistenceBackendQuery { } else{ - + */ query.groupLevel(groupLevelTmp); query.startKey(startKeyTmp); query.endKey(endKeyTmp); query.descending(false); query.onError(OnError.STOP); - } + //} logger.trace("query row:{}",query.toString()); ViewResult viewResult; @@ -1666,55 +1653,34 @@ AccountingPersistenceBackendQuery { Iterator iterateJosn = objJson.keys(); while( iterateJosn.hasNext() ) { String key = (String)iterateJosn.next(); - - Float valuetmp=Float.parseFloat(objJson.get(key).toString()); - - //logger.debug("totalFilters.getClass().getSimpleName():{} UsageStorageValue.class.getSimpleName():{}", totalFilters.getClass().getSimpleName(),UsageStorageValue.class.getSimpleName()); - - if (key.equals("operationCount") || key.equals("dataVolume")){ - - if (map.containsKey(key)) { - map.put(key, valuetmp + map.get(key)); - - // TODO verify a better method - if (totalFilters instanceof UsageStorageValue){ - logger.debug("storageUsageRecord -designDocId:{}",designDocId); - if (key.equals("dataVolume")){ - keyOrderingProperty=key; - totalQuota+=totalFilters.getD()+valuetmp.doubleValue(); - } - } - else{ + + if (totalFilters instanceof UsageStorageValue){ + JSONArray valueStorage=(JSONArray) objJson.get(key); + logger.debug("--storageUsageRecord -key:{} value:{}",key,valueStorage.get(0)); + totalQuota+=Float.parseFloat(valueStorage.get(0).toString()); + keyOrderingProperty="dataVolume"; + } + else{ + if (key.equals("operationCount") || key.equals("dataVolume")){ + Float valuetmp=Float.parseFloat(objJson.get(key).toString()); + + if (map.containsKey(key)) { + map.put(key, valuetmp + map.get(key)); logger.debug("?UsageRecord -designDocId:{}",designDocId); keyOrderingProperty=key; totalQuota+=totalFilters.getD()+valuetmp.doubleValue(); } - - } - else{ - map.put(key, valuetmp); - - // TODO verify a better method - if (totalFilters instanceof UsageStorageValue){ - logger.debug("storageUsageRecord -designDocId:{}",designDocId); - if (key.equals("dataVolume")){ - keyOrderingProperty=key; - - totalQuota+=valuetmp.doubleValue(); - } - } else{ + map.put(key, valuetmp); logger.debug("?UsageRecord -designDocId:{}",designDocId); keyOrderingProperty=key; - totalQuota+=valuetmp.doubleValue(); } } } } } - //i++; - //} while (i getSpaceProvidersIds() { + String currentScope = ScopeProvider.instance.get(); + JsonArray startKey = JsonArray.create(); + startKey.add(currentScope); + + int scopeDateGroupLevel = 2; + int groupLevel = scopeDateGroupLevel; + String designDocId = "StorageStatusRecordValue"; + String viewName = "providerId"; + logger.trace("designDocId:{} view:{} startKey:{} groupLevel:{}",designDocId,viewName,startKey,groupLevel); + ViewQuery query = ViewQuery.from(designDocId, viewName); + + query.inclusiveEnd(); + query.groupLevel(groupLevel); + query.startKey(startKey); + query.descending(false); + SortedSet ret = new TreeSet(); + ViewResult viewResult; + try { + //execute query in a specify bucket + viewResult = connectionMap.get("AggregatedStorageStatusRecord").query(query); + + } catch (Exception e) { + logger.error("error executing the query",e); + throw e; + } + for (ViewRow row : viewResult) { + String value =(String) row.value(); + ret.add(value); + + } + return ret; + } + + + /** + * used for accounting portlet section storage status + * @param clz + * @param temporalConstraint + * @param filters + * @param context + * @return + * @throws JSONException + */ + + public SortedMap> getSpaceTimeSeries( + Class> clz, + TemporalConstraint temporalConstraint, List filters, + List providersId) throws Exception { + + String currentScope=null; + currentScope = ScopeProvider.instance.get(); + + JsonArray startKey = JsonArray.create(); + + JsonArray endKey = JsonArray.create(); + startKey.add(currentScope); + endKey.add(currentScope); + + AggregationMode aggregationMode = temporalConstraint + .getAggregationMode(); + + JsonArray temporalStartKey = getRangeKey( + temporalConstraint.getStartTime(), + aggregationMode, false, false); + + JsonArray temporalEndKey = getRangeKey( + temporalConstraint.getEndTime(), + aggregationMode, false, false); + Collection keys = new TreeSet<>(); + + + String designDocId = "StorageStatusUsage"; + String viewName; + int groupLevel=5; + if (temporalConstraint.getAggregationMode().equals(AggregationMode.MONTHLY)){ + groupLevel= 4; + } + viewName= temporalConstraint.getAggregationMode().name().toLowerCase(); + + if (filters != null && filters.size() != 0) { + // Sorting filter for call a mapreduce + Collections.sort(filters, new Comparator() { + @Override + public int compare(Filter filter1, Filter filter2) + { + int result =filter1.getKey().compareTo(filter2.getKey()); + return result; + } + }); + for (Filter filter : filters) { + String filterKey = filter.getKey(); + String filterValue = filter.getValue(); + + if (filterKey != null && filterKey.compareTo("") != 0) { + if (filterValue != null && filterValue.compareTo("") != 0) { + if (keys.contains(filterKey)) { + throw new DuplicatedKeyFilterException( + "Only one value per Filter key is allowed"); + } + startKey.add(filterValue); + endKey.add(filterValue); + keys.add(filterKey); + viewName=viewName+"_"+filterKey; + if (filterKey!="consumerId"){ + groupLevel= groupLevel+1; + } + } else { + throw new KeyException( + String.format("Invalid %s : %s",Filter.class.getSimpleName(), filter.toString())); + } + + } else { + throw new ValueException(String.format("Invalid %s : %s",Filter.class.getSimpleName(), filter.toString())); + } + } + } + for (Object temporal: temporalStartKey.toList()){ + if (!temporal.toString().isEmpty()) + startKey.add(temporal); + } + int count =1; + for (Object temporal: temporalEndKey.toList()){ + if (!temporal.toString().isEmpty()){ + //couchbase exclude last value + if (count==temporalEndKey.size()) + temporal=(int)temporal+1; + endKey.add(temporal); + } + count++; + } + + ViewQuery query = ViewQuery.from(designDocId, viewName); + query.inclusiveEnd(); + query.groupLevel(groupLevel); + query.startKey(startKey); + query.endKey(endKey); + query.descending(false); + + logger.trace("Bucket :{}, Design Doc ID : {}, View Name : {}, " + + "Group Level : {}, Start Key : {}, End Key : {}," + + "temporalStartKey :{}, temporalEndKey :{}", + clz.getSimpleName(),designDocId, viewName, groupLevel, startKey, endKey,temporalStartKey.toString(), temporalEndKey.toString()); + + + ViewResult viewResult; + try { + //execute query in a specify bucket + viewResult = connectionMap.get(clz.getSimpleName()).query(query); + + } catch (Exception e) { + logger.error(e.getLocalizedMessage()); + throw e; + } + + SortedMap> ret = new TreeMap<>(); + + for (ViewRow row : viewResult) { + + JsonArray array = (JsonArray) row.key(); + Calendar calendar = getCalendarFromArray(array); + + JsonObject value = (JsonObject) row.value(); + JSONObject obj = new JSONObject(value.toString()); + + //logger.trace("row: {}, value: {}, obj: {}",row.toString(),value.toString(),obj.toString()); + for(Iterator iterator = obj.keys(); iterator.hasNext();) { + String key = (String) iterator.next(); + String[] tmp=key.split("-"); + String providerId=tmp[0]; + + if (providersId.contains(providerId)){ + Long valueProvider=Long.parseLong(obj.get(key).toString().split(",")[0].replace("[","")); + //convert into kb + valueProvider=valueProvider/1024; + + Filter filter= new Filter("providerId",providerId ); + if (!ret.containsKey(filter) ){ + SortedMap infos = new TreeMap<>(); + infos.put(calendar, valueProvider); + ret.put(filter, infos); + }else{ + SortedMap singleValue=ret.get(filter); + if (!singleValue.containsKey(calendar)){ + //if not exist put + singleValue.put(calendar, valueProvider); + }else{ + //if exist, update + singleValue.put(calendar, singleValue.get(calendar)+valueProvider); + } + + } + } + + } + } + //logger.trace("return map:{}",map.toString()); + logger.trace("return ret:{}",ret.toString()); + + return ret; + } } diff --git a/src/test/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBaseTest.java b/src/test/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBaseTest.java index d1dd07e..aa127a9 100644 --- a/src/test/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBaseTest.java +++ b/src/test/java/org/gcube/accounting/analytics/persistence/couchbase/AccountingPersistenceQueryCouchBaseTest.java @@ -23,6 +23,7 @@ import org.gcube.accounting.analytics.UsageServiceValue; import org.gcube.accounting.analytics.UsageStorageValue; import org.gcube.accounting.analytics.UsageValue; import org.gcube.accounting.analytics.persistence.AccountingPersistenceBackendQueryConfiguration; +import org.gcube.accounting.analytics.persistence.AccountingPersistenceBackendQueryFactory; import org.gcube.accounting.analytics.persistence.AccountingPersistenceQuery; import org.gcube.accounting.datamodel.AggregatedUsageRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedJobUsageRecord; @@ -88,6 +89,7 @@ public class AccountingPersistenceQueryCouchBaseTest { //ScopeProvider.instance.set("/gcube/devNext/NextNext"); //ScopeProvider.instance.set("/gcube/devNext"); ScopeProvider.instance.set("/gcube"); + //ScopeProvider.instance.set("/d4science.research-infrastructures.eu"); AccountingPersistenceBackendQueryConfiguration configuration = new AccountingPersistenceBackendQueryConfiguration(AccountingPersistenceQueryCouchBase.class); @@ -161,14 +163,14 @@ public class AccountingPersistenceQueryCouchBaseTest { public void testTimeSeriesNoContext() throws Exception{ Calendar startTime = Calendar.getInstance(); - startTime.set(2015, Calendar.AUGUST, 20); + startTime.set(2017, Calendar.APRIL, 20); Calendar endTime = Calendar.getInstance(); - endTime.set(2016, Calendar.SEPTEMBER, 29,23,59); + endTime.set(2017, Calendar.APRIL, 29,23,59); List filters = new ArrayList(); Filter filter = new Filter(AggregatedServiceUsageRecord.CALLED_METHOD, "WebProcessingService"); - filters.add(filter); + //filters.add(filter); TemporalConstraint temporalConstraint = new TemporalConstraint(startTime.getTimeInMillis(), endTime.getTimeInMillis(), AggregationMode.DAILY); @@ -242,7 +244,7 @@ public class AccountingPersistenceQueryCouchBaseTest { @Test public void getUsageValueQuotaTotal() throws Exception{ Calendar startTime = Calendar.getInstance(); - startTime.set(2015, Calendar.MAY, 1); + startTime.set(2017, Calendar.MAY, 1); Calendar endTime = Calendar.getInstance(); @@ -286,7 +288,7 @@ public class AccountingPersistenceQueryCouchBaseTest { Calendar startTimeStorage = Calendar.getInstance(); startTimeStorage.set(2015, Calendar.MAY, 1); Calendar endTimeStorage = Calendar.getInstance(); - endTimeStorage.set(2017, Calendar.FEBRUARY, 21); + endTimeStorage.set(2017, Calendar.APRIL, 13); /*TemporalConstraint temporalConstraintStorage =new TemporalConstraint(startTimeStorage.getTimeInMillis(), endTimeStorage.getTimeInMillis(), AggregationMode.DAILY);*/ TemporalConstraint temporalConstraintStorage =null; @@ -297,11 +299,11 @@ public class AccountingPersistenceQueryCouchBaseTest { //richiedo la lista di dati usati totali List listTotalFilter=new ArrayList(); - /*listTotalFilter.add(totalfilter); + listTotalFilter.add(totalfilter); listTotalFilter.add(totalfilterStorageStatus); listTotalFilter.add(totalfilterStorageStatus_2); listTotalFilter.add(totalfilterStorageStatus_3); - listTotalFilter.add(totalfilterStorageStatus_4);*/ + listTotalFilter.add(totalfilterStorageStatus_4); listTotalFilter.add(totalfilterStorageStatusPeriod); @@ -335,7 +337,6 @@ public class AccountingPersistenceQueryCouchBaseTest { Calendar endTime = Calendar.getInstance(); endTime.set(2016, Calendar.SEPTEMBER, 28,23,59); - List filters = new ArrayList(); //filters.add(new Filter(AggregatedServiceUsageRecord.SERVICE_NAME, "IS-Registry")); //filters.add(new Filter(AggregatedServiceUsageRecord.SERVICE_CLASS, "Common")); @@ -498,11 +499,11 @@ public class AccountingPersistenceQueryCouchBaseTest { @Test public void testContextService() throws Exception { Calendar startTime = Calendar.getInstance(); - startTime.set(2016, Calendar.SEPTEMBER, 1); + startTime.set(2017, Calendar.APRIL, 20); Calendar endTime = Calendar.getInstance(); - endTime.set(2016, Calendar.OCTOBER, 20,23,59); + endTime.set(2017, Calendar.APRIL, 28,23,59); List filters = new ArrayList(); - filters.add(new Filter(AggregatedServiceUsageRecord.CALLED_METHOD, "WebProcessingService")); + //filters.add(new Filter(AggregatedServiceUsageRecord.CALLED_METHOD, "WebProcessingService")); //filters.add(new Filter(AggregatedServiceUsageRecord.CONSUMER_ID, "alessandro.pieve")); TemporalConstraint temporalConstraint = new TemporalConstraint(startTime.getTimeInMillis(), @@ -517,6 +518,7 @@ public class AccountingPersistenceQueryCouchBaseTest { // , /gcube/devsec/TestCreation12, /gcube/devsec/TestCreation13, /gcube/devsec/TestCreation14, /gcube/devsec/TestCreation15, /gcube/devsec/TestCreation16, /gcube/devsec/TestCreation17, /gcube/devsec/TestCreation7, /gcube/devsec/TestCreation8, /gcube/devsec/TestCreation9, /gcube/devsec/TestLucio2]] context.add("/gcube"); context.add("/gcube/devNext"); + /* context.add("/gcube/devNext/Luciotest"); context.add("/gcube/devNext/NextNext"); context.add("/gcube/devsec"); @@ -528,6 +530,7 @@ public class AccountingPersistenceQueryCouchBaseTest { context.add("/gcube/devsec/preVRE"); context.add("/gcube/preprod/preVRE"); context.add("/gcube/preprod"); + */ SortedMap> setContext = accountingPersistenceQueryCouchBase.getContextTimeSeries( clz, temporalConstraint, filters, @@ -554,8 +557,139 @@ public class AccountingPersistenceQueryCouchBaseTest { parameters.add("serviceName"); Class clz = AggregatedServiceUsageRecord.class; - SortedMap result= accountingPersistenceQueryCouchBase.getListUsage(clz,temporalConstraint, - filters,context,parameters); + // SortedMap result= accountingPersistenceQueryCouchBase.getListUsage(clz,temporalConstraint, filters,context,parameters); } + + + + @Test + public void getRecord() throws Exception{ + String recordId="91e1c339-d811-45d7-a13f-7385af59e3c8"; + String type="service"; + + String document=accountingPersistenceQueryCouchBase.getRecord(recordId, type); + logger.debug("document:{}",document); + + + } + + + @Test + public void getQuerableKeyStorageStatus() throws Exception{ + SortedSet keys; + keys = AccountingPersistenceQuery.getQuerableKeys(AggregatedStorageStatusRecord.class); + for (String key : keys) { + if (key != null && !key.isEmpty()) { + logger.debug("key:" +key); + } + } + logger.debug("List FilterKeys:" + keys.toString()); + } + + @Test + public void testGetSpaceProvidersIds(){ + SortedSet listProvidersId = + accountingPersistenceQueryCouchBase.getSpaceProvidersIds(); + logger.debug("Result final{}", listProvidersId); + + } + + + @Test + public void testGetFilterValue() throws Exception{ + + //String key="consumerId"; + String key="dataServiceId"; + + SortedSet listFilterValue = + accountingPersistenceQueryCouchBase.getFilterValues(AggregatedStorageStatusRecord.class, null, null, key); + logger.debug("Result final{}", listFilterValue); + + } + + + @Test + public void testUsageStorage() throws Exception { + Calendar startTime = Calendar.getInstance(); + startTime.set(2017, Calendar.APRIL, 13); + Calendar endTime = Calendar.getInstance(); + endTime.set(2017, Calendar.APRIL, 26,23,59); + List filters = new ArrayList(); + //filters.add(new Filter(AggregatedStorageStatusRecord.DATA_SERVICEID, "identifier")); + filters.add(new Filter(AggregatedServiceUsageRecord.CONSUMER_ID, "alessandro.pieve")); + TemporalConstraint temporalConstraint = + new TemporalConstraint(startTime.getTimeInMillis(), + endTime.getTimeInMillis(), AggregationMode.DAILY); + + + List providerId=new ArrayList(); + Class clz = + AggregatedStorageStatusRecord.class; + + //providerId.add("Rstudio"); + providerId.add("MongoDb"); + + SortedMap> setContext = + accountingPersistenceQueryCouchBase.getSpaceTimeSeries( + clz, + temporalConstraint, filters, + providerId); + + + + + + + int count = setContext.size(); + Filter firstRemovalKey = null; + for(Filter nf : setContext.keySet()){ + if(--count>=0){ + //if(pad){ + padMapStorage(setContext.get(nf), temporalConstraint); + + //} + }else{ + if(firstRemovalKey==null){ + firstRemovalKey = nf; + }else{ + break; + } + } + } + + /* + if(firstRemovalKey!=null){ + return setContext.subMap(setContext.firstKey(), firstRemovalKey); + } + */ + + + + logger.debug("Result final{}", setContext); + + } + + public SortedMap padMapStorage( + SortedMap unpaddedData, + TemporalConstraint temporalConstraint) throws Exception { + + //JSONObject jsonObject = getPaddingJSONObject(unpaddedData); + SortedSet sequence = temporalConstraint.getCalendarSequence(); + Long longValuePre = null; + for (Calendar progressTime : sequence) { + Long longValue = unpaddedData.get(progressTime); + + if (longValue == null) { + unpaddedData.put(progressTime, longValuePre); + }else{ + longValuePre=longValue; + } + + } + return unpaddedData; + } + + + }