in fastmodel-core/src/main/java/com/aliyun/fastmodel/core/tree/statement/rule/strategy/StrategyUtil.java [89:138]
public static BaseFunction toFixedFunction(BaseExpression expression,
BaseDataType baseDataType) {
if (expression instanceof BaseFunction) {
return (BaseFunction)expression;
}
if (!(expression instanceof FunctionCall)) {
return null;
}
FunctionCall functionCall = (FunctionCall)expression;
QualifiedName funcName = functionCall.getFuncName();
String suffix = funcName.getSuffix();
try {
BaseFunctionName baseFunctionName = BaseFunctionName.valueOf(suffix.toUpperCase(Locale.ROOT));
if (baseFunctionName.isTableFunction()) {
return new TableFunction(baseFunctionName, functionCall.getArguments());
} else {
List<BaseExpression> arguments = functionCall.getArguments();
if (isEmpty(arguments)) {
return null;
}
BaseExpression baseExpression = arguments.get(0);
if (!(baseExpression instanceof TableOrColumn)) {
return null;
}
TableOrColumn tableOrColumn = (TableOrColumn)baseExpression;
if (baseFunctionName == BaseFunctionName.IN_TABLE) {
if (arguments.size() < WITHOUT_COLUMN_LENGTH || arguments.size() > WITH_COLUMN_LENGTH) {
//非法的格式
return null;
}
if (arguments.size() == WITHOUT_COLUMN_LENGTH) {
TableOrColumn tableOrColumn1 = (TableOrColumn)arguments.get(1);
return new InTableFunction(tableOrColumn.getQualifiedName(), tableOrColumn1.getQualifiedName(),
null);
} else if (arguments.size() == WITH_COLUMN_LENGTH) {
TableOrColumn tableOrColumn1 = (TableOrColumn)arguments.get(TABLE_INDEX);
TableOrColumn tableOrColumn2 = (TableOrColumn)arguments.get(MATCH_COLUMN_INDEX);
return new InTableFunction(tableOrColumn.getQualifiedName(), tableOrColumn1.getQualifiedName(),
new Identifier(tableOrColumn2.getQualifiedName().getSuffix()));
}
}
ColumnFunction columnFunction = new ColumnFunction(
baseFunctionName,
tableOrColumn, baseDataType);
return columnFunction;
}
} catch (IllegalArgumentException e) {
return null;
}
}