package jef.database.query;
import java.util.Collection;
import jef.database.Condition;
import jef.database.Condition.Operator;
import jef.database.Field;
import jef.database.IConditionField.Not;
import jef.database.QB;
import jef.database.meta.ITableMetadata;
/**
* 查询条件生成器
* 可以更方便的设置各种查询条件
*
* <strong>试验性功能。<strong>
*
*/
public class Terms {
protected ConditionAccessor accessor;
protected TermsEnd end;
private Query<?> query;
Terms(Query<?> q) {
ConditionAccessor accessor=new ConditionAccessor.Q(q);
this.query=q;
this.accessor=accessor;
this.end=new TermsEnd(accessor,q,this);
}
protected Terms(ConditionAccessor accessor,Query<?> query){
this.query=query;
this.accessor=accessor;
this.end=new TermsEnd(accessor,query,this);
}
public TermsEnd gt(String key, Object value) {
Condition cond=QB.gt(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
public TermsEnd lt(String key, Object value) {
Condition cond=QB.lt(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
public TermsEnd ge(String key, Object value) {
Condition cond=QB.ge(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
public TermsEnd le(String key, Object value) {
Condition cond=QB.le(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生相等条件 (=)
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field = value} 这样的条件
*/
public TermsEnd eq(String key, Object value) {
Condition cond=QB.eq(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生不等条件 (<> 或 !=)
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field != value} 这样的条件
*/
public TermsEnd ne(String key, Object value) {
Condition cond=QB.ne(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生IN条件
*
* @param field
* 表的字段(也可以是函数表达式)
* @param value
* 条件的值 数组
* @return @return 表达式为 {@code field in (value,...)} 这样的条件
*/
public TermsEnd in(String key, long[] value) {
Condition cond=QB.in(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生IN条件
*
* @param field
* 表的字段(也可以是函数表达式)
* @param value
* 条件的值 数组
* @return 表达式为 {@code field in (value,...)} 这样的条件
*/
public TermsEnd in(String key, int[] value) {
Condition cond=QB.in(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生IN条件 (in)
*
* @param field
* 表的字段(也可以是函数表达式)
* @param value
* 条件的值 数组
* @return 表达式为 {@code field in (value,...)} 这样的条件
*/
public TermsEnd in(String key, Object[] value) {
Condition cond=QB.in(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生IN条件
*
* @param field
* 表的字段(也可以是函数表达式)
* @param value
* 条件的值 集合
* @return @return 表达式为 {@code field in (value,...)} 这样的条件
*/
public TermsEnd in(String key, Collection<?> value) {
Condition cond=QB.in(getField(key), value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生大于条件 ( >)
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field > value} 这样的条件
*/
public TermsEnd gt(Field key, Object value) {
Condition cond=QB.gt(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生小于条件 (<)
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field < value} 这样的条件
*/
public TermsEnd lt(Field key, Object value) {
Condition cond=QB.lt(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生大于等于条件 ( >= )
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field >= value} 这样的条件
*/
public TermsEnd ge(Field key, Object value) {
Condition cond=QB.ge(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生小于等于条件 ( <= )
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field <= value} 这样的条件
*/
public TermsEnd le(Field key, Object value) {
Condition cond=QB.le(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生相等条件 (=)
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field = value} 这样的条件
*/
public TermsEnd eq(Field key, Object value) {
Condition cond=QB.eq(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生不等条件 (<> 或 !=)
*
* @param field
* 表的字段 (也可以是函数表达式)
* @param value
* 条件的值,一般传入String,Number,Date等基本数据,也可传入Field对象、
* 或者是SqlExpression等对象。
* @return 表达式为 {@code field != value} 这样的条件
*/
public TermsEnd ne(Field key, Object value) {
Condition cond=QB.ne(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生MatchStart条件
*
* @param field
* 表的字段(也可以是函数表达式)
* @param str
* 要匹配的字符串
* @return 产生形如 {@code field like 'str%' } 这样的条件,str中原来的的'%' '_'符号会被转义
*/
public TermsEnd matchStart(Field key, String value) {
Condition cond=QB.matchStart(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* 产生MatchEnd条件,
*
* @param field
* 表的字段(也可以是函数表达式)
* @param str
* 要匹配的字符串
* @return 产生形如 {@code field like '%str' } 这样的条件,str中原来的的'%' '_'符号会被转义
*/
public TermsEnd matchEnd(Field key, String value) {
Condition cond=QB.matchEnd(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* Like %str%的条件
*
* @param field
* field 表的字段(也可以是函数表达式)
* @param str
* 要匹配的字符串
* @return 产生形如 {@code field like '%str%' } 这样的条件,str中原来的的'%' '_'符号会被转义
*/
public TermsEnd matchAny(Field key, String value) {
Condition cond=QB.matchAny(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
/**
* Like条件,参数为自定义的字符串。 例如
* <p>
* {@code like(field, "%123_456%")}
* <p>
* 相当于
* <p>
* {@code WHERE field LIKE '%123_456%' }
* <p>
*
* <h3>注意</h3> 这个方法可以自由定义复杂的匹配模板外,但是和matchxxx系列的方法相比,不会对字符串中的'%'
* '_'做转义。因此实际使用不当会有SQL注入风险。
* <p>
*
* @param field
* field 表的字段(也可以是函数表达式)
* @param str
* 要匹配的字符串
* @return 产生形如 {@code field like 'str' } 这样的条件,str中原来的的'%' '_'符号会被保留
*/
public TermsEnd like(Field key, String value) {
Condition cond=QB.like(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
public TermsEnd in(Field key, Object[] value) {
Condition cond=QB.in(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
public TermsEnd in(Field key, int[] value) {
Condition cond=QB.in(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
public TermsEnd in(Field key, long[] value) {
Condition cond=QB.in(key, value);
cond=accessor.add(cond);
return end.set(cond);
}
public TermsConnector not() {
Not not=new Not();
Condition cond=Condition.get(not, Operator.EQUALS, null);
ConditionAccessor.I context=new ConditionAccessor.I(not,cond);
context.parent=accessor;
return new TermsConnector(context,query,3,this);
}
boolean isBracket(){
return false;
}
private Field getField(String key) {
ITableMetadata meta=query.getMeta();
Field field= meta.getField(key);
return field;
}
boolean bracket;
/**
* 相当于左括号
* @return
*/
public Terms L$() {
bracket=true;
return this;
}
}