org.apache.calcite.rex.RexLiteral类的使用及代码示例

x33g5p2x  于2022-01-29 转载在 其他  
字(18.9k)|赞(0)|评价(0)|浏览(157)

本文整理了Java中org.apache.calcite.rex.RexLiteral类的一些代码示例,展示了RexLiteral类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven等平台,是从一些精选项目中提取出来的代码,具有较强的参考意义,能在一定程度帮忙到你。RexLiteral类的具体详情如下:
包路径:org.apache.calcite.rex.RexLiteral
类名称:RexLiteral

RexLiteral介绍

[英]Constant value in a row-expression.

There are several methods for creating literals in RexBuilder: RexBuilder#makeLiteral(boolean) and so forth.

How is the value stored? In that respect, the class is somewhat of a black box. There is a #getValue method which returns the value as an object, but the type of that value is implementation detail, and it is best that your code does not depend upon that knowledge. It is better to use task-oriented methods such as #getValue2 and #toJavaString.

The allowable types and combinations are:
Allowable types for RexLiteral instancesTypeNameMeaningValue typeSqlTypeName#NULLThe null value. It has its own special type.nullSqlTypeName#BOOLEANBoolean, namely TRUE, FALSE or UNKNOWN.Boolean, or null represents the UNKNOWN valueSqlTypeName#DECIMALExact number, for example 0, -.5, 12345.BigDecimalSqlTypeName#DOUBLEApproximate number, for example 6.023E-23.BigDecimalSqlTypeName#DATEDate, for example DATE '1969-04'29'Calendar; also Calendar (UTC time zone) and Integer (days since POSIX epoch)SqlTypeName#TIMETime, for example TIME '18:37:42.567'Calendar; also Calendar (UTC time zone) and Integer (milliseconds since midnight)SqlTypeName#TIMESTAMPTimestamp, for example TIMESTAMP '1969-04-29 18:37:42.567'TimestampString; also Calendar (UTC time zone) and Long (milliseconds since POSIX epoch)SqlTypeName#INTERVAL_DAY, SqlTypeName#INTERVAL_DAY_HOUR, SqlTypeName#INTERVAL_DAY_MINUTE, SqlTypeName#INTERVAL_DAY_SECOND, SqlTypeName#INTERVAL_HOUR, SqlTypeName#INTERVAL_HOUR_MINUTE, SqlTypeName#INTERVAL_HOUR_SECOND, SqlTypeName#INTERVAL_MINUTE, SqlTypeName#INTERVAL_MINUTE_SECOND, SqlTypeName#INTERVAL_SECONDInterval, for example INTERVAL '4:3:2' HOUR TO SECONDBigDecimal; also Long (milliseconds)SqlTypeName#INTERVAL_YEAR, SqlTypeName#INTERVAL_YEAR_MONTH, SqlTypeName#INTERVAL_MONTHInterval, for example INTERVAL '2-3' YEAR TO MONTHBigDecimal; also Integer (months)SqlTypeName#CHARCharacter constant, for example 'Hello, world!', '', _N'Bonjour', _ISO-8859-1'It''s superman!' COLLATE SHIFT_JIS$ja_JP$2. These are always CHAR, never VARCHAR.NlsString; also StringSqlTypeName#BINARYBinary constant, for example X'7F34'. (The number of hexits must be even; see above.) These constants are always BINARY, never VARBINARY.ByteBuffer; also byte[]SqlTypeName#SYMBOLA symbol is a special type used to make parsing easier; it is not part of the SQL standard, and is not exposed to end-users. It is used to hold a flag, such as the LEADING flag in a call to the function TRIM([LEADING|TRAILING|BOTH] chars FROM string).An enum class
[中]行表达式中的常量值。
在RexBuilder中创建文字有几种方法:RexBuilder#makeLiteral(布尔值)等等。
价值是如何存储的?在这方面,这个班有点像一个黑匣子。有一个#getValue方法,它将值作为对象返回,但该值的类型是实现细节,最好代码不依赖于这些知识。最好使用面向任务的方法,如#getValue2和#toJavaString。
允许的类型和组合为:
RexLiteral instancesTypeNameMeaningValue typeSqlTypeName#null允许的类型空值。它有自己的特殊类型。nullSqlTypeName#BOOLEANBoolean,即TRUEFALSEUNKNOWN。布尔值或null表示未知值SqlTypeName#十进制数,例如0-.512345。BigDecimalSqlTypeName#Double近似数,例如[$6$]。BigDecimalSqlTypeName#DATEDate,例如DATE '1969-04'29'日历;还有日历(UTC时区)和整数(自POSIX历元起的天数)SqlTypeName#TIMETime,例如TIME '18:37:42.567'日历;还有日历(UTC时区)和整数(午夜后的毫秒)SqlTypeName#Timestamp,例如TIMESTAMP '1969-04-29 18:37:42.567'TimestampString;还有日历(UTC时区)和长时间(从POSIX epoch开始的毫秒数)SqlTypeName#INTERVAL_DAY,SqlTypeName#INTERVAL_DAY_HOUR,SqlTypeName#INTERVAL_DAY_MINUTE,SqlTypeName#INTERVAL_HOUR,SqlTypeName#INTERVAL_HOUR_MINUTE,SqlTypeName#INTERVAL_HOUR_SECOND,SqlTypeName#INTERVAL MINUTE SECOND,SqlTypeName#INTERVAL SECONDInterval,例如INTERVAL '4:3:2' HOUR TO SECONDBigDecimal;还有长(毫秒)SqlTypeName#INTERVAL#YEAR,SqlTypeName#INTERVAL#YEAR#MONTH,SqlTypeName#INTERVAL#MONTHInterval,例如INTERVAL '2-3' YEAR TO MONTHBigDecimal;还有整数(月份)SqlTypeName#字符常量,例如'Hello, world!'''_N'Bonjour'_ISO-8859-1'It''s superman!' COLLATE SHIFT_JIS$ja_JP$2。这些都是CHAR,而不是VARCHAR。NlsString;还有StringSqlTypeName#BINARYBinary常量,例如[$16$]。(十六进制数必须为偶数;请参见上文。)这些常数总是二进制的,而不是变量二进制的。拜特布弗;字节[]SqlTypeName#SYMBOLA symbol是一种特殊类型,用于简化解析;它不是SQL标准的一部分,也不向最终用户公开。它用于保存一个标志,例如对函数TRIM([LEADING|TRAILING|BOTH] chars FROM string)的调用中的前导标志。枚举类

代码示例

代码示例来源:origin: apache/kylin

private CaseTupleExpression getCaseTupleExpression(RexCall call) {
  List<Pair<TupleFilter, TupleExpression>> whenList = Lists
      .newArrayListWithExpectedSize(call.operands.size() / 2);
  TupleExpression elseExpr = null;
  for (int i = 0; i < call.operands.size() - 1; i += 2) {
    if (call.operands.get(i) instanceof RexCall) {
      RexCall whenCall = (RexCall) call.operands.get(i);
      CompareTupleFilter.CompareResultType compareResultType = RexUtil.getCompareResultType(whenCall);
      if (compareResultType == CompareTupleFilter.CompareResultType.AlwaysTrue) {
        elseExpr = call.operands.get(i + 1).accept(this);
        break;
      } else if (compareResultType == CompareTupleFilter.CompareResultType.AlwaysFalse) {
        continue;
      TupleFilter whenFilter = whenCall.accept(filterVistor);
      whenFilter = new FilterOptimizeTransformer().transform(whenFilter);
      TupleExpression thenExpr = call.operands.get(i + 1).accept(this);
      whenList.add(new Pair<>(whenFilter, thenExpr));
  if (elseExpr == null && call.operands.size() % 2 == 1) {
    RexNode elseNode = call.operands.get(call.operands.size() - 1);
    if (!(elseNode instanceof RexLiteral && ((RexLiteral) elseNode).getValue() == null)) {
      elseExpr = elseNode.accept(this);
  tuple.setDigest(call.toString());
  return tuple;

代码示例来源:origin: apache/kylin

private TupleFilter dealWithTrivialExpr(RexCall call) {
  ImmutableList<RexNode> operators = call.operands;
  if (operators.size() != 2) {
    return null;
    if (temp.getType().getFamily() != SqlTypeFamily.NUMERIC || !(temp.getValue() instanceof BigDecimal)) {
      return null;// only numeric constants now
      left = (BigDecimal) temp.getValue();
    } else {
      right = (BigDecimal) temp.getValue();

代码示例来源:origin: apache/drill

RexLiteral pattern = null, escape = null;
String patternStr = null, escapeStr = null;
if (condition.getOperands().size() == 2) {
 if (pattern.getTypeName() == SqlTypeName.DECIMAL ||
   pattern.getTypeName() == SqlTypeName.INTEGER) {
  patternStr = pattern.getValue().toString();
 } else if (pattern.getTypeName() == SqlTypeName.CHAR) {
  patternStr = pattern.getValue2().toString();
  if (op.getKind() == SqlKind.LITERAL) {
 if (pattern.getTypeName() == SqlTypeName.DECIMAL ||
   pattern.getTypeName() == SqlTypeName.INTEGER) {
  patternStr = pattern.getValue().toString();
 } else if (pattern.getTypeName() == SqlTypeName.CHAR) {
  patternStr = pattern.getValue2().toString();
 if (escape.getTypeName() == SqlTypeName.DECIMAL ||
   escape.getTypeName() == SqlTypeName.INTEGER) {
  escapeStr = escape.getValue().toString();
 } else if (escape.getTypeName() == SqlTypeName.CHAR) {
  escapeStr = escape.getValue2().toString();
    return builder.makeCall(SqlStdOperatorTable.EQUALS, arg, pattern);

代码示例来源:origin: apache/hive

BigDecimal maxVal = new BigDecimal(max.floatValue());
BigDecimal minVal = new BigDecimal(min.floatValue());
RexLiteral maxLiteral = rexBuilder.makeExactLiteral(maxVal, literal.getType());
RexLiteral minLiteral = rexBuilder.makeExactLiteral(minVal, literal.getType());
 if (minLiteral.getValue().compareTo(literal.getValue()) > 0 ||
     maxLiteral.getValue().compareTo(literal.getValue()) < 0) {
  return rexBuilder.makeLiteral(false);
 if (minLiteral.getValue().compareTo(literal.getValue()) > 0) {
  return rexBuilder.makeLiteral(true);
 } else if (maxLiteral.getValue().compareTo(literal.getValue()) <= 0) {
  return rexBuilder.makeLiteral(false);
 if (minLiteral.getValue().compareTo(literal.getValue()) >= 0) {
  return rexBuilder.makeLiteral(true);
 } else if (maxLiteral.getValue().compareTo(literal.getValue()) < 0) {
  return rexBuilder.makeLiteral(false);
 if (minLiteral.getValue().compareTo(literal.getValue()) >= 0) {
  return rexBuilder.makeLiteral(false);
 } else if (maxLiteral.getValue().compareTo(literal.getValue()) < 0) {
  return rexBuilder.makeLiteral(true);
 if (minLiteral.getValue().compareTo(literal.getValue()) > 0) {
  return rexBuilder.makeLiteral(false);
 } else if (maxLiteral.getValue().compareTo(literal.getValue()) <= 0) {
  return rexBuilder.makeLiteral(true);

代码示例来源:origin: apache/incubator-druid

@Override
 public DruidExpression toDruidExpression(
   final PlannerContext plannerContext,
   final RowSignature rowSignature,
   final RexNode rexNode
 )
 {
  final RexCall call = (RexCall) rexNode;
  final RexNode timeArg = call.getOperands().get(0);
  final DruidExpression timeExpression = Expressions.toDruidExpression(plannerContext, rowSignature, timeArg);
  if (timeExpression == null) {
   return null;
  }

  final TimestampExtractExprMacro.Unit unit = TimestampExtractExprMacro.Unit.valueOf(
    StringUtils.toUpperCase(RexLiteral.stringValue(call.getOperands().get(1)))
  );

  final DateTimeZone timeZone = call.getOperands().size() > 2 && !RexLiteral.isNullLiteral(call.getOperands().get(2))
                 ? DateTimes.inferTzFromString(RexLiteral.stringValue(call.getOperands().get(2)))
                 : plannerContext.getTimeZone();

  return applyTimeExtract(timeExpression, unit, timeZone);
 }
}

代码示例来源:origin: apache/incubator-druid

final RexNode timeArg = call.getOperands().get(0);
final DruidExpression timeExpression = Expressions.toDruidExpression(plannerContext, rowSignature, timeArg);
if (timeExpression == null) {
final String pattern = call.getOperands().size() > 1 && !RexLiteral.isNullLiteral(call.getOperands().get(1))
            ? RexLiteral.stringValue(call.getOperands().get(1))
            : "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";
final DateTimeZone timeZone = call.getOperands().size() > 2 && !RexLiteral.isNullLiteral(call.getOperands().get(2))
               ? DateTimes.inferTzFromString(RexLiteral.stringValue(call.getOperands().get(2)))
               : plannerContext.getTimeZone();
  ImmutableList.of(
    timeExpression.getExpression(),
    DruidExpression.stringLiteral(pattern),
    DruidExpression.stringLiteral(timeZone.getID())
  ).stream().map(DruidExpression::fromExpression).collect(Collectors.toList())
);

代码示例来源:origin: Qihoo360/Quicksql

private RexNode simplifyCast(RexCall e) {
 final RexNode operand = e.getOperands().get(0);
 switch (operand.getKind()) {
 case LITERAL:
  final RexLiteral literal = (RexLiteral) operand;
  final Comparable value = literal.getValueAs(Comparable.class);
  final SqlTypeName typeName = literal.getTypeName();
  if (rexBuilder.canRemoveCastFromLiteral(e.getType(), value, typeName)) {
   return rexBuilder.makeCast(e.getType(), operand);
  switch (literal.getTypeName()) {
  case TIME:
   switch (e.getType().getSqlTypeName()) {
   case TIMESTAMP:
    return e;
  executor.reduce(rexBuilder, ImmutableList.of(e), reducedValues);
  return Objects.requireNonNull(
    Iterables.getOnlyElement(reducedValues));
 default:
  if (operand.getType().equals(e.getType())) {
   return simplify(operand, UNKNOWN);

代码示例来源:origin: Qihoo360/Quicksql

public List<Double> averageColumnSizes(Values rel, RelMetadataQuery mq) {
 final List<RelDataTypeField> fields = rel.getRowType().getFieldList();
 final ImmutableList.Builder<Double> list = ImmutableList.builder();
 for (int i = 0; i < fields.size(); i++) {
  RelDataTypeField field = fields.get(i);
  double d;
  if (rel.getTuples().isEmpty()) {
   d = averageTypeValueSize(field.getType());
  } else {
   d = 0;
   for (ImmutableList<RexLiteral> literals : rel.getTuples()) {
    d += typeValueSize(field.getType(),
      literals.get(i).getValueAs(Comparable.class));
   }
   d /= rel.getTuples().size();
  }
  list.add(d);
 }
 return list.build();
}

代码示例来源:origin: apache/incubator-druid

newCasts.add(rexBuilder.makeInputRef(project.getChildExps().get(fieldNumber).getType(), fieldNumber));
  final boolean flip = RexLiteral.isNullLiteral(caseCall.getOperands().get(1))
             && !RexLiteral.isNullLiteral(caseCall.getOperands().get(2));
  final RexNode arg1 = caseCall.getOperands().get(flip ? 2 : 1);
   if (aggregateCall.getAggregation().getKind() == SqlKind.COUNT && RexLiteral.isNullLiteral(arg2)) {
    newProjects.add(arg1);
    newProjects.add(filter);
     && arg1.isA(SqlKind.LITERAL)
     && !RexLiteral.isNullLiteral(arg1)
     && RexLiteral.isNullLiteral(arg2)) {
    );
   } else if (aggregateCall.getAggregation().getKind() == SqlKind.SUM
         && Calcites.isIntLiteral(arg1) && RexLiteral.intValue(arg1) == 1
         && Calcites.isIntLiteral(arg2) && RexLiteral.intValue(arg2) == 0) {
      aggregateCall.getName()
    );
   } else if (RexLiteral.isNullLiteral(arg2) /* Case A1 */
         || (aggregateCall.getAggregation().getKind() == SqlKind.SUM
           && Calcites.isIntLiteral(arg2)
           && RexLiteral.intValue(arg2) == 0) /* Case A2 */) {
    newProjects.add(arg1);
    newProjects.add(filter);

代码示例来源:origin: apache/hive

final Sort sort = call.rel(1);
final int count = sort.getInput().getRowType().getFieldCount();
if (count == 1) {
Map<RexNode, RexNode> constants = new HashMap<>();
for (int i = 0; i < count ; i++) {
 RexNode expr = rexBuilder.makeInputRef(sort.getInput(), i);
 if (conditionsExtracted.containsKey(expr)) {
  constants.put(expr, conditionsExtracted.get(expr));
topChildExprs = ImmutableList.copyOf(RexUtil.apply(mapping, topChildExprs));
final ImmutableList<RexNode> sortFields =
    relBuilder.fields(RelCollations.of(fieldCollations));
relBuilder.sortLimit(sort.offset == null ? -1 : RexLiteral.intValue(sort.offset),
    sort.fetch == null ? -1 : RexLiteral.intValue(sort.fetch), sortFields);

代码示例来源:origin: org.apache.calcite/calcite-core

@Test public void testConstant() throws Exception {
 check((rexBuilder, executor) -> {
  final List<RexNode> reducedValues = new ArrayList<>();
  final RexLiteral ten = rexBuilder.makeExactLiteral(BigDecimal.TEN);
  executor.reduce(rexBuilder, ImmutableList.of(ten),
    reducedValues);
  assertThat(reducedValues.size(), equalTo(1));
  assertThat(reducedValues.get(0), instanceOf(RexLiteral.class));
  assertThat(((RexLiteral) reducedValues.get(0)).getValue2(),
    equalTo((Object) 10L));
 });
}

代码示例来源:origin: Qihoo360/Quicksql

@Override public RelDataType get(int index) {
 return index < childFieldCount
   ? childRowType.getFieldList().get(index).getType()
   : constants.get(index - childFieldCount).getType();
}

代码示例来源:origin: org.apache.calcite/calcite-core

boolean isExtractCall(RexNode e) {
 switch (e.getKind()) {
 case EXTRACT:
  final RexCall call = (RexCall) e;
  final RexLiteral flag = (RexLiteral) call.operands.get(0);
  final TimeUnitRange timeUnit = (TimeUnitRange) flag.getValue();
  return timeUnit == this.timeUnit;
 default:
  return false;
 }
}

代码示例来源:origin: apache/hive

Operator<?> inputOp = inputOpAf.inputs.get(0);
Operator<?> resultOp = inputOpAf.inputs.get(0);
 int limit = RexLiteral.intValue(sortRel.fetch);
 int offset = sortRel.offset == null ? 0 : RexLiteral.intValue(sortRel.offset);
 LimitDesc limitDesc = new LimitDesc(offset,limit);
 ArrayList<ColumnInfo> cinfoLst = createColInfos(resultOp);

代码示例来源:origin: org.apache.kylin/atopcalcite

return null;
RelDataTypeField field = rowType.getFieldList().get(iField);
RelDataType type = field.getType();
if (type.isStruct()) {
 assert literalExpr.isA(SqlKind.CAST);
 RexNode child = ((RexCall) literalExpr).getOperands().get(0);
 assert RexLiteral.isNullLiteral(child);
Comparable value = literal.getValue();
   NumberUtil.rescaleBigDecimal(
     (BigDecimal) value,
     type.getScale());
 return rexBuilder.makeExactLiteral(
   roundedValue,
   type);
 return rexBuilder.makeCharLiteral(
   new NlsString(
     Spaces.padRight(unpadded.getValue(), type.getPrecision()),

代码示例来源:origin: apache/drill

@Override
public ExprNodeDesc visitLiteral(RexLiteral literal) {
 RelDataType lType = literal.getType();
 if (RexLiteral.value(literal) == null) {
  switch (literal.getType().getSqlTypeName()) {
  case BOOLEAN:
   return new ExprNodeConstantDesc(TypeInfoFactory.booleanTypeInfo, null);
  switch (literal.getType().getSqlTypeName()) {
  case BOOLEAN:
   return new ExprNodeConstantDesc(TypeInfoFactory.booleanTypeInfo, Boolean.valueOf(RexLiteral
     .booleanValue(literal)));
  case TINYINT:
   return new ExprNodeConstantDesc(TypeInfoFactory.byteTypeInfo, Byte.valueOf(((Number) literal
     .getValue3()).byteValue()));
  case SMALLINT:
   return new ExprNodeConstantDesc(TypeInfoFactory.shortTypeInfo,
     Short.valueOf(((Number) literal.getValue3()).shortValue()));
  case INTEGER:
   return new ExprNodeConstantDesc(TypeInfoFactory.intTypeInfo,
     Integer.valueOf(((Number) literal.getValue3()).intValue()));
  case BIGINT:
   return new ExprNodeConstantDesc(TypeInfoFactory.longTypeInfo, Long.valueOf(((Number) literal
     .getValue3()).longValue()));
  case FLOAT:
  case REAL:
   return new ExprNodeConstantDesc(TypeInfoFactory.floatTypeInfo,
     Float.valueOf(((Number) literal.getValue3()).floatValue()));
  case DOUBLE:

代码示例来源:origin: apache/incubator-druid

final SqlKind kind = rexNode.getKind();
final SqlTypeName sqlTypeName = rexNode.getType().getSqlTypeName();
 final SqlOperator operator = ((RexCall) rexNode).getOperator();
 if (RexLiteral.isNullLiteral(rexNode)) {
  return DruidExpression.fromExpression(DruidExpression.nullLiteral());
 } else if (SqlTypeName.NUMERIC_TYPES.contains(sqlTypeName)) {
  return DruidExpression.fromExpression(DruidExpression.numberLiteral((Number) RexLiteral.value(rexNode)));
 } else if (SqlTypeFamily.INTERVAL_DAY_TIME == sqlTypeName.getFamily()) {
  final long milliseconds = ((Number) RexLiteral.value(rexNode)).longValue();
  return DruidExpression.fromExpression(DruidExpression.numberLiteral(milliseconds));
 } else if (SqlTypeFamily.INTERVAL_YEAR_MONTH == sqlTypeName.getFamily()) {
  final long months = ((Number) RexLiteral.value(rexNode)).longValue();
  return DruidExpression.fromExpression(DruidExpression.numberLiteral(months));
 } else if (SqlTypeName.STRING_TYPES.contains(sqlTypeName)) {
  return DruidExpression.fromExpression(DruidExpression.stringLiteral(RexLiteral.stringValue(rexNode)));
 } else if (SqlTypeName.TIMESTAMP == sqlTypeName || SqlTypeName.DATE == sqlTypeName) {
  if (RexLiteral.isNullLiteral(rexNode)) {
   return DruidExpression.fromExpression(DruidExpression.nullLiteral());
  } else {
  return DruidExpression.fromExpression(DruidExpression.numberLiteral(RexLiteral.booleanValue(rexNode) ? 1 : 0));
 } else {

代码示例来源:origin: Qihoo360/Quicksql

public Double averageRexSize(RexNode node, List<Double> inputColumnSizes) {
  switch (node.getKind()) {
  case INPUT_REF:
   return inputColumnSizes.get(((RexInputRef) node).getIndex());
  case LITERAL:
   return typeValueSize(node.getType(),
     ((RexLiteral) node).getValueAs(Comparable.class));
  default:
   if (node instanceof RexCall) {
    RexCall call = (RexCall) node;
    for (RexNode operand : call.getOperands()) {
     // It's a reasonable assumption that a function's result will have
     // similar size to its argument of a similar type. For example,
     // UPPER(c) has the same average size as c.
     if (operand.getType().getSqlTypeName()
       == node.getType().getSqlTypeName()) {
      return averageRexSize(operand, inputColumnSizes);
     }
    }
   }
   return averageTypeValueSize(node.getType());
  }
 }
}

代码示例来源:origin: apache/hive

Mapping m = Mappings.create(MappingType.PARTIAL_FUNCTION, child.getRowType().getFieldCount(),
  project.getRowType().getFieldCount());
  int sIdx = ((RexInputRef) o.e).getIndex();
  m.set(sIdx, o.i);
  inpIndxToOutIndxMap.put(sIdx, o.i);
 ImmutableBitSet rCols = RelOptUtil.InputFinder.bits(r);
 if (columnsMapped.contains(rCols)) {
  r = r.accept(new RexPermuteInputsShuttle(m, child));
  projectPullUpPredicates.add(r);
 if (RexLiteral.isNullLiteral(expr.e)) {
  projectPullUpPredicates.add(rexBuilder.makeCall(SqlStdOperatorTable.IS_NULL,
    rexBuilder.makeInputRef(project, expr.i)));
 } else if (expr.e instanceof RexLiteral) {
  final RexLiteral literal = (RexLiteral) expr.e;
  projectPullUpPredicates.add(rexBuilder.makeCall(SqlStdOperatorTable.EQUALS,
    rexBuilder.makeInputRef(project, expr.i), literal));
 } else if (expr.e instanceof RexCall && HiveCalciteUtil.isDeterministicFuncOnLiterals(expr.e)) {

代码示例来源:origin: apache/hive

/** Infers the alias of an expression.
 *
 * <p>If the expression was created by {@link #alias}, replaces the expression
 * in the project list.
 */
private String inferAlias(List<RexNode> exprList, RexNode expr) {
 switch (expr.getKind()) {
 case INPUT_REF:
  final RexInputRef ref = (RexInputRef) expr;
  return peek(0).getRowType().getFieldNames().get(ref.getIndex());
 case CAST:
  return inferAlias(exprList, ((RexCall) expr).getOperands().get(0));
 case AS:
  final RexCall call = (RexCall) expr;
  for (;;) {
   final int i = exprList.indexOf(expr);
   if (i < 0) {
    break;
   }
   exprList.set(i, call.getOperands().get(0));
  }
  return ((NlsString) ((RexLiteral) call.getOperands().get(1)).getValue())
    .getValue();
 default:
  return null;
 }
}

相关文章