package com.breeze.query; import java.util.Arrays; import java.util.HashMap; import java.util.List; import com.breeze.metadata.DataType; import com.breeze.metadata.IEntityType; public class FnExpression extends Expression { private String _fnName; private List<Expression> _exprs; // first DataType in the list is the return type the rest are argument // types; private static HashMap<String, DataType[]> _fnMap = new HashMap<String, DataType[]>(); static { registerFn("toupper", DataType.String, DataType.String); registerFn("tolower", DataType.String, DataType.String); registerFn("trim", DataType.String, DataType.String); registerFn("concat", DataType.String, DataType.String, DataType.String); registerFn("substring", DataType.String, DataType.String, DataType.Int32, DataType.Int32); registerFn("replace", DataType.String, DataType.String, DataType.String); registerFn("length", DataType.Int32, DataType.String); registerFn("indexof", DataType.Int32, DataType.String, DataType.String); registerFn("year", DataType.Int32, DataType.DateTime); registerFn("month", DataType.Int32, DataType.DateTime); registerFn("day", DataType.Int32, DataType.DateTime); registerFn("minute", DataType.Int32, DataType.DateTime); registerFn("second", DataType.Int32, DataType.DateTime); registerFn("round", DataType.Int32, DataType.Double); registerFn("ceiling", DataType.Int32, DataType.Double); registerFn("floor", DataType.Int32, DataType.Double); registerFn("substringof", DataType.Boolean, DataType.String, DataType.String); registerFn("startsWith", DataType.Boolean, DataType.String, DataType.String); registerFn("endsWith", DataType.Boolean, DataType.String, DataType.String); } public FnExpression(String fnName, List<Expression> exprs) { _fnName = fnName; _exprs = exprs; } public static FnExpression createFrom(String source, IEntityType entityType) { return FnExpressionToken.toExpression(source, entityType); } public String getFnName() { return _fnName; } public List<Expression> getExpressions() { return _exprs; } public DataType getDataType() { return getReturnType(_fnName); } public static void registerFn(String name, DataType... dataTypes) { _fnMap.put(name.toLowerCase(), dataTypes); } public static DataType getReturnType(String fnName) { DataType[] dataTypes = _fnMap.get(fnName.toLowerCase()); return (dataTypes != null) ? dataTypes[0] : null; } public static DataType[] getArgTypes(String fnName) { DataType[] dataTypes = _fnMap.get(fnName.toLowerCase()); if (dataTypes == null) { throw new RuntimeException("Unable to recognize a function named: " + fnName); } return Arrays.copyOfRange(dataTypes, 1, dataTypes.length); } }