/*******************************************************************************
* Copyright (c) 2017 Rogue Wave Software Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Rogue Wave Software Inc. - initial implementation
*******************************************************************************/
package org.eclipse.php.profile.ui.filters;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.php.internal.core.util.preferences.IXMLPreferencesStorable;
import org.eclipse.php.internal.ui.util.SearchPattern;
import org.eclipse.php.profile.core.data.ProfilerClassData;
import org.eclipse.php.profile.core.data.ProfilerFileData;
import org.eclipse.php.profile.core.data.ProfilerFunctionData;
import org.eclipse.php.profile.ui.views.TreeElement;
/**
* Execution statistics filter condition.
*/
public class ExecutionStatisticsFilterCondition extends ViewerFilter implements IXMLPreferencesStorable {
// Attributes
public static final String ATTR_FILE_NAME = "File Name"; //$NON-NLS-1$
public static final String ATTR_FILE_TOTAL_TIME = "File Total Time"; //$NON-NLS-1$
public static final String ATTR_CLASS_NAME = "Class Name"; //$NON-NLS-1$
public static final String ATTR_CLASS_TOTAL_TIME = "Class Total Time"; //$NON-NLS-1$
public static final String ATTR_FUNCTION_NAME = "Function Name"; //$NON-NLS-1$
public static final String ATTR_FUNCTION_TOTAL_TIME = "Function Total Time"; //$NON-NLS-1$
public static final String ATTR_FUNCTION_AVERAGE_OWN_TIME = "Function Average Own Time"; //$NON-NLS-1$
public static final String ATTR_FUNCTION_OWN_TIME = "Function Own Time"; //$NON-NLS-1$
public static final String ATTR_FUNCTION_OTHERS_TIME = "Function Others Time"; //$NON-NLS-1$
public static final String ATTR_FUNCTION_CALLS_COUNT = "Function Calls Count"; //$NON-NLS-1$
// Operators
public static final String OP_EQUALS = "equals"; //$NON-NLS-1$
public static final String OP_NOT_EQUALS = "not equals"; //$NON-NLS-1$
public static final String OP_MATCHES = "matches"; //$NON-NLS-1$
public static final String OP_DOESNT_MATCH = "doesn't match"; //$NON-NLS-1$
public static final String OP_LESS_THAN = "less than"; //$NON-NLS-1$
public static final String OP_MORE_THAN = "more than"; //$NON-NLS-1$
private String fAttribute;
private String fOperator;
private String fValue;
public ExecutionStatisticsFilterCondition() {
}
public ExecutionStatisticsFilterCondition(String attribute, String operator, String value) {
fAttribute = attribute;
fOperator = operator;
fValue = value;
}
public String getAttribute() {
return fAttribute;
}
public void setAttribute(String attribute) {
fAttribute = attribute;
}
public String getOperator() {
return fOperator;
}
public void setOperator(String operator) {
fOperator = operator;
}
public String getValue() {
return fValue;
}
public void setValue(String value) {
fValue = value;
}
public Map<String, Object> storeToMap() {
HashMap<String, Object> map = new HashMap<String, Object>(3);
map.put("attribute", fAttribute); //$NON-NLS-1$
map.put("operator", fOperator); //$NON-NLS-1$
map.put("value", fValue); //$NON-NLS-1$
return map;
}
public void restoreFromMap(Map<String, Object> map) {
fAttribute = (String) map.get("attribute"); //$NON-NLS-1$
fOperator = (String) map.get("operator"); //$NON-NLS-1$
fValue = (String) map.get("value"); //$NON-NLS-1$
}
private boolean evalOperator(String operator, String str1, String str2) {
if (OP_DOESNT_MATCH.equals(fOperator)) {
return !SearchPattern.match(str2, str1, false, false);
} else if (OP_MATCHES.equals(fOperator)) {
return SearchPattern.match(str2, str1, false, false);
} else if (OP_NOT_EQUALS.equals(fOperator)) {
return !str2.equals(str1);
} else if (OP_EQUALS.equals(fOperator)) {
return str2.equals(str1);
}
return false;
}
private boolean evalOperator(String operator, double d1, double d2) {
if (OP_LESS_THAN.equals(fOperator)) {
return d1 < d2;
} else if (OP_MORE_THAN.equals(fOperator)) {
return d1 > d2;
} else if (OP_NOT_EQUALS.equals(fOperator)) {
return d1 != d2;
} else if (OP_EQUALS.equals(fOperator)) {
return d1 == d2;
}
return false;
}
public boolean select(Viewer viewer, Object parentElement, Object element) {
TreeElement treeElement = (TreeElement) element;
Object data = treeElement.getData();
if (ATTR_FILE_NAME.equals(fAttribute)) {
if (data instanceof ProfilerFileData) {
ProfilerFileData fileData = (ProfilerFileData) data;
return evalOperator(fOperator, fileData.getName(), fValue);
}
} else if (ATTR_FILE_TOTAL_TIME.equals(fAttribute)) {
if (data instanceof ProfilerFileData) {
ProfilerFileData fileData = (ProfilerFileData) data;
return evalOperator(fOperator, fileData.getTotalOwnTime(), Double.parseDouble(fValue));
}
} else if (ATTR_CLASS_NAME.equals(fAttribute)) {
if (data instanceof ProfilerClassData) {
ProfilerClassData classData = (ProfilerClassData) data;
return evalOperator(fOperator, classData.getName(), fValue);
}
} else if (ATTR_CLASS_TOTAL_TIME.equals(fAttribute)) {
if (data instanceof ProfilerClassData) {
ProfilerClassData classData = (ProfilerClassData) data;
return evalOperator(fOperator, classData.getTotalOwnTime(), Double.parseDouble(fValue));
}
} else if (ATTR_FUNCTION_NAME.equals(fAttribute)) {
if (data instanceof ProfilerFunctionData) {
ProfilerFunctionData functionData = (ProfilerFunctionData) data;
return evalOperator(fOperator, functionData.getFunctionName(), fValue);
}
} else if (ATTR_FUNCTION_AVERAGE_OWN_TIME.equals(fAttribute)) {
if (data instanceof ProfilerFunctionData) {
ProfilerFunctionData functionData = (ProfilerFunctionData) data;
return evalOperator(fOperator, functionData.getOwnTime() / functionData.getCallsCount(),
Double.parseDouble(fValue));
}
} else if (ATTR_FUNCTION_OWN_TIME.equals(fAttribute)) {
if (data instanceof ProfilerFunctionData) {
ProfilerFunctionData functionData = (ProfilerFunctionData) data;
return evalOperator(fOperator, functionData.getOwnTime(), Double.parseDouble(fValue));
}
} else if (ATTR_FUNCTION_OTHERS_TIME.equals(fAttribute)) {
if (data instanceof ProfilerFunctionData) {
ProfilerFunctionData functionData = (ProfilerFunctionData) data;
return evalOperator(fOperator, functionData.getTotalTime() - functionData.getOwnTime(),
Double.parseDouble(fValue));
}
} else if (ATTR_FUNCTION_TOTAL_TIME.equals(fAttribute)) {
if (data instanceof ProfilerFunctionData) {
ProfilerFunctionData functionData = (ProfilerFunctionData) data;
return evalOperator(fOperator, functionData.getTotalTime(), Double.parseDouble(fValue));
}
} else if (ATTR_FUNCTION_CALLS_COUNT.equals(fAttribute)) {
if (data instanceof ProfilerFunctionData) {
ProfilerFunctionData functionData = (ProfilerFunctionData) data;
return evalOperator(fOperator, functionData.getCallsCount(), Double.parseDouble(fValue));
}
}
return true;
}
}