AbstractQueryBuilder.java
/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* 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, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.services.wcm.utils;
/**
* Created by The eXo Platform SAS
* Author : Hoa Pham
* hoa.pham@exoplatform.com
* Oct 7, 2008
*/
/*
* This abstract class help developer can easy create jcr query statement base on query criteria.
* This class will have 2 implementation for Sql-based query and XPath-based query
* */
public abstract class AbstractQueryBuilder {
/** The from clause. */
protected StringBuilder fromClause = new StringBuilder();
/** The properties clause. */
protected StringBuilder propertiesClause = new StringBuilder();
/** The path clause. */
protected StringBuilder pathClause= new StringBuilder();
/** The order by clause. */
protected StringBuilder orderByClause = new StringBuilder();
/** The select clause. */
protected StringBuilder selectClause = new StringBuilder();
/** The contains clause. */
protected StringBuilder containsClause = new StringBuilder();
/** The spell check clause. */
protected StringBuilder spellCheckClause = new StringBuilder();
/** The excerpt clause. */
protected StringBuilder excerptClause = new StringBuilder();
/**
* Checks a property is null.
*
* @param propertyName the property name
* @param condition the condition
*/
public abstract void isNull(String propertyName, LOGICAL condition);
/**
* Checks a property is not null.
*
* @param propertyName the property name
* @param condition the condition
*/
public abstract void isNotNull(String propertyName, LOGICAL condition);
/**
* compare less than
*
* @param propertyName the property name
* @param value the value
* @param condition the condition
*/
public abstract void lessThan(String propertyName, String value, LOGICAL condition);
/**
* Greater than.
*
* @param propName the prop name
* @param value the value
* @param condition the condition
*/
public abstract void greaterThan(String propName, String value, LOGICAL condition);
/**
* Less than or equal.
*
* @param propName the prop name
* @param value the value
* @param condition the condition
*/
public abstract void lessThanOrEqual(String propName, String value, LOGICAL condition);
/**
* Greater or equal.
*
* @param propName the prop name
* @param value the value
* @param condition the condition
*/
public abstract void greaterOrEqual(String propName,String value, LOGICAL condition);
/**
* Equal.
*
* @param propName the prop name
* @param value the value
* @param condition the condition
*/
public abstract void equal(String propName, String value , LOGICAL condition);
/**
* Not equal.
*
* @param propName the prop name
* @param value the value
* @param condition the condition
*/
public abstract void notEqual(String propName, String value, LOGICAL condition);
/**
* Like.
*
* @param propName the prop name
* @param value the value
* @param condition the condition
*/
public abstract void like(String propName, String value, LOGICAL condition);
/**
* Reference.
*
* @param propName the prop name
* @param value the value
* @param condition the condition
*/
public abstract void reference(String propName, String value, LOGICAL condition);
/**
* Before date.
*
* @param datePropertyName the date property name
* @param date the date
* @param condition the condition
*/
public abstract void beforeDate(String datePropertyName, String date, LOGICAL condition);
/**
* After date.
*
* @param datePropertyName the date property name
* @param date the date
* @param condition the condition
*/
public abstract void afterDate(String datePropertyName, String date, LOGICAL condition);
/**
* Between dates.
*
* @param datePropertyName the date property name
* @param startDate the start date
* @param endDate the end date
* @param condition the condition
*/
public abstract void betweenDates(String datePropertyName, String startDate, String endDate, LOGICAL condition);
/**
* Sets the query path.
*
* @param path the path
* @param pathtype the pathtype
*/
public abstract void setQueryPath(String path, PATH_TYPE pathtype);
/**
* Contains.
*
* @param scope the scope
* @param term the term
* @param condition the condition
*/
public abstract void contains(String scope, String term, LOGICAL condition);
/**
* Not contains.
*
* @param scope the scope
* @param term the term
* @param condition the condition
*/
public abstract void notContains(String scope, String term, LOGICAL condition);
/**
* Excerpt.
*
* @param enable the enable
*/
public abstract void excerpt(boolean enable);
/**
* Spell check.
*
* @param term the term
*/
public abstract void spellCheck(String term);
/**
* Order by.
*
* @param properyName the propery name
* @param orderby the orderby
*/
public abstract void orderBy(String properyName, ORDERBY orderby);
/**
* Select types.
*
* @param returnTypes the return types
*/
public abstract void selectTypes(String[] returnTypes);
/**
* From node types.
*
* @param nodetypes the nodetypes
*/
public abstract void fromNodeTypes(String[] nodetypes);
/**
* Open group condition for where clause
*
* @param logical the logical
*/
public abstract void openGroup(LOGICAL logical);
/**
* Close group.
*/
public abstract void closeGroup();
/**
* Creates the query statement.
*
* @return the string
*/
public abstract String createQueryStatement();
/**
* Merge.
*
* @param other the other
*/
public abstract void merge(AbstractQueryBuilder other);
/**
* The Class QueryTermHelper.
*/
public static class QueryTermHelper {
/** The term. */
private String term = "";
/**
* Instantiates a new query term helper.
*/
public QueryTermHelper() { }
/**
* Contains a word or phase
*
* @param s the s
*
* @return the query term helper
*/
public QueryTermHelper contains(String s) {
term = term.concat(s);
return this;
}
/**
* Not contains a word or phase
*
* @param s the s
*
* @return the query term helper
*/
public QueryTermHelper notContains(String s) {
if(s.indexOf(" ")>0)
term = term.concat("-\\" + s + "\\");
else
term = term.concat("-"+ s);
return this;
}
/**
* Builds the term.
*
* @return the string
*/
public String buildTerm() { return term; }
/**
* Allow fuzzy search.
*
* @return the query term helper
*/
public QueryTermHelper allowFuzzySearch(double fuzzySearchIndex) {
term = term.concat("~").concat(String.valueOf(fuzzySearchIndex));
return this;
}
/**
* Allow synonym search.
*
* @return the query term helper
*/
public QueryTermHelper allowSynonymSearch() {
term = "~".concat(term);
return this;
}
}
/**
* The Enum type of path constraints can be used in query statement
*/
public enum PATH_TYPE { EXACT, CHILDNODES, DECENDANTS, DECENDANTS_OR_SELFT };
/**
* The Enum LOGICAL function for query
*/
public enum LOGICAL { AND, OR, NULL, NOT, AND_NOT, OR_NOT};
/**
* The Enum ORDERBY function for query
*/
public enum ORDERBY { ASC, DESC };
/**
* The Enum COMPARISON_TYPE function for query
*/
public enum COMPARISON_TYPE {
EQUAL, LIKE
};
}