EMMA Coverage Report (generated Sun Mar 01 22:06:14 CET 2015)
[all classes][org.h2.expression]

COVERAGE SUMMARY FOR SOURCE FILE [JavaFunction.java]

nameclass, %method, %block, %line, %
JavaFunction.java100% (1/1)100% (19/19)93%  (315/337)96%  (58.3/61)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class JavaFunction100% (1/1)100% (19/19)93%  (315/337)96%  (58.3/61)
getExpressionColumns (Session): Expression [] 100% (1/1)56%  (14/25)60%  (3/5)
getValueForColumnList (Session, Expression []): ValueResultSet 100% (1/1)87%  (13/15)93%  (1.9/2)
getSQL (): String 100% (1/1)89%  (59/66)95%  (7.6/8)
getCost (): int 100% (1/1)94%  (30/32)97%  (3.9/4)
JavaFunction (FunctionAlias, Expression []): void 100% (1/1)100% (14/14)100% (5/5)
getArgs (): Expression [] 100% (1/1)100% (3/3)100% (1/1)
getDisplaySize (): int 100% (1/1)100% (2/2)100% (1/1)
getName (): String 100% (1/1)100% (4/4)100% (1/1)
getPrecision (): long 100% (1/1)100% (2/2)100% (1/1)
getScale (): int 100% (1/1)100% (5/5)100% (1/1)
getType (): int 100% (1/1)100% (4/4)100% (1/1)
getValue (Session): Value 100% (1/1)100% (8/8)100% (1/1)
isBufferResultSetToLocalTemp (): boolean 100% (1/1)100% (4/4)100% (1/1)
isDeterministic (): boolean 100% (1/1)100% (4/4)100% (1/1)
isEverything (ExpressionVisitor): boolean 100% (1/1)100% (40/40)100% (9/9)
mapColumns (ColumnResolver, int): void 100% (1/1)100% (22/22)100% (3/3)
optimize (Session): Expression 100% (1/1)100% (40/40)100% (8/8)
setEvaluatable (TableFilter, boolean): void 100% (1/1)100% (24/24)100% (4/4)
updateAggregate (Session): void 100% (1/1)100% (23/23)100% (4/4)

1/*
2 * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
3 * and the EPL 1.0 (http://h2database.com/html/license.html).
4 * Initial Developer: H2 Group
5 */
6package org.h2.expression;
7 
8import org.h2.command.Parser;
9import org.h2.engine.Constants;
10import org.h2.engine.FunctionAlias;
11import org.h2.engine.Session;
12import org.h2.table.ColumnResolver;
13import org.h2.table.TableFilter;
14import org.h2.util.StatementBuilder;
15import org.h2.value.DataType;
16import org.h2.value.Value;
17import org.h2.value.ValueArray;
18import org.h2.value.ValueNull;
19import org.h2.value.ValueResultSet;
20 
21/**
22 * This class wraps a user-defined function.
23 */
24public class JavaFunction extends Expression implements FunctionCall {
25 
26    private final FunctionAlias functionAlias;
27    private final FunctionAlias.JavaMethod javaMethod;
28    private final Expression[] args;
29 
30    public JavaFunction(FunctionAlias functionAlias, Expression[] args) {
31        this.functionAlias = functionAlias;
32        this.javaMethod = functionAlias.findJavaMethod(args);
33        this.args = args;
34    }
35 
36    @Override
37    public Value getValue(Session session) {
38        return javaMethod.getValue(session, args, false);
39    }
40 
41    @Override
42    public int getType() {
43        return javaMethod.getDataType();
44    }
45 
46    @Override
47    public void mapColumns(ColumnResolver resolver, int level) {
48        for (Expression e : args) {
49            e.mapColumns(resolver, level);
50        }
51    }
52 
53    @Override
54    public Expression optimize(Session session) {
55        boolean allConst = isDeterministic();
56        for (int i = 0, len = args.length; i < len; i++) {
57            Expression e = args[i].optimize(session);
58            args[i] = e;
59            allConst &= e.isConstant();
60        }
61        if (allConst) {
62            return ValueExpression.get(getValue(session));
63        }
64        return this;
65    }
66 
67    @Override
68    public void setEvaluatable(TableFilter tableFilter, boolean b) {
69        for (Expression e : args) {
70            if (e != null) {
71                e.setEvaluatable(tableFilter, b);
72            }
73        }
74    }
75 
76    @Override
77    public int getScale() {
78        return DataType.getDataType(getType()).defaultScale;
79    }
80 
81    @Override
82    public long getPrecision() {
83        return Integer.MAX_VALUE;
84    }
85 
86    @Override
87    public int getDisplaySize() {
88        return Integer.MAX_VALUE;
89    }
90 
91    @Override
92    public String getSQL() {
93        StatementBuilder buff = new StatementBuilder();
94        // TODO always append the schema once FUNCTIONS_IN_SCHEMA is enabled
95        if (functionAlias.getDatabase().getSettings().functionsInSchema ||
96                !functionAlias.getSchema().getName().equals(Constants.SCHEMA_MAIN)) {
97            buff.append(
98                    Parser.quoteIdentifier(functionAlias.getSchema().getName()))
99                    .append('.');
100        }
101        buff.append(Parser.quoteIdentifier(functionAlias.getName())).append('(');
102        for (Expression e : args) {
103            buff.appendExceptFirst(", ");
104            buff.append(e.getSQL());
105        }
106        return buff.append(')').toString();
107    }
108 
109    @Override
110    public void updateAggregate(Session session) {
111        for (Expression e : args) {
112            if (e != null) {
113                e.updateAggregate(session);
114            }
115        }
116    }
117 
118    @Override
119    public String getName() {
120        return functionAlias.getName();
121    }
122 
123    @Override
124    public ValueResultSet getValueForColumnList(Session session,
125            Expression[] argList) {
126        Value v = javaMethod.getValue(session, argList, true);
127        return v == ValueNull.INSTANCE ? null : (ValueResultSet) v;
128    }
129 
130    @Override
131    public Expression[] getArgs() {
132        return args;
133    }
134 
135    @Override
136    public boolean isEverything(ExpressionVisitor visitor) {
137        switch(visitor.getType()) {
138        case ExpressionVisitor.DETERMINISTIC:
139            if (!isDeterministic()) {
140                return false;
141            }
142            // only if all parameters are deterministic as well
143            break;
144        case ExpressionVisitor.GET_DEPENDENCIES:
145            visitor.addDependency(functionAlias);
146            break;
147        default:
148        }
149        for (Expression e : args) {
150            if (e != null && !e.isEverything(visitor)) {
151                return false;
152            }
153        }
154        return true;
155    }
156 
157    @Override
158    public int getCost() {
159        int cost = javaMethod.hasConnectionParam() ? 25 : 5;
160        for (Expression e : args) {
161            cost += e.getCost();
162        }
163        return cost;
164    }
165 
166    @Override
167    public boolean isDeterministic() {
168        return functionAlias.isDeterministic();
169    }
170 
171    @Override
172    public Expression[] getExpressionColumns(Session session) {
173        switch (getType()) {
174        case Value.RESULT_SET:
175            ValueResultSet rs = getValueForColumnList(session, getArgs());
176            return getExpressionColumns(session, rs.getResultSet());
177        case Value.ARRAY:
178            return getExpressionColumns(session, (ValueArray) getValue(session));
179        }
180        return super.getExpressionColumns(session);
181    }
182 
183    @Override
184    public boolean isBufferResultSetToLocalTemp() {
185        return functionAlias.isBufferResultSetToLocalTemp();
186    }
187 
188}

[all classes][org.h2.expression]
EMMA 2.0.5312 (C) Vladimir Roubtsov