package com.thinkbiganalytics.metadata.api.op;
/*-
* #%L
* thinkbig-metadata-api
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.joda.time.DateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*/
public class FeedDependencyDeltaResults {
Map<String, List<FeedJobExecutionData>> feedJobExecutionContexts = new HashMap<>();
/**
* Map storing the dependent feedName and the latest completed Execution Context
*/
Map<String, FeedJobExecutionData> latestFeedJobExecutionContext = new HashMap<>();
/**
* internal map to store jobexecution data
*/
@JsonIgnore
Map<Long, FeedJobExecutionData> jobExecutionDataMap = new HashMap<>();
private String feedName;
private String feedId;
/**
* An array of the dependentFeed system Names
*/
private List<String> dependentFeedNames = new ArrayList<>();
public FeedDependencyDeltaResults() {
}
public FeedDependencyDeltaResults(String feedId, String feedName) {
this.feedId = feedId;
this.feedName = feedName;
}
public void addFeedExecutionContext(String depFeedSystemName, Long jobExecutionId, DateTime startTime, DateTime endTime, Map<String, Object> executionContext) {
if (!dependentFeedNames.contains(depFeedSystemName)) {
dependentFeedNames.add(depFeedSystemName);
}
FeedJobExecutionData feedJobExecutionData = jobExecutionDataMap.get(jobExecutionId);
if (feedJobExecutionData == null) {
feedJobExecutionData = new FeedJobExecutionData(jobExecutionId, startTime, endTime, executionContext);
feedJobExecutionContexts.computeIfAbsent(depFeedSystemName, feedName -> new ArrayList<>()).add(feedJobExecutionData);
FeedJobExecutionData latest = latestFeedJobExecutionContext.get(depFeedSystemName);
//update the latest pointer
if (latest == null || (latest != null && endTime.isAfter(latest.getEndTime()))) {
latestFeedJobExecutionContext.put(depFeedSystemName, feedJobExecutionData);
}
} else {
feedJobExecutionData.getExecutionContext().putAll(executionContext);
}
}
private void reduceExecutionContextToMatchingKeys(FeedJobExecutionData executionData, List<String> validKeys) {
if (executionData != null && executionData.getExecutionContext() != null) {
Map<String, Object> reducedMap = executionData.getExecutionContext().entrySet().stream().filter(e ->
validKeys.stream()
.anyMatch(validKey -> e.getKey().toLowerCase().startsWith(validKey.toLowerCase())))
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()));
executionData.setExecutionContext(reducedMap);
}
}
/**
* reduce the excecution Context data that is in the Map matching where any key starts with the passed in list of validkeys
*/
public void reduceExecutionContextToMatchingKeys(List<String> validKeys) {
feedJobExecutionContexts.values().forEach(feedJobExecutionDatas -> {
if (feedJobExecutionDatas != null) {
feedJobExecutionDatas.stream().forEach(executionData -> reduceExecutionContextToMatchingKeys(executionData, validKeys));
}
});
latestFeedJobExecutionContext.values().forEach(executionData -> {
if (executionData != null) {
reduceExecutionContextToMatchingKeys(executionData, validKeys);
}
});
}
public String getFeedName() {
return feedName;
}
public void setFeedName(String feedName) {
this.feedName = feedName;
}
public String getFeedId() {
return feedId;
}
public void setFeedId(String feedId) {
this.feedId = feedId;
}
public List<String> getDependentFeedNames() {
if (dependentFeedNames == null) {
dependentFeedNames = new ArrayList<>();
}
return dependentFeedNames;
}
public void setDependentFeedNames(List<String> dependentFeedNames) {
this.dependentFeedNames = dependentFeedNames;
}
public Map<String, List<FeedJobExecutionData>> getFeedJobExecutionContexts() {
return feedJobExecutionContexts;
}
public Map<String, FeedJobExecutionData> getLatestFeedJobExecutionContext() {
return latestFeedJobExecutionContext;
}
public static class FeedJobExecutionData {
private Long jobExecutionId;
private DateTime startTime;
private DateTime endTime;
private Map<String, Object> executionContext;
public FeedJobExecutionData() {
}
public FeedJobExecutionData(Long jobExecutionId, DateTime startTime, DateTime endTime, Map<String, Object> executionContext) {
this.jobExecutionId = jobExecutionId;
this.startTime = startTime;
this.endTime = endTime;
this.executionContext = executionContext;
}
public Long getJobExecutionId() {
return jobExecutionId;
}
public void setJobExecutionId(Long jobExecutionId) {
this.jobExecutionId = jobExecutionId;
}
public DateTime getStartTime() {
return startTime;
}
public void setStartTime(DateTime startTime) {
this.startTime = startTime;
}
public DateTime getEndTime() {
return endTime;
}
public void setEndTime(DateTime endTime) {
this.endTime = endTime;
}
public Map<String, Object> getExecutionContext() {
return executionContext;
}
public void setExecutionContext(Map<String, Object> executionContext) {
this.executionContext = executionContext;
}
}
}