1 16 package org.outerj.daisy.query.model.functions; 17 18 import org.outerj.daisy.query.model.AbstractFunction; 19 import org.outerj.daisy.query.model.QValueType; 20 import org.outerj.daisy.query.model.ValueExpr; 21 import org.outerj.daisy.query.model.SqlGenerationContext; 22 import org.outerj.daisy.query.QueryContext; 23 import org.outerj.daisy.repository.query.EvaluationContext; 24 import org.outerj.daisy.repository.query.QueryException; 25 import org.outerj.daisy.repository.Document; 26 import org.outerj.daisy.repository.Version; 27 28 import java.util.Locale ; 29 import java.util.Date ; 30 import java.util.Calendar ; 31 import java.util.GregorianCalendar ; 32 import java.sql.PreparedStatement ; 33 import java.sql.SQLException ; 34 35 public abstract class DateComponentFunction extends AbstractFunction { 36 public void prepare(QueryContext context) throws QueryException { 37 super.prepare(context); 38 if (params.size() != 1) 39 throw new QueryException(getFunctionName() + " takes exactly 1 parameter."); 40 ValueExpr param = getParam(0); 41 if ((param.getValueType() != QValueType.DATE && param.getValueType() != QValueType.DATETIME 42 && param.getValueType() != QValueType.UNDEFINED) 43 || param.isMultiValue() || param.isSymbolicIdentifier()) 44 throw new QueryException("Invalid argument for " + getFunctionName() + " function: " + param.getExpression()); 45 } 46 47 protected abstract int getCalendarField(); 48 49 public Object evaluate(QValueType valueType, EvaluationContext evaluationContext) throws QueryException { 50 Date date = (Date )getParam(0).evaluate(QValueType.DATE, evaluationContext); 51 Calendar calendar = new GregorianCalendar (); 52 calendar.setTime(date); 53 return new Long (calendar.get(getCalendarField()) + getAdjustment()); 54 } 55 56 public Object evaluate(QValueType valueType, Document document, Version version, EvaluationContext evaluationContext) throws QueryException { 57 Date date = (Date )getParam(0).evaluate(QValueType.DATE, document, version, evaluationContext); 58 Calendar calendar = new GregorianCalendar (Locale.US); 59 calendar.setTime(date); 60 return new Long (calendar.get(getCalendarField()) + getAdjustment()); 61 } 62 63 protected abstract String [] getSqlFunction(SqlGenerationContext context); 64 65 protected int getAdjustment() { 66 return 0; 67 } 68 69 public void generateSqlValueExpr(StringBuffer sql, SqlGenerationContext context) throws QueryException { 70 String [] sqlFunction = getSqlFunction(context); 71 sql.append(' ').append(sqlFunction[0]); 72 super.generateSqlValueExpr(sql, context); 73 sql.append(sqlFunction[1]).append(' '); 74 } 75 76 public int bindValueExpr(PreparedStatement stmt, int bindPos, QValueType valueType, EvaluationContext evaluationContext) throws SQLException , QueryException { 77 return super.bindValueExpr(stmt, bindPos, QValueType.DATE, evaluationContext); 78 } 79 80 public QValueType getValueType() { 81 return QValueType.LONG; 82 } 83 84 public String getTitle(Locale locale) { 85 return getExpression(); 86 } 87 88 public QValueType getOutputValueType() { 89 return QValueType.LONG; 90 } 91 92 public Object getOutputValue(Document document, Version version, EvaluationContext evaluationContext) throws QueryException { 93 return evaluate(null, document, version, evaluationContext); 94 } 95 } 96 | Popular Tags |