/**
* Copyright (C) 2014 Stratio (http://stratio.com)
*
* 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.
*/
package com.stratio.decision.dao;
import com.stratio.decision.commons.constants.EngineActionType;
import com.stratio.decision.commons.constants.StreamAction;
import com.stratio.decision.commons.messages.ColumnNameTypeValue;
import com.stratio.decision.streams.EngineActionDTO;
import com.stratio.decision.streams.QueryDTO;
import com.stratio.decision.streams.StreamStatusDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class StreamStatusDao {
private static final Logger log = LoggerFactory.getLogger(StreamStatusDao.class);
private final Map<String, StreamStatusDTO> streamStatuses;
public StreamStatusDao() {
streamStatuses = new ConcurrentHashMap<>();
}
public StreamStatusDTO createInferredStream(String streamName, List<ColumnNameTypeValue> columns) {
StreamStatusDTO streamStatus = null;
if (streamStatuses.get(streamName) == null) {
streamStatus = new StreamStatusDTO(streamName, Boolean.FALSE, columns);
streamStatuses.put(streamName, streamStatus);
}
return streamStatus;
}
public StreamStatusDTO create(String streamName, List<ColumnNameTypeValue> columns) {
StreamStatusDTO streamStatus = new StreamStatusDTO(streamName, Boolean.TRUE, columns);
if (streamStatuses.put(streamName, streamStatus) != null) {
log.warn("Stream status of stream {} has been updated", streamName);
}
return streamStatus;
}
public void remove(String streamName) {
streamStatuses.remove(streamName);
}
public StreamStatusDTO get(String streamName) {
return streamStatuses.get(streamName);
}
public Map<String, StreamStatusDTO> getAll() {
return streamStatuses;
}
public void putAll(Map<String, StreamStatusDTO> streamStatuses) {
this.streamStatuses.putAll(streamStatuses);
}
public StreamStatusDTO addQuery(String streamName, String queryId, String queryRaw) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
if (streamStatus != null) {
streamStatus.getAddedQueries().put(queryId, new QueryDTO(queryRaw));
}
return streamStatus;
}
public void removeQuery(String streamName, String queryId) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
if (streamStatus != null) {
streamStatus.getAddedQueries().remove(queryId);
}
}
public void enableAction(String streamName, StreamAction action) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
streamStatus.getActionsEnabled().add(action);
}
public void disableAction(String streamName, StreamAction action) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
streamStatus.getActionsEnabled().remove(action);
}
public Set<StreamAction> getEnabledActions(String streamName) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
Set<StreamAction> enabledActions = new HashSet<>();
if (streamStatus != null) {
enabledActions = streamStatus.getActionsEnabled();
}
return enabledActions;
}
public String getActionQuery(String streamName) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
String actionQueryId = streamStatus.getActionQueryId();
streamStatus.setActionQueryId(null);
return actionQueryId;
}
public void setActionQuery(String streamName, String queryId) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
streamStatus.setActionQueryId(queryId);
}
public void enableEngineAction(String streamName, EngineActionType engineActionType, Map<String, Object>
engineActionParams,
String engineActionQueryId ){
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
Map<EngineActionType, EngineActionDTO> engineActionsEnabled = streamStatus.getEngineActionsEnabled();
EngineActionDTO engineActionDTO = new EngineActionDTO(engineActionType, engineActionParams,
engineActionQueryId);
engineActionsEnabled.put(engineActionType, engineActionDTO);
}
public void disableEngineAction(String streamName, EngineActionType engineActionType) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
Map<EngineActionType, EngineActionDTO> engineActionsEnabled = streamStatus.getEngineActionsEnabled();
if (engineActionsEnabled.containsKey(engineActionType)) {
engineActionsEnabled.remove(engineActionType);
}
}
public Boolean isEngineActionEnabled(String streamName, EngineActionType engineActionType) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
Map<EngineActionType, EngineActionDTO> engineActionsEnabled = streamStatus.getEngineActionsEnabled();
if (engineActionsEnabled.containsKey(engineActionType)) {
return true;
}
return false;
}
public String getEngineActionQueryId(String streamName, EngineActionType engineActionType) {
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
Map<EngineActionType, EngineActionDTO> engineActionsEnabled = streamStatus.getEngineActionsEnabled();
if (engineActionsEnabled.containsKey(engineActionType)){
return engineActionsEnabled.get(engineActionType).getEngineActionQueryId();
}
return null;
}
public void updateEngineActionParameters(String streamName, EngineActionType engineActionType, Map<String, Object>
engineActionParams){
StreamStatusDTO streamStatus = streamStatuses.get(streamName);
Map<EngineActionType, EngineActionDTO> engineActionsEnabled = streamStatus.getEngineActionsEnabled();
if (engineActionsEnabled.containsKey(engineActionType)){
EngineActionDTO engineActionDTO = engineActionsEnabled.get(engineActionType);
engineActionDTO.setEngineActionParameters(engineActionParams);
engineActionsEnabled.put(engineActionType, engineActionDTO);
}
}
public void addColumn(String streamName, ColumnNameTypeValue column){
streamStatuses.get(streamName).getStreamDefinition().add(column);
streamStatuses.get(streamName).getStreamColumns().put(column.getColumn(), column);
}
public Boolean existsColumnDefinition(String streamName, String columnName){
if (streamStatuses.get(streamName).getStreamColumns().containsKey(columnName))
{
return true;
}
return false;
}
}