This is an automated email from the ASF dual-hosted git repository. alsuliman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push: new 28dd5e9 [NO ISSUE][COMP] Meta() after group by 28dd5e9 is described below commit 28dd5e9bd9fe3fb5a1cbfa2b338ec4921b254727 Author: Ali Alsuliman <ali.al.solai...@gmail.com> AuthorDate: Wed Aug 21 01:32:47 2019 -0700 [NO ISSUE][COMP] Meta() after group by - user model changes: no - storage format changes: no - interface changes: yes Details: Using meta() after group-by requires meta() be assigned to a variable in a LET clause to expose meta(). - added source location to IFunctionManager.lookupFunction() - added test cases Change-Id: I2b173e23352fa80ef57154f08910586c6ee196b8 Reviewed-on: https://asterix-gerrit.ics.uci.edu/3528 Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Ali Alsuliman <ali.al.solai...@gmail.com> Reviewed-by: Dmitry Lychagin <dmitry.lycha...@couchbase.com> --- .../jobgen/QueryLogicalExpressionJobGen.java | 6 ++-- .../meta_after_gby/meta_after_gby.1.ddl.sqlpp} | 40 ++++++++++++++++------ .../meta_after_gby/meta_after_gby.2.update.sqlpp} | 17 +++------ .../meta_after_gby/meta_after_gby.3.query.sqlpp} | 20 +++++------ .../meta_after_gby/meta_after_gby.4.query.sqlpp} | 19 +++++----- .../meta_after_gby/meta_after_gby.5.ddl.sqlpp} | 15 +------- .../meta/meta_after_gby/meta_after_gby.3.adm | 6 ++++ .../test/resources/runtimets/testsuite_sqlpp.xml | 6 ++++ ...condaryCorrelatedTreeIndexOperationsHelper.java | 2 +- .../utils/SecondaryIndexOperationsHelper.java | 6 ++-- .../asterix/om/functions/IFunctionManager.java | 4 ++- .../runtime/formats/NonTaggedDataFormat.java | 13 ++++--- .../asterix/runtime/functions/FunctionManager.java | 12 +++++-- 13 files changed, 92 insertions(+), 74 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java index 32f8001..0de905f 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java @@ -52,6 +52,7 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; import org.apache.hyracks.algebricks.runtime.base.ISerializedAggregateEvaluatorFactory; import org.apache.hyracks.algebricks.runtime.base.IUnnestingEvaluatorFactory; import org.apache.hyracks.algebricks.runtime.evaluators.ColumnAccessEvalFactory; +import org.apache.hyracks.api.exceptions.SourceLocation; public class QueryLogicalExpressionJobGen implements ILogicalExpressionJobGen { @@ -197,8 +198,9 @@ public class QueryLogicalExpressionJobGen implements ILogicalExpressionJobGen { private IFunctionDescriptor resolveFunction(AbstractFunctionCallExpression expr, IVariableTypeEnvironment env, JobGenContext context) throws AlgebricksException { FunctionIdentifier fnId = expr.getFunctionIdentifier(); - IFunctionDescriptor fd = functionManager.lookupFunction(fnId); - fd.setSourceLocation(expr.getSourceLocation()); + SourceLocation sourceLocation = expr.getSourceLocation(); + IFunctionDescriptor fd = functionManager.lookupFunction(fnId, sourceLocation); + fd.setSourceLocation(sourceLocation); IFunctionTypeInferer fnTypeInfer = functionManager.lookupFunctionTypeInferer(fnId); if (fnTypeInfer != null) { CompilerProperties compilerProps = ((IApplicationContext) context.getAppContext()).getCompilerProperties(); diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.1.ddl.sqlpp similarity index 56% copy from asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.1.ddl.sqlpp index e1657ff..a80fc8a 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.1.ddl.sqlpp @@ -16,18 +16,36 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.om.functions; -import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +drop dataverse test if exists; +create dataverse test; +use test; -/** - * A registry of {@link IFunctionDescriptor} and {@link IFunctionTypeInferer} - * for built-in functions - */ -public interface IFunctionManager { +create type DataType as open { +id:int, +name:string, +age:int, +hobby:string +}; + +create type MetaType as closed { +id:int +}; - IFunctionDescriptor lookupFunction(FunctionIdentifier fid) throws AlgebricksException; +create dataset DS(DataType) with meta(MetaType) primary key meta().id; - IFunctionTypeInferer lookupFunctionTypeInferer(FunctionIdentifier fid); -} +create feed DsStream with { + "adapter-name" : "localfs", + "reader" : "localfs", + "parser" : "record-with-metadata", + "type-name" : "DataType", + "meta-type-name" : "MetaType", + "path" : "asterix_nc1://data/csv/people.csv", + "format" : "csv", + "delimiter" : ",", + "record-format" : "adm", + "record-index" : "1", + "key-indexes" : "0", + "key-indicators" : "1", + "header" : "false" +}; \ No newline at end of file diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.2.update.sqlpp similarity index 61% copy from asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.2.update.sqlpp index e1657ff..6d41058 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.2.update.sqlpp @@ -16,18 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.om.functions; -import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +use test; -/** - * A registry of {@link IFunctionDescriptor} and {@link IFunctionTypeInferer} - * for built-in functions - */ -public interface IFunctionManager { - - IFunctionDescriptor lookupFunction(FunctionIdentifier fid) throws AlgebricksException; - - IFunctionTypeInferer lookupFunctionTypeInferer(FunctionIdentifier fid); -} +set `wait-for-completion-feed` "true"; +connect feed DsStream to dataset DS; +start feed DsStream; \ No newline at end of file diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.3.query.sqlpp similarity index 61% copy from asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.3.query.sqlpp index e1657ff..b317302 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.3.query.sqlpp @@ -16,18 +16,16 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.om.functions; -import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; - -/** - * A registry of {@link IFunctionDescriptor} and {@link IFunctionTypeInferer} - * for built-in functions +/* + * Description: use of meta() after group by requires meta() be assigned to a variable in a LET clause + * Result : success */ -public interface IFunctionManager { - IFunctionDescriptor lookupFunction(FunctionIdentifier fid) throws AlgebricksException; +USE test; - IFunctionTypeInferer lookupFunctionTypeInferer(FunctionIdentifier fid); -} +FROM DS AS d +LET meta_id = meta().id +GROUP BY d.hobby AS hobby +SELECT hobby, COUNT(meta_id) AS count +ORDER BY hobby; \ No newline at end of file diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.4.query.sqlpp similarity index 61% copy from asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.4.query.sqlpp index e1657ff..bb016f7 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.4.query.sqlpp @@ -16,18 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.om.functions; -import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; - -/** - * A registry of {@link IFunctionDescriptor} and {@link IFunctionTypeInferer} - * for built-in functions +/* + * Description: use of meta() after group by requires meta() be assigned to a variable in a LET clause + * Result : failure */ -public interface IFunctionManager { - IFunctionDescriptor lookupFunction(FunctionIdentifier fid) throws AlgebricksException; +USE test; - IFunctionTypeInferer lookupFunctionTypeInferer(FunctionIdentifier fid); -} +FROM DS AS d +GROUP BY d.hobby AS hobby +SELECT hobby, COUNT(meta().id) +ORDER BY hobby; \ No newline at end of file diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.5.ddl.sqlpp similarity index 61% copy from asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.5.ddl.sqlpp index e1657ff..f12a2b7 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/meta/meta_after_gby/meta_after_gby.5.ddl.sqlpp @@ -16,18 +16,5 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.asterix.om.functions; -import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; - -/** - * A registry of {@link IFunctionDescriptor} and {@link IFunctionTypeInferer} - * for built-in functions - */ -public interface IFunctionManager { - - IFunctionDescriptor lookupFunction(FunctionIdentifier fid) throws AlgebricksException; - - IFunctionTypeInferer lookupFunctionTypeInferer(FunctionIdentifier fid); -} +drop dataverse test; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/meta/meta_after_gby/meta_after_gby.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/meta/meta_after_gby/meta_after_gby.3.adm new file mode 100644 index 0000000..bf1932c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/meta/meta_after_gby/meta_after_gby.3.adm @@ -0,0 +1,6 @@ +{ "hobby": "basketball", "count": 1 } +{ "hobby": "bowling", "count": 1 } +{ "hobby": "hiking", "count": 2 } +{ "hobby": "reading", "count": 2 } +{ "hobby": "soccer", "count": 1 } +{ "hobby": "tennis", "count": 2 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index 17f4aee..ccd8f5a 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -11358,6 +11358,12 @@ <output-dir compare="Text">resolving_pk_with_meta</output-dir> </compilation-unit> </test-case> + <test-case FilePath="meta"> + <compilation-unit name="meta_after_gby"> + <output-dir compare="Text">meta_after_gby</output-dir> + <expected-error>Compilation error: Inappropriate use of function 'meta'. For example, after GROUP BY (in line 29, at column 21)</expected-error> + </compilation-unit> + </test-case> </test-group> <test-group name="big-object"> <test-case FilePath="big-object"> diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java index b044293..06df020 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java @@ -192,7 +192,7 @@ public abstract class SecondaryCorrelatedTreeIndexOperationsHelper extends Secon IScalarEvaluatorFactory[] castEvalFact = new IScalarEvaluatorFactory[] { new ColumnAccessEvalFactory(recordIdx) }; IScalarEvaluatorFactory[] sefs = new IScalarEvaluatorFactory[1]; - sefs[0] = createCastFunction(strictCast).createEvaluatorFactory(castEvalFact); + sefs[0] = createCastFunction(strictCast, sourceLoc).createEvaluatorFactory(castEvalFact); AssignRuntimeFactory castAssign = new AssignRuntimeFactory(outColumns, sefs, projectionList); castAssign.setSourceLocation(sourceLoc); return new AlgebricksMetaOperatorDescriptor(spec, 1, 1, new IPushRuntimeFactory[] { castAssign }, diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java index 318814c..6bcc039 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java @@ -327,16 +327,16 @@ public abstract class SecondaryIndexOperationsHelper { IScalarEvaluatorFactory[] castEvalFact = new IScalarEvaluatorFactory[] { new ColumnAccessEvalFactory(recordIdx) }; IScalarEvaluatorFactory[] sefs = new IScalarEvaluatorFactory[1]; - sefs[0] = createCastFunction(strictCast).createEvaluatorFactory(castEvalFact); + sefs[0] = createCastFunction(strictCast, sourceLoc).createEvaluatorFactory(castEvalFact); AssignRuntimeFactory castAssign = new AssignRuntimeFactory(outColumns, sefs, projectionList); castAssign.setSourceLocation(sourceLoc); return new AlgebricksMetaOperatorDescriptor(spec, 1, 1, new IPushRuntimeFactory[] { castAssign }, new RecordDescriptor[] { enforcedRecDesc }); } - protected IFunctionDescriptor createCastFunction(boolean strictCast) throws AlgebricksException { + IFunctionDescriptor createCastFunction(boolean strictCast, SourceLocation sourceLoc) throws AlgebricksException { IFunctionDescriptor castFuncDesc = metadataProvider.getFunctionManager() - .lookupFunction(strictCast ? BuiltinFunctions.CAST_TYPE : BuiltinFunctions.CAST_TYPE_LAX); + .lookupFunction(strictCast ? BuiltinFunctions.CAST_TYPE : BuiltinFunctions.CAST_TYPE_LAX, sourceLoc); castFuncDesc.setSourceLocation(sourceLoc); castFuncDesc.setImmutableStates(enforcedItemType, itemType); return castFuncDesc; diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java index e1657ff..0d0b3c6 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionManager.java @@ -20,6 +20,7 @@ package org.apache.asterix.om.functions; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.SourceLocation; /** * A registry of {@link IFunctionDescriptor} and {@link IFunctionTypeInferer} @@ -27,7 +28,8 @@ import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; */ public interface IFunctionManager { - IFunctionDescriptor lookupFunction(FunctionIdentifier fid) throws AlgebricksException; + IFunctionDescriptor lookupFunction(FunctionIdentifier fid, SourceLocation sourceLocation) + throws AlgebricksException; IFunctionTypeInferer lookupFunctionTypeInferer(FunctionIdentifier fid); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java index 8b25e06..0db1821 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/formats/NonTaggedDataFormat.java @@ -141,7 +141,8 @@ public class NonTaggedDataFormat implements IDataFormat { } IScalarEvaluatorFactory fldIndexEvalFactory = new ConstantEvalFactory(Arrays.copyOf(abvs.getByteArray(), abvs.getLength())); - IFunctionDescriptor fDesc = functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_BY_INDEX); + IFunctionDescriptor fDesc = + functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_BY_INDEX, sourceLoc); fDesc.setSourceLocation(sourceLoc); fDesc.setImmutableStates(recType); return fDesc.createEvaluatorFactory( @@ -158,7 +159,8 @@ public class NonTaggedDataFormat implements IDataFormat { } IScalarEvaluatorFactory fldNameEvalFactory = new ConstantEvalFactory(Arrays.copyOf(abvs.getByteArray(), abvs.getLength())); - IFunctionDescriptor fDesc = functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_BY_NAME); + IFunctionDescriptor fDesc = + functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_BY_NAME, sourceLoc); fDesc.setSourceLocation(sourceLoc); return fDesc.createEvaluatorFactory( new IScalarEvaluatorFactory[] { recordEvalFactory, fldNameEvalFactory }); @@ -166,7 +168,7 @@ public class NonTaggedDataFormat implements IDataFormat { } if (fldName.size() > 1) { - IFunctionDescriptor fDesc = functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_NESTED); + IFunctionDescriptor fDesc = functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_NESTED, sourceLoc); fDesc.setSourceLocation(sourceLoc); fDesc.setImmutableStates(recType, fldName); return fDesc.createEvaluatorFactory(new IScalarEvaluatorFactory[] { recordEvalFactory }); @@ -241,7 +243,8 @@ public class NonTaggedDataFormat implements IDataFormat { } IScalarEvaluatorFactory fldIndexEvalFactory = new ConstantEvalFactory(Arrays.copyOf(abvs.getByteArray(), abvs.getLength())); - IFunctionDescriptor fDesc = functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_BY_INDEX); + IFunctionDescriptor fDesc = + functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_BY_INDEX, sourceLoc); fDesc.setSourceLocation(sourceLoc); fDesc.setImmutableStates(recType); IScalarEvaluatorFactory evalFactory = fDesc.createEvaluatorFactory( @@ -267,7 +270,7 @@ public class NonTaggedDataFormat implements IDataFormat { } catch (HyracksDataException e) { throw new AlgebricksException(e); } - IFunctionDescriptor fDesc = functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_NESTED); + IFunctionDescriptor fDesc = functionManager.lookupFunction(BuiltinFunctions.FIELD_ACCESS_NESTED, sourceLoc); fDesc.setSourceLocation(sourceLoc); fDesc.setImmutableStates(recType, fldName); IScalarEvaluatorFactory evalFactory = diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManager.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManager.java index d5a6559..7158558 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManager.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManager.java @@ -22,6 +22,9 @@ package org.apache.asterix.runtime.functions; import java.util.HashMap; import java.util.Map; +import org.apache.asterix.common.exceptions.AsterixException; +import org.apache.asterix.common.exceptions.ErrorCode; +import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.functions.IFunctionDescriptor; import org.apache.asterix.om.functions.IFunctionDescriptorFactory; import org.apache.asterix.om.functions.IFunctionManager; @@ -29,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionTypeInferer; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.algebricks.common.utils.Pair; import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.SourceLocation; /** * Default implementation of {@link IFunctionManager}. @@ -57,11 +61,15 @@ public final class FunctionManager implements IFunctionManager { } @Override - public IFunctionDescriptor lookupFunction(FunctionIdentifier fid) throws AlgebricksException { + public IFunctionDescriptor lookupFunction(FunctionIdentifier fid, SourceLocation src) throws AlgebricksException { Pair<FunctionIdentifier, Integer> key = new Pair<>(fid, fid.getArity()); IFunctionDescriptorFactory factory = functions.get(key); if (factory == null) { - throw new AlgebricksException("Inappropriate use of function " + "'" + fid.getName() + "'"); + String msg = "Inappropriate use of function '" + fid.getName() + "'"; + if (fid.equals(BuiltinFunctions.META)) { + msg = msg + ". For example, after GROUP BY"; + } + throw AsterixException.create(ErrorCode.COMPILATION_ERROR, src, msg); } return factory.createFunctionDescriptor(); }