/*
* RHQ Management Platform
* Copyright (C) 2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.search.common;
import org.rhq.enterprise.server.search.translation.antlr.RHQLComparisonOperator;
import org.rhq.enterprise.server.util.QueryUtility;
/**
* @author Joseph Marques
*/
public class SearchQueryGenerationUtility {
public enum ValueFilter {
STARTS_WITH, //
ENDS_WITH, //
INDEX_OF, //
EXACT_MATCH;
}
public static String getJPQLForString(String fragment, String value) {
if (value == null) {
value = "";
}
return getJPQLForString(fragment, RHQLComparisonOperator.EQUALS, value);
}
public static String getJPQLForString(String fragment, RHQLComparisonOperator operator, String value) {
if (value == null) {
value = "";
}
int size = value.length();
if (value.startsWith("^")) {
if (value.endsWith("$")) {
return getJPQLForString(fragment, operator, value.substring(1, size - 1), ValueFilter.EXACT_MATCH);
} else {
return getJPQLForString(fragment, operator, value.substring(1), ValueFilter.STARTS_WITH);
}
} else {
if (value.endsWith("$")) {
return getJPQLForString(fragment, operator, value.substring(0, size - 1), ValueFilter.ENDS_WITH);
} else {
return getJPQLForString(fragment, operator, value, ValueFilter.INDEX_OF);
}
}
}
private static String getJPQLForString(String fragment, RHQLComparisonOperator operator, String value,
ValueFilter filter) {
if (operator == RHQLComparisonOperator.EQUALS) {
return lower(fragment) + " LIKE " + process(filter, value.toLowerCase());
} else if (operator == RHQLComparisonOperator.EQUALS_STRICT) {
return fragment + " LIKE " + process(filter, value);
} else if (operator == RHQLComparisonOperator.NOT_EQUALS) {
return lower(fragment) + " NOT LIKE " + process(filter, value.toLowerCase());
} else if (operator == RHQLComparisonOperator.NOT_EQUALS_STRICT) {
return fragment + " NOT LIKE " + process(filter, value);
} else if (operator == RHQLComparisonOperator.NULL) {
return fragment + " IS NULL";
} else if (operator == RHQLComparisonOperator.NOT_NULL) {
return fragment + " IS NOT NULL";
} else {
throw new IllegalArgumentException("Unsupported operator " + operator);
}
}
private static String process(ValueFilter filter, String value) {
if (filter == ValueFilter.STARTS_WITH) {
return "'" + escape(value) + "%'";
} else if (filter == ValueFilter.ENDS_WITH) {
return "'%" + escape(value) + "'";
} else if (filter == ValueFilter.INDEX_OF) {
return "'%" + escape(value) + "%'";
} else if (filter == ValueFilter.EXACT_MATCH) {
return "'" + escape(value) + "'";
} else {
throw new IllegalArgumentException("Unsupported ValueFilter: " + filter);
}
}
public static String lower(String data) {
return "LOWER(" + data + ")";
}
public static String escape(String data) {
return QueryUtility.escapeSearchParameter(data);
}
}