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.ValueExpr; 20 import org.outerj.daisy.query.model.QValueType; 21 import org.outerj.daisy.query.model.SqlGenerationContext; 22 import org.outerj.daisy.query.QueryContext; 23 import org.outerj.daisy.repository.query.QueryException; 24 import org.outerj.daisy.repository.query.EvaluationContext; 25 import org.outerj.daisy.repository.Document; 26 import org.outerj.daisy.repository.Version; 27 28 import java.util.Locale ; 29 30 public class LeftFunction extends AbstractFunction { 31 public static final String NAME = "Left"; 32 33 public String getFunctionName() { 34 return NAME; 35 } 36 37 public void prepare(QueryContext context) throws QueryException { 38 super.prepare(context); 39 40 if (params.size() != 2) 41 throw new QueryException("Function " + getFunctionName() + " expects exactly two parameters."); 42 ValueExpr stringParam = getParam(0); 43 QValueType paramValueType = stringParam.getValueType(); 44 if ((paramValueType != QValueType.UNDEFINED && paramValueType != QValueType.STRING) || stringParam.isSymbolicIdentifier() || stringParam.isMultiValue()) 45 throw new QueryException("Function " + getFunctionName() + " needs a string as first parameter."); 46 47 ValueExpr lengthParam = getParam(1); 48 paramValueType = lengthParam.getValueType(); 49 if ((paramValueType != QValueType.UNDEFINED && paramValueType != QValueType.LONG) || lengthParam.isSymbolicIdentifier() || lengthParam.isMultiValue()) 50 throw new QueryException("Function " + getFunctionName() + " needs an integer number as second parameter."); 51 } 52 53 public void generateSqlValueExpr(StringBuffer sql, SqlGenerationContext context) throws QueryException { 54 String sqlFunction = getFunctionName(context); 55 sql.append(' ').append(sqlFunction).append('('); 56 super.generateSqlValueExpr(sql, context); 57 sql.append(") "); 58 } 59 60 protected String getFunctionName(SqlGenerationContext context) { 61 return context.getJdbcHelper().getStringLeftFunction(); 62 } 63 64 public Object evaluate(QValueType valueType, EvaluationContext evaluationContext) throws QueryException { 65 String value = (String )((ValueExpr)params.get(0)).evaluate(QValueType.STRING, evaluationContext); 66 int length = ((Long )((ValueExpr)params.get(1)).evaluate(QValueType.LONG, evaluationContext)).intValue(); 67 return evaluate(value, length); 68 } 69 70 public Object evaluate(QValueType valueType, Document document, Version version, EvaluationContext evaluationContext) throws QueryException { 71 String value = (String )((ValueExpr)params.get(0)).evaluate(QValueType.STRING, document, version, evaluationContext); 72 int length = ((Long )((ValueExpr)params.get(1)).evaluate(QValueType.LONG, document, version, evaluationContext)).intValue(); 73 return evaluate(value, length); 74 } 75 76 protected Object evaluate(String value, int length) throws QueryException { 77 if (value == null) 78 return null; 79 else if (length < 0) 80 throw new QueryException("Length parameter of " + getFunctionName() + " function cannot be negative."); 81 else if (length > value.length()) 82 return value; 83 else 84 return value.substring(0, length); 85 } 86 87 public QValueType getValueType() { 88 return QValueType.STRING; 89 } 90 91 public String getTitle(Locale locale) { 92 return getExpression(); 93 } 94 95 public QValueType getOutputValueType() { 96 return QValueType.STRING; 97 } 98 99 public Object getOutputValue(Document document, Version version, EvaluationContext evaluationContext) throws QueryException { 100 return evaluate(null, document, version, evaluationContext); 101 } 102 } 103 | Popular Tags |