/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.filter;
import com.espertech.esper.epl.expression.core.ExprNode;
import java.util.*;
/**
* A two-sided map for filter parameters mapping filter expression nodes to filter parameters and
* back. For use in optimizing filter expressions.
*/
public class FilterParamExprMap {
private Map<ExprNode, FilterSpecParam> exprNodes;
private Map<FilterSpecParam, ExprNode> specParams;
/**
* Ctor.
*/
public FilterParamExprMap() {
exprNodes = new LinkedHashMap<ExprNode, FilterSpecParam>();
specParams = new LinkedHashMap<FilterSpecParam, ExprNode>();
}
/**
* Add a node and filter param.
*
* @param exprNode is the node to add
* @param param is null if the expression node has not optimized form
*/
public void put(ExprNode exprNode, FilterSpecParam param) {
exprNodes.put(exprNode, param);
if (param != null) {
specParams.put(param, exprNode);
}
}
/**
* Returns all expression nodes for which no filter parameter exists.
*
* @return list of expression nodes
*/
public List<ExprNode> getUnassignedExpressions() {
List<ExprNode> unassigned = new ArrayList<ExprNode>();
for (Map.Entry<ExprNode, FilterSpecParam> entry : exprNodes.entrySet()) {
if (entry.getValue() == null) {
unassigned.add(entry.getKey());
}
}
return unassigned;
}
public int countUnassignedExpressions() {
int count = 0;
for (Map.Entry<ExprNode, FilterSpecParam> entry : exprNodes.entrySet()) {
if (entry.getValue() == null) {
count++;
}
}
return count;
}
/**
* Returns all filter parameters.
*
* @return filter parameters
*/
public Collection<FilterSpecParam> getFilterParams() {
return specParams.keySet();
}
public void removeNode(ExprNode node) {
FilterSpecParam param = exprNodes.remove(node);
if (param != null) {
specParams.remove(param);
}
}
/**
* Removes a filter parameter and it's associated expression node
*
* @param param is the parameter to remove
* @return expression node removed
*/
public ExprNode removeEntry(FilterSpecParam param) {
ExprNode exprNode = specParams.get(param);
if (exprNode == null) {
throw new IllegalStateException("Not found in collection param: " + param);
}
specParams.remove(param);
exprNodes.remove(exprNode);
return exprNode;
}
/**
* Remove a filter parameter leaving the expression node in place.
*
* @param param filter parameter to remove
*/
public void removeValue(FilterSpecParam param) {
ExprNode exprNode = specParams.get(param);
if (exprNode == null) {
throw new IllegalStateException("Not found in collection param: " + param);
}
specParams.remove(param);
exprNodes.put(exprNode, null);
}
public void clear() {
exprNodes.clear();
specParams.clear();
}
public void add(FilterParamExprMap other) {
exprNodes.putAll(other.exprNodes);
specParams.putAll(other.specParams);
}
}