package jef.database.jsqlparser.expression;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import jef.database.jsqlparser.visitor.Expression;
import jef.database.jsqlparser.visitor.ExpressionType;
import jef.database.jsqlparser.visitor.ExpressionVisitor;
import jef.database.jsqlparser.visitor.SqlValue;
import jef.database.query.SqlExpression;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
/**
* 这个是专门为了解析MYSQL日期时间操作中的INTERVAL关键字的
* @author jiyi
*
*/
public class Interval implements Expression,SqlValue{
private String unit;
private Expression value;
private static final String[] MYSQL_ALL_DATEUNIT={"microsecond",
"second","minute","hour","day","week","month","quarter","year",
"second_microsecond",
"minute_microsecond",
"minute_second",
"hour_microsecond",
"hour_second",
"hour_minute",
"day_microsecond",
"day_second",
"day_minute",
"day_hour",
"year_month"};
private static final Map<String,String> alias=new HashMap<String,String>();
static{
alias.put("years", "year");
alias.put("months", "month");
alias.put("weeks", "week");
alias.put("days", "day");
alias.put("hours", "hour");
alias.put("minutes", "minute");
alias.put("seconds", "second");
alias.put("y", "year");
alias.put("m", "month");
alias.put("d", "day");
alias.put("one", "1");
}
public Interval(){}
/**
* postgres模式下,没有value,value和unit都被引号变为常量
* @return
*/
public boolean isPostgreMode(){
return value==null && unit.charAt(0)=='\'';
}
public boolean isMySQLMode(){
return ArrayUtils.contains(MYSQL_ALL_DATEUNIT, unit.toLowerCase());
}
public boolean toMySqlMode(){
if(isPostgreMode()){
unit=StringUtils.substringBetween(unit, "'", "'");
int space=unit.indexOf(' ');
if(space>-1){
value=new SqlExpression(unit.substring(0,space));
String u=unit.substring(space+1);
String fixed=alias.get(u.toLowerCase());
unit=fixed==null?u:fixed;
}
return true;
}else{
return isMySQLMode();
}
}
public boolean toPostgresMode(){
if(isMySQLMode()){
unit="'"+value.toString()+" "+unit+"'";
value=null;
return true;
}else{
return isPostgreMode();
}
}
public Interval(String valueAndUnit){
this.unit=valueAndUnit;
}
public Interval(Expression value,String unit){
this.value=value;
this.unit=unit;
}
public void accept(ExpressionVisitor expressionVisitor) {
expressionVisitor.visit(this);
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder(64);
appendTo(sb);
return sb.toString();
}
public void appendTo(StringBuilder sb) {
sb.append("INTERVAL ");
if(value!=null){
value.appendTo(sb);
sb.append(' ');
}
sb.append(unit);
}
public String getUnit() {
return unit;
}
public Expression getValue() {
return value;
}
/**
MICROSECOND MICROSECONDS 毫秒
SECOND SECONDS 秒
MINUTE MINUTES 分
HOUR HOURS 时
DAY DAYS 天
WEEK WEEKS 周
MONTH MONTHS 月
QUARTER QUARTERS 季
YEAR YEARS 年
SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND 'MINUTES:SECONDS.MICROSECONDS'
MINUTE_SECOND 'MINUTES:SECONDS'
HOUR_MICROSECOND 'HOURS:MINUTES:SECONDS.MICROSECONDS'
HOUR_SECOND 'HOURS:MINUTES:SECONDS'
HOUR_MINUTE 'HOURS:MINUTES'
DAY_MICROSECOND 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS'
DAY_SECOND 'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE 'DAYS HOURS:MINUTES'
DAY_HOUR 'DAYS HOURS'
YEAR_MONTH 'YEARS-MONTHS'
* @return
*/
public long toMills(){
return 0;
}
public ExpressionType getType() {
return ExpressionType.value;
}
public Object formatNumber(BigDecimal negate) {
return negate.longValue();
}
}