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 SubstringFunction extends AbstractFunction { 31 public static final String NAME = "Substring"; 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 || params.size() > 3) 41 throw new QueryException("Function " + NAME + " expects two or three parameters."); 42 43 ValueExpr stringParam = getParam(0); 44 QValueType paramValueType = stringParam.getValueType(); 45 if ((paramValueType != QValueType.UNDEFINED && paramValueType != QValueType.STRING) || stringParam.isSymbolicIdentifier() || stringParam.isMultiValue()) 46 throw new QueryException("Function " + NAME + " needs a string as first parameter."); 47 48 ValueExpr lengthParam = getParam(1); 49 paramValueType = lengthParam.getValueType(); 50 if ((paramValueType != QValueType.UNDEFINED && paramValueType != QValueType.LONG) || lengthParam.isSymbolicIdentifier() || lengthParam.isMultiValue()) 51 throw new QueryException("Function " + NAME + " needs an integer number as second parameter."); 52 53 if (params.size() == 3) { 54 lengthParam = getParam(2); 55 paramValueType = lengthParam.getValueType(); 56 if ((paramValueType != QValueType.UNDEFINED && paramValueType != QValueType.LONG) || lengthParam.isSymbolicIdentifier() || lengthParam.isMultiValue()) 57 throw new QueryException("Function " + NAME + " needs an integer number as third parameter."); 58 } 59 } 60 61 public void generateSqlValueExpr(StringBuffer sql, SqlGenerationContext context) throws QueryException { 62 String sqlFunction = context.getJdbcHelper().getSubstringFunction(); 63 sql.append(' ').append(sqlFunction).append('('); 64 super.generateSqlValueExpr(sql, context); 65 sql.append(") "); 66 } 67 68 public Object evaluate(QValueType valueType, EvaluationContext evaluationContext) throws QueryException { 69 String value = (String )((ValueExpr)params.get(0)).evaluate(QValueType.STRING, evaluationContext); 70 int pos = ((Long )((ValueExpr)params.get(1)).evaluate(QValueType.LONG, evaluationContext)).intValue(); 71 int length = value.length() - pos; 72 if (params.size() == 3) 73 length = ((Long )((ValueExpr)params.get(2)).evaluate(QValueType.LONG, evaluationContext)).intValue(); 74 return evaluate(value, pos, length); 75 } 76 77 public Object evaluate(QValueType valueType, Document document, Version version, EvaluationContext evaluationContext) throws QueryException { 78 String value = (String )((ValueExpr)params.get(0)).evaluate(QValueType.STRING, document, version, evaluationContext); 79 int pos = ((Long )((ValueExpr)params.get(1)).evaluate(QValueType.LONG, document, version, evaluationContext)).intValue(); 80 int length = value.length() - pos; 81 if (params.size() == 3) 82 length = ((Long )((ValueExpr)params.get(2)).evaluate(QValueType.LONG, evaluationContext)).intValue(); 83 return evaluate(value, pos, length); 84 } 85 86 protected Object evaluate(String value, int pos, int length) throws QueryException { 87 if (value == null) 88 return null; 89 else if (pos < 1) 90 throw new QueryException("Position parameter of " + NAME + " function cannot be less than one."); 91 else if (length < 0) 92 throw new QueryException("Length parameter of " + NAME + " function cannot be negative."); 93 else if (pos > value.length()) 94 return ""; 95 else { 96 int endIndex = pos + length; 97 if (endIndex > value.length() + 1) 98 endIndex = value.length() + 1; 99 return value.substring(pos - 1, endIndex - 1); 101 } 102 } 103 104 public QValueType getValueType() { 105 return QValueType.STRING; 106 } 107 108 public String getTitle(Locale locale) { 109 return getExpression(); 110 } 111 112 public QValueType getOutputValueType() { 113 return QValueType.STRING; 114 } 115 116 public Object getOutputValue(Document document, Version version, EvaluationContext evaluationContext) throws QueryException { 117 return evaluate(null, document, version, evaluationContext); 118 } 119 } 120 121 | Popular Tags |