blob: 3ee14593c53f9d9ee7c90cfa78448e9d245120d4 [file] [log] [blame]
/*
* 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.phoenix.expression;
import java.util.Map;
import org.apache.phoenix.expression.function.*;
import org.apache.phoenix.thirdparty.com.google.common.collect.Maps;
/**
*
* Enumeration of all Expression types that will be looked up. They may be evaluated on the server-side.
* Used during serialization and deserialization to pass Expression between client
* and server.
*
*
*
* @since 0.1
*/
// Important : When you want to add new Types make sure to add those towards the end, not changing the existing type's
// ordinal
public enum ExpressionType {
ReverseFunction(ReverseFunction.class),
RowKey(RowKeyColumnExpression.class),
KeyValue(KeyValueColumnExpression.class),
LiteralValue(LiteralExpression.class),
RoundFunction(RoundFunction.class),
FloorFunction(FloorFunction.class),
CeilFunction(CeilFunction.class),
RoundDateExpression(RoundDateExpression.class),
FloorDateExpression(FloorDateExpression.class),
CeilDateExpression(CeilDateExpression.class),
RoundTimestampExpression(RoundTimestampExpression.class),
CeilTimestampExpression(CeilTimestampExpression.class),
RoundDecimalExpression(RoundDecimalExpression.class),
FloorDecimalExpression(FloorDecimalExpression.class),
CeilDecimalExpression(CeilDecimalExpression.class),
TruncFunction(TruncFunction.class),
ToDateFunction(ToDateFunction.class),
ToCharFunction(ToCharFunction.class),
ToNumberFunction(ToNumberFunction.class),
CoerceFunction(CoerceExpression.class),
SubstrFunction(SubstrFunction.class),
AndExpression(AndExpression.class),
OrExpression(OrExpression.class),
ComparisonExpression(ComparisonExpression.class),
CountAggregateFunction(CountAggregateFunction.class),
SumAggregateFunction(SumAggregateFunction.class),
MinAggregateFunction(MinAggregateFunction.class),
MaxAggregateFunction(MaxAggregateFunction.class),
StringBasedLikeExpression(StringBasedLikeExpression.class),
NotExpression(NotExpression.class),
CaseExpression(CaseExpression.class),
InListExpression(InListExpression.class),
IsNullExpression(IsNullExpression.class),
LongSubtractExpression(LongSubtractExpression.class),
DateSubtractExpression(DateSubtractExpression.class),
DecimalSubtractExpression(DecimalSubtractExpression.class),
LongAddExpression(LongAddExpression.class),
DecimalAddExpression(DecimalAddExpression.class),
DateAddExpression(DateAddExpression.class),
LongMultiplyExpression(LongMultiplyExpression.class),
DecimalMultiplyExpression(DecimalMultiplyExpression.class),
LongDivideExpression(LongDivideExpression.class),
DecimalDivideExpression(DecimalDivideExpression.class),
CoalesceFunction(CoalesceFunction.class),
StringBasedRegexpReplaceFunction(StringBasedRegexpReplaceFunction.class),
SQLTypeNameFunction(SqlTypeNameFunction.class),
StringBasedRegexpSubstrFunction(StringBasedRegexpSubstrFunction.class),
StringConcatExpression(StringConcatExpression.class),
LengthFunction(LengthFunction.class),
LTrimFunction(LTrimFunction.class),
RTrimFunction(RTrimFunction.class),
UpperFunction(UpperFunction.class),
LowerFunction(LowerFunction.class),
TrimFunction(TrimFunction.class),
DistinctCountAggregateFunction(DistinctCountAggregateFunction.class),
PercentileContAggregateFunction(PercentileContAggregateFunction.class),
PercentRankAggregateFunction(PercentRankAggregateFunction.class),
StddevPopFunction(StddevPopFunction.class),
StddevSampFunction(StddevSampFunction.class),
PercentileDiscAggregateFunction(PercentileDiscAggregateFunction.class),
DoubleAddExpression(DoubleAddExpression.class),
DoubleSubtractExpression(DoubleSubtractExpression.class),
DoubleMultiplyExpression(DoubleMultiplyExpression.class),
DoubleDivideExpression(DoubleDivideExpression.class),
RowValueConstructorExpression(RowValueConstructorExpression.class),
MD5Function(MD5Function.class),
SQLTableTypeFunction(SQLTableTypeFunction.class),
IndexStateName(IndexStateNameFunction.class),
InvertFunction(InvertFunction.class),
ProjectedColumnExpression(ProjectedColumnExpression.class),
TimestampAddExpression(TimestampAddExpression.class),
TimestampSubtractExpression(TimestampSubtractExpression.class),
ArrayIndexFunction(ArrayIndexFunction.class),
ArrayLengthFunction(ArrayLengthFunction.class),
ArrayConstructorExpression(ArrayConstructorExpression.class),
SQLViewTypeFunction(SQLViewTypeFunction.class),
ExternalSqlTypeIdFunction(ExternalSqlTypeIdFunction.class),
ConvertTimezoneFunction(ConvertTimezoneFunction.class),
DecodeFunction(DecodeFunction.class),
TimezoneOffsetFunction(TimezoneOffsetFunction.class),
EncodeFunction(EncodeFunction.class),
LpadFunction(LpadFunction.class),
NthValueFunction(NthValueFunction.class),
FirstValueFunction(FirstValueFunction.class),
LastValueFunction(LastValueFunction.class),
ArrayAnyComparisonExpression(ArrayAnyComparisonExpression.class),
ArrayAllComparisonExpression(ArrayAllComparisonExpression.class),
InlineArrayElemRefExpression(ArrayElemRefExpression.class),
SQLIndexTypeFunction(SQLIndexTypeFunction.class),
ModulusExpression(ModulusExpression.class),
DistinctValueAggregateFunction(DistinctValueAggregateFunction.class),
StringBasedRegexpSplitFunction(StringBasedRegexpSplitFunction.class),
RandomFunction(RandomFunction.class),
ToTimeFunction(ToTimeFunction.class),
ToTimestampFunction(ToTimestampFunction.class),
ByteBasedLikeExpression(ByteBasedLikeExpression.class),
ByteBasedRegexpReplaceFunction(ByteBasedRegexpReplaceFunction.class),
ByteBasedRegexpSubstrFunction(ByteBasedRegexpSubstrFunction.class),
ByteBasedRegexpSplitFunction(ByteBasedRegexpSplitFunction.class),
LikeExpression(LikeExpression.class),
RegexpReplaceFunction(RegexpReplaceFunction.class),
RegexpSubstrFunction(RegexpSubstrFunction.class),
RegexpSplitFunction(RegexpSplitFunction.class),
SignFunction(SignFunction.class),
YearFunction(YearFunction.class),
MonthFunction(MonthFunction.class),
SecondFunction(SecondFunction.class),
WeekFunction(WeekFunction.class),
HourFunction(HourFunction.class),
NowFunction(NowFunction.class),
InstrFunction(InstrFunction.class),
MinuteFunction(MinuteFunction.class),
DayOfMonthFunction(DayOfMonthFunction.class),
ArrayAppendFunction(ArrayAppendFunction.class),
UDFExpression(UDFExpression.class),
ArrayPrependFunction(ArrayPrependFunction.class),
SqrtFunction(SqrtFunction.class),
AbsFunction(AbsFunction.class),
CbrtFunction(CbrtFunction.class),
LnFunction(LnFunction.class),
LogFunction(LogFunction.class),
ExpFunction(ExpFunction.class),
PowerFunction(PowerFunction.class),
ArrayConcatFunction(ArrayConcatFunction.class),
ArrayFillFunction(ArrayFillFunction.class),
ArrayToStringFunction(ArrayToStringFunction.class),
StringToArrayFunction(StringToArrayFunction.class),
GetByteFunction(GetByteFunction.class),
SetByteFunction(SetByteFunction.class),
GetBitFunction(GetBitFunction.class),
SetBitFunction(SetBitFunction.class),
OctetLengthFunction(OctetLengthFunction.class),
RoundWeekExpression(RoundWeekExpression.class),
RoundMonthExpression(RoundMonthExpression.class),
RoundYearExpression(RoundYearExpression.class),
FloorWeekExpression(FloorWeekExpression.class),
FloorMonthExpression(FloorMonthExpression.class),
FloorYearExpression(FloorYearExpression.class),
CeilWeekExpression(CeilWeekExpression.class),
CeilMonthExpression(CeilMonthExpression.class),
CeilYearExpression(CeilYearExpression.class),
DayOfWeekFunction(DayOfWeekFunction.class),
DayOfYearFunction(DayOfYearFunction.class),
DefaultValueExpression(DefaultValueExpression.class),
ArrayColumnExpression(SingleCellColumnExpression.class),
FirstValuesFunction(FirstValuesFunction.class),
LastValuesFunction(LastValuesFunction.class),
DistinctCountHyperLogLogAggregateFunction(DistinctCountHyperLogLogAggregateFunction.class),
CollationKeyFunction(CollationKeyFunction.class),
ArrayRemoveFunction(ArrayRemoveFunction.class),
TransactionProviderNameFunction(TransactionProviderNameFunction.class),
MathPIFunction(MathPIFunction.class),
SinFunction(SinFunction.class),
CosFunction(CosFunction.class),
TanFunction(TanFunction.class),
RowKeyBytesStringFunction(RowKeyBytesStringFunction.class),
PhoenixRowTimestampFunction(PhoenixRowTimestampFunction.class),
JsonValueFunction(JsonValueFunction.class),
JsonQueryFunction(JsonQueryFunction.class),
JsonExistsFunction(JsonExistsFunction.class)
;
ExpressionType(Class<? extends Expression> clazz) {
this.clazz = clazz;
}
public Class<? extends Expression> getExpressionClass() {
return clazz;
}
private final Class<? extends Expression> clazz;
private static final Map<Class<? extends Expression>,ExpressionType> classToEnumMap = Maps.newHashMapWithExpectedSize(3);
static {
for (ExpressionType type : ExpressionType.values()) {
classToEnumMap.put(type.clazz, type);
}
}
/**
* Return the ExpressionType for a given Expression instance
*/
public static ExpressionType valueOf(Expression expression) {
ExpressionType type = valueOfOrNull(expression);
if (type == null) { // FIXME: this exception gets swallowed and retries happen
throw new IllegalArgumentException("No ExpressionType for " + expression.getClass());
}
return type;
}
/**
* Return the ExpressionType for a given Expression instance
* or null if none exists.
*/
public static ExpressionType valueOfOrNull(Expression expression) {
Class <? extends Expression> clazz = expression.getClass();
// We will not have CorrelateVariableFieldAccessExpression on the server side,
// it will be evaluated at client side and will be serialized as
// LiteralExpression instead.
if (clazz == CorrelateVariableFieldAccessExpression.class) {
clazz = LiteralExpression.class;
}
return classToEnumMap.get(clazz);
}
/**
* Instantiates a DataAccessor based on its DataAccessorType
*/
public Expression newInstance() {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}