/* *************************************************************************************** * 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.util.MetaDefItem; import java.io.Serializable; import java.util.Comparator; /** * Sort comparator for filter parameters that sorts filter parameters according to filter operator type. */ public class FilterSpecParamComparator implements Comparator<FilterOperator>, MetaDefItem, Serializable { /** * Defines the sort order among filter operator types. The idea is to sort EQUAL-type operators first * then RANGE then other operators, ie. sorting from a more restrictive (usually, not necessarily, * really depends on the client application) to a less restrictive operand. */ private static final FilterOperator[] FILTER_OPERATOR_SORT_ORDER = { FilterOperator.EQUAL, FilterOperator.IS, FilterOperator.IN_LIST_OF_VALUES, FilterOperator.ADVANCED_INDEX, FilterOperator.RANGE_OPEN, FilterOperator.RANGE_HALF_OPEN, FilterOperator.RANGE_HALF_CLOSED, FilterOperator.RANGE_CLOSED, FilterOperator.LESS, FilterOperator.LESS_OR_EQUAL, FilterOperator.GREATER_OR_EQUAL, FilterOperator.GREATER, FilterOperator.NOT_RANGE_CLOSED, FilterOperator.NOT_RANGE_HALF_CLOSED, FilterOperator.NOT_RANGE_HALF_OPEN, FilterOperator.NOT_RANGE_OPEN, FilterOperator.NOT_IN_LIST_OF_VALUES, FilterOperator.NOT_EQUAL, FilterOperator.IS_NOT, FilterOperator.BOOLEAN_EXPRESSION }; private static int[] filterSortOrder; private static final long serialVersionUID = -3001682034930099256L; static { filterSortOrder = new int[FilterOperator.values().length]; for (int i = 0; i < filterSortOrder.length; i++) { filterSortOrder[i] = indexOf(FilterOperator.values()[i]); } } public int compare(FilterOperator param1, FilterOperator param2) { // Within the same filter operator type sort by attribute name if (param1 == param2) { return 0; } // Within different filter operator types sort by the table above int opIndex1 = filterSortOrder[param1.ordinal()]; int opIndex2 = filterSortOrder[param2.ordinal()]; if (opIndex1 < opIndex2) { return -1; } else { return 1; } } private static int indexOf(FilterOperator filterOperator) { for (int i = 0; i < FILTER_OPERATOR_SORT_ORDER.length; i++) { if (FILTER_OPERATOR_SORT_ORDER[i] == filterOperator) { return i; } } return FILTER_OPERATOR_SORT_ORDER.length; } }