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());

Reply via email to