/*
*
* Copyright c 2005-2009.
*
* Licensed under GNU LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*
*/
/********************************************************************************
* @author chaostone
*
* MODIFICATION DESCRIPTION
*
* Name Date Description
* ============ ============ ============
* chaostone 2006-10-11 Created
*
********************************************************************************/
package org.beanfuse.query;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
/**
* 查询条件 使用例子如下
* <p>
* <blockquote>
*
* <pre>
* new Condition("std.id=?",new Long(2));
* 或者 Condition("std.id=:std_id",new Long(2));
* ?绑定单值.命名参数允许绑定多值.但是只能由字母,数组和下划线组成
* 一组condition只能采取上面一种形式
* </pre>
*
* </blockquote>
* <p>
*
* @author chaostone
*
*/
public class Condition {
private String content;
private List values = new ArrayList(1);
public Condition() {
super();
}
public Condition(final String content) {
this.content = content;
}
public Condition(final String content, Object param1) {
this.content = content;
values.add(param1);
}
public Condition(final String content, Object param1, Object param2) {
this(content, param1, param2, null);
}
public Condition(final String content, Object param1, Object param2, Object param3) {
this.content = content;
if (null != param1) {
values.add(param1);
}
if (null != param2) {
values.add(param2);
}
if (null != param3) {
values.add(param3);
}
}
public String getContent() {
return content;
}
public void setContent(final String content) {
this.content = content;
}
public List getValues() {
return values;
}
public void setValues(final List values) {
this.values = values;
}
public boolean isNamed() {
return !StringUtils.contains(content, "?");
}
/**
* 得到查询条件中所有的命名参数.
*
* @return
*/
public List getNamedParams() {
if (!StringUtils.contains(content, ":")) {
return Collections.EMPTY_LIST;
}
final List params = new ArrayList();
int index = 0;
do {
final int colonIndex = content.indexOf(':', index);
if (-1 == colonIndex) {
break;
}
index = colonIndex + 1;
while (index < content.length()) {
final char c = content.charAt(index);
if (isValidIdentifierStarter(c)) {
index++;
} else {
break;
}
}
final String paramName = content.substring(colonIndex + 1, index);
if (!params.contains(paramName)) {
params.add(paramName);
}
} while (index < content.length());
return params;
}
public boolean isValidIdentifierStarter(final char ch) {
return (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || (ch == '_') || ('0' <= ch && ch <= '9'));
}
public Condition addValue(final Object value) {
getValues().add(value);
return this;
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
final StringBuilder str = new StringBuilder(content).append(" ");
for (final Iterator iter = values.iterator(); iter.hasNext();) {
str.append(iter.next());
}
return str.toString();
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(final Object obj) {
if (null == getContent() || !(obj instanceof Condition)) {
return false;
} else {
return getContent().equals(((Condition) obj).getContent());
}
}
public int hashCode() {
if (null == content) {
return 0;
} else {
return content.hashCode();
}
}
// 以下是几个方便的方法
public static Condition eq(final String content, final Number value) {
return new Condition(content + " = " + value);
}
public static Condition eq(final String content, final String value) {
return new Condition(content + " = '" + value + "'");
}
public static Condition le(final String content, final Number value) {
return new Condition(content + " <= " + value);
}
public static Condition ge(final String content, final Number value) {
return new Condition(content + " >= " + value);
}
public static Condition ne(final String content, final Number value) {
return new Condition(content + " <> " + value);
}
public static Condition like(final String content, final String value) {
return new Condition(content + " like '%" + value + "%'");
}
}