Repository: metamodel Updated Branches: refs/heads/master 8d0bb5fc1 -> ddb2454ef
METAMODEL-178: Fixed Fixes #34 Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/ddb2454e Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/ddb2454e Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/ddb2454e Branch: refs/heads/master Commit: ddb2454ef055ee0bf128162a202a1f6b1ef330b7 Parents: 8d0bb5f Author: Alberto Rodriguez <ardl...@gmail.com> Authored: Tue Aug 18 21:59:25 2015 +0200 Committer: Kasper Sørensen <i.am.kasper.soren...@gmail.com> Committed: Tue Aug 18 21:59:25 2015 +0200 ---------------------------------------------------------------------- CHANGES.md | 1 + .../org/apache/metamodel/MetaModelHelper.java | 4 +- .../metamodel/QueryPostprocessDataContext.java | 4 +- .../metamodel/query/AggregateFunction.java | 54 ++++++++++ .../query/AverageAggregateFunction.java | 33 ++++++ .../metamodel/query/CountAggregateFunction.java | 39 +++++++ .../query/DefaultAggregateFunction.java | 67 ++++++++++++ .../apache/metamodel/query/FunctionType.java | 107 +++---------------- .../metamodel/query/FunctionTypeFactory.java | 43 ++++++++ .../metamodel/query/MaxAggregateBuilder.java | 2 +- .../metamodel/query/MaxAggregateFunction.java | 33 ++++++ .../metamodel/query/MinAggregateFunction.java | 33 ++++++ .../apache/metamodel/query/ScalarFunction.java | 31 ++++++ .../org/apache/metamodel/query/SelectItem.java | 11 +- .../metamodel/query/SumAggregateFunction.java | 33 ++++++ .../query/parser/SelectItemParser.java | 9 +- .../QueryPostprocessDataContextTest.java | 1 + 17 files changed, 398 insertions(+), 107 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index 95e8836..a6a82cc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ ### Apache MetaModel (latest) * [METAMODEL-170] - Dropped support for Java 6. + * [METAMODEL-178] - Added AggregateFunction and ScalarFunction interfaces. Changed FunctionType enum to be super-interface of those. Compatibility is retained but a recompile of code using FunctionType is needed. ### Apache MetaModel 4.3.6 http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/MetaModelHelper.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java index 8b5d650..e0b9b01 100644 --- a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java +++ b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java @@ -374,7 +374,7 @@ public final class MetaModelHelper { // value List<Object> objects = functionInput.get(item); if (objects != null) { - Object functionResult = item.getFunction().evaluate(objects.toArray()); + Object functionResult = item.getAggregateFunction().evaluate(objects.toArray()); resultRow[i] = functionResult; } else { if (item.getFunction() != null) { @@ -416,7 +416,7 @@ public final class MetaModelHelper { final Map<SelectItem, AggregateBuilder<?>> aggregateBuilders = new HashMap<SelectItem, AggregateBuilder<?>>(); for (SelectItem item : functionItems) { - aggregateBuilders.put(item, item.getFunction().build()); + aggregateBuilders.put(item, item.getAggregateFunction().createAggregateBuilder()); } final DataSetHeader header; http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java index 872a7dd..1fecf98 100644 --- a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java +++ b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java @@ -219,8 +219,8 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im /** * Determines if all the select items are 'simple' meaning that they just * represent scans of values in columns. - * - * @param selectItems + * + * @param clause * @return */ private boolean isSimpleSelect(SelectClause clause) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/AggregateFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/AggregateFunction.java b/core/src/main/java/org/apache/metamodel/query/AggregateFunction.java new file mode 100644 index 0000000..fdb2d8f --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/AggregateFunction.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +import org.apache.metamodel.schema.ColumnType; +import org.apache.metamodel.util.AggregateBuilder; + +/** + * Interface that contains the aggregation specific methods + * related to the AggregateBuilder. + * + */ +public interface AggregateFunction extends FunctionType { + + /** + * Creates a specific aggregate builder. + * + * @return an AggregateBuilder instance + */ + public AggregateBuilder<?> createAggregateBuilder(); + + /** + * Shorthand for creating an aggregate builder, adding all + * the values and then calculating the value. + * + * @param values + * @return the aggregated value + */ + public Object evaluate(Object... values); + + /** + * Returns the function ColumnType. + * + * @param type + * @return the ColumnType + */ + public ColumnType getExpectedColumnType(ColumnType type); +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/AverageAggregateFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/AverageAggregateFunction.java b/core/src/main/java/org/apache/metamodel/query/AverageAggregateFunction.java new file mode 100644 index 0000000..a1ea23f --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/AverageAggregateFunction.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +import org.apache.metamodel.util.AggregateBuilder; + +public class AverageAggregateFunction extends DefaultAggregateFunction<Double> implements AggregateFunction { + + public String getFunctionName() { + return "AVG"; + } + + public AggregateBuilder<Double> createAggregateBuilder() { + return new AverageAggregateBuilder(); + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/CountAggregateFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/CountAggregateFunction.java b/core/src/main/java/org/apache/metamodel/query/CountAggregateFunction.java new file mode 100644 index 0000000..dc86f90 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/CountAggregateFunction.java @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +import org.apache.metamodel.schema.ColumnType; +import org.apache.metamodel.util.AggregateBuilder; + +public class CountAggregateFunction extends DefaultAggregateFunction<Long> { + + public String getFunctionName() { + return "COUNT"; + } + + public AggregateBuilder<Long> createAggregateBuilder() { + return new CountAggregateBuilder(); + } + + @Override + public ColumnType getExpectedColumnType(ColumnType type) { + return ColumnType.BIGINT; + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/DefaultAggregateFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/DefaultAggregateFunction.java b/core/src/main/java/org/apache/metamodel/query/DefaultAggregateFunction.java new file mode 100644 index 0000000..e38d403 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/DefaultAggregateFunction.java @@ -0,0 +1,67 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +import org.apache.metamodel.schema.ColumnType; +import org.apache.metamodel.util.AggregateBuilder; + +/** + * Implementation of the {@link org.apache.metamodel.query.AggregateFunction}. + */ +public abstract class DefaultAggregateFunction<T> implements AggregateFunction { + + public abstract AggregateBuilder<T> createAggregateBuilder(); + + public ColumnType getExpectedColumnType(ColumnType type) { + return type; + } + + public Object evaluate(Iterable<?> values) { + AggregateBuilder<?> builder = createAggregateBuilder(); + for (Object object : values) { + builder.add(object); + } + return builder.getAggregate(); + } + + /** + * Executes the function + * + * @param values + * the values to be evaluated. If a value is null it won't be + * evaluated + * @return the result of the function execution. The return type class is + * dependent on the FunctionType and the values provided. COUNT + * yields a Long, AVG and SUM yields Double values and MAX and MIN + * yields the type of the provided values. + */ + public Object evaluate(Object... values) { + AggregateBuilder<?> builder = createAggregateBuilder(); + for (Object object : values) { + builder.add(object); + } + return builder.getAggregate(); + } + + @Override + public String toString() { + return getFunctionName(); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/FunctionType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/FunctionType.java b/core/src/main/java/org/apache/metamodel/query/FunctionType.java index a7d50fd..695e7f4 100644 --- a/core/src/main/java/org/apache/metamodel/query/FunctionType.java +++ b/core/src/main/java/org/apache/metamodel/query/FunctionType.java @@ -18,105 +18,22 @@ */ package org.apache.metamodel.query; -import org.apache.metamodel.schema.Column; import org.apache.metamodel.schema.ColumnType; -import org.apache.metamodel.util.AggregateBuilder; /** - * Represents an aggregate function to use in a SelectItem. - * + * Represents a generic function to use in a SelectItem. + * * @see SelectItem - */ -public enum FunctionType { - - COUNT { - @Override - public AggregateBuilder<Long> build() { - return new CountAggregateBuilder(); - } - }, - AVG { - @Override - public AggregateBuilder<Double> build() { - return new AverageAggregateBuilder(); - } - }, - SUM { - @Override - public AggregateBuilder<Double> build() { - return new SumAggregateBuilder(); - } - }, - MAX { - @Override - public AggregateBuilder<Object> build() { - return new MaxAggregateBuilder(); - } - }, - MIN { - @Override - public AggregateBuilder<Object> build() { - return new MinAggregateBuilder(); - } - }; - - public ColumnType getExpectedColumnType(ColumnType type) { - switch (this) { - case COUNT: - return ColumnType.BIGINT; - case AVG: - case SUM: - return ColumnType.DOUBLE; - case MAX: - case MIN: - return type; - default: - return type; - } - } - - public SelectItem createSelectItem(Column column) { - return new SelectItem(this, column); - } - - public SelectItem createSelectItem(String expression, String alias) { - return new SelectItem(this, expression, alias); - } - - public Object evaluate(Iterable<?> values) { - AggregateBuilder<?> builder = build(); - for (Object object : values) { - builder.add(object); - } - return builder.getAggregate(); - } +*/ +public interface FunctionType { - /** - * Executes the function - * - * @param values - * the values to be evaluated. If a value is null it won't be - * evaluated - * @return the result of the function execution. The return type class is - * dependent on the FunctionType and the values provided. COUNT - * yields a Long, AVG and SUM yields Double values and MAX and MIN - * yields the type of the provided values. - */ - public Object evaluate(Object... values) { - AggregateBuilder<?> builder = build(); - for (Object object : values) { - builder.add(object); - } - return builder.getAggregate(); - } + public static final AggregateFunction COUNT = new CountAggregateFunction(); + public static final AggregateFunction AVG = new AverageAggregateFunction(); + public static final AggregateFunction SUM = new SumAggregateFunction(); + public static final AggregateFunction MAX = new MaxAggregateFunction(); + public static final AggregateFunction MIN = new MinAggregateFunction(); - public abstract AggregateBuilder<?> build(); + public ColumnType getExpectedColumnType(ColumnType type); - public static FunctionType get(String functionName) { - try { - return valueOf(functionName); - } catch (IllegalArgumentException e) { - return null; - } - } -} \ No newline at end of file + public String getFunctionName(); +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/FunctionTypeFactory.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/FunctionTypeFactory.java b/core/src/main/java/org/apache/metamodel/query/FunctionTypeFactory.java new file mode 100644 index 0000000..9345f42 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/FunctionTypeFactory.java @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +/** + * Factory to create AggregateFunctions through + * its function name. + * + */ +public class FunctionTypeFactory { + + public static AggregateFunction get(String functionName) { + if (functionName.equals("COUNT")) { + return FunctionType.COUNT; + } else if (functionName.equals("AVG")) { + return FunctionType.AVG; + } else if (functionName.equals("SUM")) { + return FunctionType.SUM; + } else if (functionName.equals("MAX")) { + return FunctionType.MAX; + } else if (functionName.equals("MIN")) { + return FunctionType.MIN; + } else { + return null; + } + } +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/MaxAggregateBuilder.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/MaxAggregateBuilder.java b/core/src/main/java/org/apache/metamodel/query/MaxAggregateBuilder.java index fc3cc42..59344ad 100644 --- a/core/src/main/java/org/apache/metamodel/query/MaxAggregateBuilder.java +++ b/core/src/main/java/org/apache/metamodel/query/MaxAggregateBuilder.java @@ -42,7 +42,7 @@ final class MaxAggregateBuilder implements AggregateBuilder<Object> { @Override public Object getAggregate() { - return max; + return max; } } http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/MaxAggregateFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/MaxAggregateFunction.java b/core/src/main/java/org/apache/metamodel/query/MaxAggregateFunction.java new file mode 100644 index 0000000..aeadba0 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/MaxAggregateFunction.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +import org.apache.metamodel.util.AggregateBuilder; + +public class MaxAggregateFunction extends DefaultAggregateFunction<Object> implements AggregateFunction { + + public String getFunctionName() { + return "MAX"; + } + + public AggregateBuilder<Object> createAggregateBuilder() { + return new MaxAggregateBuilder(); + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/MinAggregateFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/MinAggregateFunction.java b/core/src/main/java/org/apache/metamodel/query/MinAggregateFunction.java new file mode 100644 index 0000000..8c7599b --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/MinAggregateFunction.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +import org.apache.metamodel.util.AggregateBuilder; + +public class MinAggregateFunction extends DefaultAggregateFunction<Object> implements AggregateFunction { + + public String getFunctionName() { + return "MIN"; + } + + public AggregateBuilder<Object> createAggregateBuilder() { + return new MinAggregateBuilder(); + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/ScalarFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/ScalarFunction.java b/core/src/main/java/org/apache/metamodel/query/ScalarFunction.java new file mode 100644 index 0000000..c5131ec --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/ScalarFunction.java @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +/** + * Interface that contains scalar specific methods. + * + * Scalar functions returns only a single value, based + * on the input value. + * + */ +public interface ScalarFunction extends FunctionType { + + //TODO: Add scalar function methods +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/SelectItem.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/SelectItem.java b/core/src/main/java/org/apache/metamodel/query/SelectItem.java index 6342676..bfe1298 100644 --- a/core/src/main/java/org/apache/metamodel/query/SelectItem.java +++ b/core/src/main/java/org/apache/metamodel/query/SelectItem.java @@ -92,7 +92,7 @@ public class SelectItem extends BaseObject implements QueryItem, Cloneable { } public static boolean isCountAllItem(SelectItem item) { - if (item != null && item.getFunction() == FunctionType.COUNT && item.getExpression() == "*") { + if (item != null && item.getFunction()!= null && item.getFunction().toString().equals("COUNT") && item.getExpression() == "*") { return true; } return false; @@ -211,6 +211,15 @@ public class SelectItem extends BaseObject implements QueryItem, Cloneable { return _function; } + public AggregateFunction getAggregateFunction() { + if (_function instanceof AggregateFunction) { + return (AggregateFunction) _function; + } + else { + return null; + } + } + /** * @return if this is a function based SelectItem where function calculation * is allowed to be approximated (if the datastore type has an http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/SumAggregateFunction.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/SumAggregateFunction.java b/core/src/main/java/org/apache/metamodel/query/SumAggregateFunction.java new file mode 100644 index 0000000..193195e --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/query/SumAggregateFunction.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.query; + +import org.apache.metamodel.schema.ColumnType; +import org.apache.metamodel.util.AggregateBuilder; + +public class SumAggregateFunction extends DefaultAggregateFunction<Double> implements AggregateFunction { + + public String getFunctionName() { return "SUM"; } + + public AggregateBuilder<Double> createAggregateBuilder() { + return new SumAggregateBuilder(); + } + + public ColumnType getExpectedColumnType(ColumnType type) { return ColumnType.DOUBLE; } +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java b/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java index 37c59f2..9e87e1d 100644 --- a/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java +++ b/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java @@ -20,10 +20,7 @@ package org.apache.metamodel.query.parser; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.MetaModelHelper; -import org.apache.metamodel.query.FromItem; -import org.apache.metamodel.query.FunctionType; -import org.apache.metamodel.query.Query; -import org.apache.metamodel.query.SelectItem; +import org.apache.metamodel.query.*; import org.apache.metamodel.schema.Column; public final class SelectItemParser implements QueryPartProcessor { @@ -113,10 +110,10 @@ public final class SelectItemParser implements QueryPartProcessor { final int startParenthesis = expression.indexOf('('); if (startParenthesis > 0 && expression.endsWith(")")) { String functionName = expression.substring(0, startParenthesis); - function = FunctionType.get(functionName.toUpperCase()); + function = FunctionTypeFactory.get(functionName.toUpperCase()); if (function != null) { expression = expression.substring(startParenthesis + 1, expression.length() - 1).trim(); - if (function == FunctionType.COUNT && "*".equals(expression)) { + if (function instanceof CountAggregateFunction && "*".equals(expression)) { return SelectItem.getCountAllItem(); } } http://git-wip-us.apache.org/repos/asf/metamodel/blob/ddb2454e/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java index 4bcfd0a..a1abea8 100644 --- a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java +++ b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java @@ -454,6 +454,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase { q.toString()); DataContext dc = getDataContext(); + DataSet data = dc.executeQuery(q); assertEquals(1, data.getSelectItems().length); assertEquals("SUM(r.project_id)", data.getSelectItems()[0].toString());