Repository: asterixdb
Updated Branches:
  refs/heads/master c80f53b6d -> e762ddfd8


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e762ddfd/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
new file mode 100644
index 0000000..c02732f
--- /dev/null
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -0,0 +1,746 @@
+/*
+ * 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.asterix.runtime.functions;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.common.utils.CodeGenHelper;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import 
org.apache.asterix.runtime.aggregates.collections.FirstElementAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.collections.ListifyAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.collections.LocalFirstElementAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarCountAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarMaxAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarMinAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarSqlAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarSqlCountAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarSqlMaxAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarSqlMinAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarSqlSumAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.scalar.ScalarSumAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableCountAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableGlobalAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableGlobalSqlAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableIntermediateAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableIntermediateSqlAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableLocalAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableLocalSqlAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableLocalSqlSumAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableLocalSumAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableSqlAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableSqlCountAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableSqlSumAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.serializable.std.SerializableSumAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.AvgAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.CountAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.GlobalAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.std.GlobalSqlAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.std.IntermediateAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.std.IntermediateSqlAvgAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.LocalAvgAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.LocalMaxAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.LocalMinAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.std.LocalSqlAvgAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.std.LocalSqlMaxAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.std.LocalSqlMinAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.std.LocalSqlSumAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.LocalSumAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.MaxAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.MinAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.SqlAvgAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.SqlCountAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.SqlMaxAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.SqlMinAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.SqlSumAggregateDescriptor;
+import org.apache.asterix.runtime.aggregates.std.SumAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.stream.EmptyStreamAggregateDescriptor;
+import 
org.apache.asterix.runtime.aggregates.stream.NonEmptyStreamAggregateDescriptor;
+import org.apache.asterix.runtime.evaluators.accessors.CircleCenterAccessor;
+import org.apache.asterix.runtime.evaluators.accessors.CircleRadiusAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.LineRectanglePolygonAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.PointXCoordinateAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.PointYCoordinateAccessor;
+import org.apache.asterix.runtime.evaluators.accessors.TemporalDayAccessor;
+import org.apache.asterix.runtime.evaluators.accessors.TemporalHourAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalEndAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalEndDateAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalEndDatetimeAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalEndTimeAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalStartAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalStartDateAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalStartDatetimeAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalIntervalStartTimeAccessor;
+import 
org.apache.asterix.runtime.evaluators.accessors.TemporalMillisecondAccessor;
+import org.apache.asterix.runtime.evaluators.accessors.TemporalMinuteAccessor;
+import org.apache.asterix.runtime.evaluators.accessors.TemporalMonthAccessor;
+import org.apache.asterix.runtime.evaluators.accessors.TemporalSecondAccessor;
+import org.apache.asterix.runtime.evaluators.accessors.TemporalYearAccessor;
+import org.apache.asterix.runtime.evaluators.comparisons.EqualsDescriptor;
+import org.apache.asterix.runtime.evaluators.comparisons.GreaterThanDescriptor;
+import 
org.apache.asterix.runtime.evaluators.comparisons.GreaterThanOrEqualsDescriptor;
+import org.apache.asterix.runtime.evaluators.comparisons.LessThanDescriptor;
+import 
org.apache.asterix.runtime.evaluators.comparisons.LessThanOrEqualsDescriptor;
+import org.apache.asterix.runtime.evaluators.comparisons.NotEqualsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ABinaryBase64StringConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ABinaryHexStringConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ABooleanConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ACircleConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ADateConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ADateTimeConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ADayTimeDurationConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ADoubleConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ADurationConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AFloatConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AInt16ConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AInt32ConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AInt64ConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AInt8ConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AIntervalConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AIntervalStartFromDateConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AIntervalStartFromDateTimeConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AIntervalStartFromTimeConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ALineConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.APoint3DConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.APointConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.APolygonConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ARectangleConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AStringConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ATimeConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AUUIDFromStringConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.AYearMonthDurationConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.ClosedRecordConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.OpenRecordConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.OrderedListConstructorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.constructors.UnorderedListConstructorDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.AndDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.AnyCollectionMemberDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CastTypeDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CastTypeLaxDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CheckUnknownDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.CodePointToStringDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.CountHashedGramTokensDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.CountHashedWordTokensDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CreateCircleDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CreateLineDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CreateMBRDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CreatePointDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CreatePolygonDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.CreateQueryUIDDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.CreateRectangleDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.CreateUUIDDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.DeepEqualityDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.EditDistanceCheckDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.EditDistanceContainsDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.EditDistanceDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.EditDistanceListIsFilterableDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.EditDistanceStringIsFilterableDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.FullTextContainsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.FullTextContainsWithoutOptionDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.GetItemDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.GramTokensDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.HashedGramTokensDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.HashedWordTokensDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IfMissingDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.IfMissingOrNullDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IfNullDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.InjectFailureDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsArrayDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsBooleanDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsMissingDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsNullDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsNumberDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsObjectDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsStringDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsSystemNullDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsUnknownDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.LenDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NotDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericACosDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericASinDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericATan2Descriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericATanDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericAbsDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericAddDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericCaretDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.NumericCeilingDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericCosDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericDivideDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericExpDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericFloorDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericLnDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericLogDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericModuloDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.NumericMultiplyDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericRoundDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.NumericRoundHalfToEven2Descriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.NumericRoundHalfToEvenDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericSignDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericSinDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericSqrtDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericSubDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericTanDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericTruncDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.NumericUnaryMinusDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.OrDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.PrefixLenJaccardDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardCheckDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardPrefixCheckDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardPrefixDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardSortedCheckDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardSortedDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.SleepDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.SpatialAreaDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.SpatialCellDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SpatialDistanceDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SpatialIntersectDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringConcatDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringContainsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringEndsWithDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringEqualDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringInitCapDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringJoinDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringLTrim2Descriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringLTrimDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringLengthDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringLikeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringLowerCaseDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringPositionDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringRTrim2Descriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringRTrimDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpContainsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpContainsWithFlagDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpLikeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpLikeWithFlagDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpPositionDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpPositionWithFlagDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpReplaceDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringRegExpReplaceWithFlagsDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringRepeatDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringSplitDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringStartsWithDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringToCodePointDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringTrim2Descriptor;
+import org.apache.asterix.runtime.evaluators.functions.StringTrimDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.StringUpperCaseDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.Substring2Descriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SubstringAfterDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.SubstringBeforeDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.SubstringDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.SwitchCaseDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.ToBigIntDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.ToBooleanDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.ToDoubleDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.ToStringDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.UUIDDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.WordTokensDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.BinaryConcatDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.BinaryLengthDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.FindBinaryDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.FindBinaryFromDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.ParseBinaryDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.PrintBinaryDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.SubBinaryFromDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.binary.SubBinaryFromToDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.FieldAccessByIndexDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.FieldAccessByNameDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.FieldAccessNestedDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.GetRecordFieldValueDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.GetRecordFieldsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.RecordAddFieldsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.RecordMergeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.RecordPairsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.records.RecordRemoveFieldsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.AdjustDateTimeForTimeZoneDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.AdjustTimeForTimeZoneDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.CalendarDuartionFromDateDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.CalendarDurationFromDateTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.CurrentDateDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.CurrentDateTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.CurrentTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DateFromDatetimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DateFromUnixTimeInDaysDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DatetimeFromDateAndTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DatetimeFromUnixTimeInMsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DatetimeFromUnixTimeInSecsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DayOfWeekDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DayTimeDurationGreaterThanComparatorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DayTimeDurationLessThanComparatorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DurationEqualDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DurationFromIntervalDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DurationFromMillisecondsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.DurationFromMonthsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.GetDayTimeDurationDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.GetOverlappingIntervalDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.GetYearMonthDurationDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalAfterDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalBeforeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalBinDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalCoveredByDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalCoversDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalEndedByDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalEndsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalMeetsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalMetByDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalOverlappedByDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalOverlapsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalStartedByDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.IntervalStartsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.MillisecondsFromDayTimeDurationDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.MonthsFromYearMonthDurationDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.OverlapBinsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.OverlapDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.ParseDateDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.ParseDateTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.ParseTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.PrintDateDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.PrintDateTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.PrintTimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.TimeFromDatetimeDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.TimeFromUnixTimeInMsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.UnixTimeFromDateInDaysDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.UnixTimeFromDatetimeInMsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.UnixTimeFromDatetimeInSecsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.UnixTimeFromTimeInMsDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.YearMonthDurationGreaterThanComparatorDescriptor;
+import 
org.apache.asterix.runtime.evaluators.functions.temporal.YearMonthDurationLessThanComparatorDescriptor;
+import 
org.apache.asterix.runtime.runningaggregates.std.TidRunningAggregateDescriptor;
+import org.apache.asterix.runtime.unnestingfunctions.std.RangeDescriptor;
+import 
org.apache.asterix.runtime.unnestingfunctions.std.ScanCollectionDescriptor;
+import 
org.apache.asterix.runtime.unnestingfunctions.std.SubsetCollectionDescriptor;
+
+/**
+ * This class (statically) holds a list of function descriptor factories.
+ */
+public final class FunctionCollection {
+
+    private static final String FACTORY = "FACTORY";
+    private static final List<IFunctionDescriptorFactory> temp = new 
ArrayList<>();
+
+    static {
+        // unnesting function
+        temp.add(TidRunningAggregateDescriptor.FACTORY);
+        temp.add(ScanCollectionDescriptor.FACTORY);
+        temp.add(RangeDescriptor.FACTORY);
+        temp.add(SubsetCollectionDescriptor.FACTORY);
+
+        // aggregate functions
+        temp.add(ListifyAggregateDescriptor.FACTORY);
+        temp.add(CountAggregateDescriptor.FACTORY);
+        temp.add(AvgAggregateDescriptor.FACTORY);
+        temp.add(LocalAvgAggregateDescriptor.FACTORY);
+        temp.add(IntermediateAvgAggregateDescriptor.FACTORY);
+        temp.add(GlobalAvgAggregateDescriptor.FACTORY);
+        temp.add(SumAggregateDescriptor.FACTORY);
+        temp.add(LocalSumAggregateDescriptor.FACTORY);
+        temp.add(MaxAggregateDescriptor.FACTORY);
+        temp.add(LocalMaxAggregateDescriptor.FACTORY);
+        temp.add(MinAggregateDescriptor.FACTORY);
+        temp.add(LocalMinAggregateDescriptor.FACTORY);
+        temp.add(FirstElementAggregateDescriptor.FACTORY);
+        temp.add(LocalFirstElementAggregateDescriptor.FACTORY);
+
+        // serializable aggregates
+        temp.add(SerializableCountAggregateDescriptor.FACTORY);
+        temp.add(SerializableAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableLocalAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableIntermediateAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableGlobalAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableSumAggregateDescriptor.FACTORY);
+        temp.add(SerializableLocalSumAggregateDescriptor.FACTORY);
+
+        // scalar aggregates
+        temp.add(ScalarCountAggregateDescriptor.FACTORY);
+        temp.add(ScalarAvgAggregateDescriptor.FACTORY);
+        temp.add(ScalarSumAggregateDescriptor.FACTORY);
+        temp.add(ScalarMaxAggregateDescriptor.FACTORY);
+        temp.add(ScalarMinAggregateDescriptor.FACTORY);
+        temp.add(EmptyStreamAggregateDescriptor.FACTORY);
+        temp.add(NonEmptyStreamAggregateDescriptor.FACTORY);
+
+        // SQL aggregates
+        temp.add(SqlCountAggregateDescriptor.FACTORY);
+        temp.add(SqlAvgAggregateDescriptor.FACTORY);
+        temp.add(LocalSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(IntermediateSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(GlobalSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(SqlSumAggregateDescriptor.FACTORY);
+        temp.add(LocalSqlSumAggregateDescriptor.FACTORY);
+        temp.add(SqlMaxAggregateDescriptor.FACTORY);
+        temp.add(LocalSqlMaxAggregateDescriptor.FACTORY);
+        temp.add(SqlMinAggregateDescriptor.FACTORY);
+        temp.add(LocalSqlMinAggregateDescriptor.FACTORY);
+
+        // SQL serializable aggregates
+        temp.add(SerializableSqlCountAggregateDescriptor.FACTORY);
+        temp.add(SerializableSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableLocalSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableIntermediateSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableGlobalSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(SerializableSqlSumAggregateDescriptor.FACTORY);
+        temp.add(SerializableLocalSqlSumAggregateDescriptor.FACTORY);
+
+        // SQL scalar aggregates
+        temp.add(ScalarSqlCountAggregateDescriptor.FACTORY);
+        temp.add(ScalarSqlAvgAggregateDescriptor.FACTORY);
+        temp.add(ScalarSqlSumAggregateDescriptor.FACTORY);
+        temp.add(ScalarSqlMaxAggregateDescriptor.FACTORY);
+        temp.add(ScalarSqlMinAggregateDescriptor.FACTORY);
+
+        // boolean functions
+        temp.add(AndDescriptor.FACTORY);
+        temp.add(OrDescriptor.FACTORY);
+
+        // Record constructors
+        temp.add(ClosedRecordConstructorDescriptor.FACTORY);
+        temp.add(OpenRecordConstructorDescriptor.FACTORY);
+
+        // List constructors
+        temp.add(OrderedListConstructorDescriptor.FACTORY);
+        temp.add(UnorderedListConstructorDescriptor.FACTORY);
+
+        // Sleep function
+        temp.add(SleepDescriptor.FACTORY);
+
+        // Inject failure function
+        temp.add(InjectFailureDescriptor.FACTORY);
+
+        // Switch case
+        temp.add(SwitchCaseDescriptor.FACTORY);
+
+        // null functions
+        temp.add(IsMissingDescriptor.FACTORY);
+        temp.add(IsNullDescriptor.FACTORY);
+        temp.add(IsUnknownDescriptor.FACTORY);
+        temp.add(IsSystemNullDescriptor.FACTORY);
+        temp.add(CheckUnknownDescriptor.FACTORY);
+        temp.add(IfMissingDescriptor.FACTORY);
+        temp.add(IfNullDescriptor.FACTORY);
+        temp.add(IfMissingOrNullDescriptor.FACTORY);
+
+        // uuid generators (zero independent functions)
+        temp.add(CreateUUIDDescriptor.FACTORY);
+        temp.add(UUIDDescriptor.FACTORY);
+        temp.add(CreateQueryUIDDescriptor.FACTORY);
+        temp.add(CurrentDateDescriptor.FACTORY);
+        temp.add(CurrentTimeDescriptor.FACTORY);
+        temp.add(CurrentDateTimeDescriptor.FACTORY);
+
+        // TODO: decide how should we deal these two weird functions as
+        // the number of arguments of the function depend on the first few 
arguments.
+        temp.add(SimilarityJaccardPrefixDescriptor.FACTORY);
+        temp.add(SimilarityJaccardPrefixCheckDescriptor.FACTORY);
+
+        // functions that need generated class for null-handling.
+        List<IFunctionDescriptorFactory> functionsToInjectUnkownHandling = new 
ArrayList<>();
+
+        // Element accessors.
+        
functionsToInjectUnkownHandling.add(FieldAccessByIndexDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(FieldAccessByNameDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(FieldAccessNestedDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AnyCollectionMemberDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(GetItemDescriptor.FACTORY);
+
+        // Numeric functions
+        
functionsToInjectUnkownHandling.add(NumericUnaryMinusDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericAddDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericDivideDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericMultiplyDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericSubDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericModuloDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericCaretDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NotDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(LenDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericAbsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericCeilingDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericFloorDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericRoundDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(NumericRoundHalfToEvenDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(NumericRoundHalfToEven2Descriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericACosDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericASinDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericATanDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericCosDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericSinDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericTanDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericExpDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericLnDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericLogDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericSqrtDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericSignDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericTruncDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NumericATan2Descriptor.FACTORY);
+
+        // Comparisons.
+        functionsToInjectUnkownHandling.add(EqualsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(GreaterThanDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(GreaterThanOrEqualsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(LessThanDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(LessThanOrEqualsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(NotEqualsDescriptor.FACTORY);
+
+        // Binary functions
+        functionsToInjectUnkownHandling.add(BinaryLengthDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ParseBinaryDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(PrintBinaryDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(BinaryConcatDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SubBinaryFromDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SubBinaryFromToDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(FindBinaryDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(FindBinaryFromDescriptor.FACTORY);
+
+        // String functions
+        functionsToInjectUnkownHandling.add(StringLikeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringContainsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringEndsWithDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringStartsWithDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SubstringDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringEqualDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringLowerCaseDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringUpperCaseDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringLengthDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(Substring2Descriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SubstringBeforeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SubstringAfterDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringToCodePointDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(CodePointToStringDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringConcatDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringJoinDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpContainsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpContainsWithFlagDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpLikeDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpLikeWithFlagDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpPositionDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpPositionWithFlagDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpReplaceDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(StringRegExpReplaceWithFlagsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringInitCapDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringTrimDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringLTrimDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringRTrimDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringTrim2Descriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringLTrim2Descriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringRTrim2Descriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringPositionDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringRepeatDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(StringSplitDescriptor.FACTORY);
+
+        // Constructors
+        
functionsToInjectUnkownHandling.add(ABooleanConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ABinaryHexStringConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ABinaryBase64StringConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AStringConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AInt8ConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AInt16ConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AInt32ConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AInt64ConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AFloatConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ADoubleConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(APointConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(APoint3DConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ALineConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(APolygonConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ACircleConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ARectangleConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ATimeConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ADateConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ADateTimeConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ADurationConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AYearMonthDurationConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(ADayTimeDurationConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AUUIDFromStringConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AIntervalConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AIntervalStartFromDateConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AIntervalStartFromDateTimeConstructorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AIntervalStartFromTimeConstructorDescriptor.FACTORY);
+
+        // Spatial
+        functionsToInjectUnkownHandling.add(CreatePointDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(CreateLineDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(CreatePolygonDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(CreateCircleDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(CreateRectangleDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SpatialAreaDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SpatialDistanceDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(SpatialIntersectDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(CreateMBRDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(SpatialCellDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(PointXCoordinateAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(PointYCoordinateAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(CircleRadiusAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(CircleCenterAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(LineRectanglePolygonAccessor.FACTORY);
+
+        // fuzzyjoin function
+        
functionsToInjectUnkownHandling.add(PrefixLenJaccardDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(WordTokensDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(HashedWordTokensDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(CountHashedWordTokensDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(GramTokensDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(HashedGramTokensDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(CountHashedGramTokensDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(EditDistanceDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(EditDistanceCheckDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(EditDistanceStringIsFilterableDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(EditDistanceListIsFilterableDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(EditDistanceContainsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(SimilarityJaccardDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(SimilarityJaccardCheckDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(SimilarityJaccardSortedDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(SimilarityJaccardSortedCheckDescriptor.FACTORY);
+
+        // full-text function
+        
functionsToInjectUnkownHandling.add(FullTextContainsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(FullTextContainsWithoutOptionDescriptor.FACTORY);
+
+        // Record functions.
+        functionsToInjectUnkownHandling.add(GetRecordFieldsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(GetRecordFieldValueDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(DeepEqualityDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(RecordMergeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(RecordAddFieldsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(RecordRemoveFieldsDescriptor.FACTORY);
+
+        // Spatial and temporal type accessors
+        functionsToInjectUnkownHandling.add(TemporalYearAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(TemporalMonthAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(TemporalDayAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(TemporalHourAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(TemporalMinuteAccessor.FACTORY);
+        functionsToInjectUnkownHandling.add(TemporalSecondAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalMillisecondAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalStartAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalEndAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalStartDateAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalEndDateAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalStartTimeAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalEndTimeAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalStartDatetimeAccessor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TemporalIntervalEndDatetimeAccessor.FACTORY);
+
+        // Temporal functions
+        
functionsToInjectUnkownHandling.add(UnixTimeFromDateInDaysDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(UnixTimeFromTimeInMsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(UnixTimeFromDatetimeInMsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(UnixTimeFromDatetimeInSecsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DateFromUnixTimeInDaysDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DateFromDatetimeDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TimeFromUnixTimeInMsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(TimeFromDatetimeDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DatetimeFromUnixTimeInMsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DatetimeFromUnixTimeInSecsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DatetimeFromDateAndTimeDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(CalendarDurationFromDateTimeDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(CalendarDuartionFromDateDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AdjustDateTimeForTimeZoneDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(AdjustTimeForTimeZoneDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalBeforeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalAfterDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalMeetsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalMetByDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(IntervalOverlapsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(IntervalOverlappedByDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(OverlapDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalStartsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(IntervalStartedByDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalCoversDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(IntervalCoveredByDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalEndsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalEndedByDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DurationFromMillisecondsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DurationFromMonthsDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(YearMonthDurationGreaterThanComparatorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(YearMonthDurationLessThanComparatorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DayTimeDurationGreaterThanComparatorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DayTimeDurationLessThanComparatorDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(MonthsFromYearMonthDurationDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(MillisecondsFromDayTimeDurationDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(DurationEqualDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(GetYearMonthDurationDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(GetDayTimeDurationDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IntervalBinDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(OverlapBinsDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(DayOfWeekDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ParseDateDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ParseTimeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ParseDateTimeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(PrintDateDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(PrintTimeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(PrintDateTimeDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(GetOverlappingIntervalDescriptor.FACTORY);
+        
functionsToInjectUnkownHandling.add(DurationFromIntervalDescriptor.FACTORY);
+
+        // Type functions.
+        functionsToInjectUnkownHandling.add(IsBooleanDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IsNumberDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IsStringDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IsArrayDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(IsObjectDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ToBooleanDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ToStringDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ToDoubleDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(ToBigIntDescriptor.FACTORY);
+
+        // Cast function
+        functionsToInjectUnkownHandling.add(CastTypeDescriptor.FACTORY);
+        functionsToInjectUnkownHandling.add(CastTypeLaxDescriptor.FACTORY);
+
+        // Record function
+        functionsToInjectUnkownHandling.add(RecordPairsDescriptor.FACTORY);
+
+        List<IFunctionDescriptorFactory> generatedFactories = new 
ArrayList<>();
+        for (IFunctionDescriptorFactory factory : 
functionsToInjectUnkownHandling) {
+            generatedFactories
+                    
.add(getGeneratedFunctionDescriptorFactory(factory.createFunctionDescriptor().getClass()));
+        }
+        temp.addAll(generatedFactories);
+    }
+
+    public static List<IFunctionDescriptorFactory> 
getFunctionDescriptorFactories() {
+        return temp;
+    }
+
+    /**
+     * Gets the generated function descriptor factory from an 
<code>IFunctionDescriptor</code>
+     * implementation class.
+     *
+     * @param cl,
+     *            the class of an <code>IFunctionDescriptor</code> 
implementation.
+     * @return the IFunctionDescriptorFactory instance defined in the class.
+     */
+    private static IFunctionDescriptorFactory 
getGeneratedFunctionDescriptorFactory(Class<?> cl) {
+        try {
+            String className = 
CodeGenHelper.getGeneratedClassName(cl.getName(),
+                    CodeGenHelper.DEFAULT_SUFFIX_FOR_GENERATED_CLASS);
+            Class<?> generatedCl = cl.getClassLoader().loadClass(className);
+            Field factory = generatedCl.getDeclaredField(FACTORY);
+            return (IFunctionDescriptorFactory) factory.get(null);
+        } catch (Exception e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private FunctionCollection() {
+    }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e762ddfd/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerHolder.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerHolder.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerHolder.java
new file mode 100644
index 0000000..52b61bb
--- /dev/null
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerHolder.java
@@ -0,0 +1,41 @@
+/*
+ * 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.asterix.runtime.functions;
+
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionManager;
+
+public final class FunctionManagerHolder {
+    private static final IFunctionManager functionManager = 
createFunctionManager();
+
+    public static IFunctionManager getFunctionManager() {
+        return functionManager;
+    }
+
+    private static IFunctionManager createFunctionManager() {
+        FunctionManagerImpl mgr = new FunctionManagerImpl();
+        for (IFunctionDescriptorFactory fdFactory : 
FunctionCollection.getFunctionDescriptorFactories()) {
+            mgr.registerFunction(fdFactory);
+        }
+        return mgr;
+    }
+
+    private FunctionManagerHolder() {
+    }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e762ddfd/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerImpl.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerImpl.java
new file mode 100644
index 0000000..4056955
--- /dev/null
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionManagerImpl.java
@@ -0,0 +1,68 @@
+/*
+ * 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.asterix.runtime.functions;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionManager;
+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;
+
+final class FunctionManagerImpl implements IFunctionManager {
+    private final Map<Pair<FunctionIdentifier, Integer>, 
IFunctionDescriptorFactory> functions;
+
+    FunctionManagerImpl() {
+        functions = new HashMap<>();
+    }
+
+    @Override
+    public synchronized IFunctionDescriptor lookupFunction(FunctionIdentifier 
fid) 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() + "'");
+        }
+        return factory.createFunctionDescriptor();
+    }
+
+    @Override
+    public synchronized void registerFunction(IFunctionDescriptorFactory 
descriptorFactory) {
+        FunctionIdentifier fid = 
descriptorFactory.createFunctionDescriptor().getIdentifier();
+        functions.put(new Pair<>(fid, fid.getArity()), descriptorFactory);
+    }
+
+    @Override
+    public synchronized void unregisterFunction(IFunctionDescriptorFactory 
descriptorFactory) {
+        FunctionIdentifier fid = 
descriptorFactory.createFunctionDescriptor().getIdentifier();
+        Pair<FunctionIdentifier, Integer> key = new Pair<>(fid, 
fid.getArity());
+        functions.remove(key);
+    }
+
+    @Override
+    public synchronized Iterator<IFunctionDescriptorFactory> iterator() {
+        return new ArrayList<>(functions.values()).iterator();
+    }
+}

Reply via email to