@Override protected Expression implementNotNullResult( WinAggContext info, WinAggResultContext result) { // Window cannot be empty since ROWS/RANGE is not possible for ROW_NUMBER return Expressions.add( Expressions.subtract(result.index(), result.startIndex()), Expressions.constant(1)); } }
@Override protected Expression implementNotNullResult( WinAggContext info, WinAggResultContext result) { // Window cannot be empty since ROWS/RANGE is not possible for ROW_NUMBER return Expressions.add( Expressions.subtract(result.index(), result.startIndex()), Expressions.constant(1)); } }
protected Expression computeNewRank(Expression acc, WinAggAddContext add) { Expression pos = add.currentPosition(); if (!add.startIndex().equals(Expressions.constant(0))) { // In general, currentPosition-startIndex should be used // However, rank/dense_rank does not allow preceding/following clause // so we always result in startIndex==0. pos = Expressions.subtract(pos, add.startIndex()); } return pos; }
protected Expression computeNewRank(Expression acc, WinAggAddContext add) { Expression pos = add.currentPosition(); if (!add.startIndex().equals(Expressions.constant(0))) { // In general, currentPosition-startIndex should be used // However, rank/dense_rank does not allow preceding/following clause // so we always result in startIndex==0. pos = Expressions.subtract(pos, add.startIndex()); } return pos; }
public Expression implementResult(AggContext info, AggResultContext result) { WinAggResultContext winResult = (WinAggResultContext) result; List<RexNode> rexArgs = winResult.rexArguments(); Expression tiles = winResult.rowTranslator(winResult.index()).translate( rexArgs.get(0), int.class); Expression ntile = Expressions.add(Expressions.constant(1), Expressions.divide( Expressions.multiply( tiles, Expressions.subtract( winResult.index(), winResult.startIndex())), winResult.getPartitionRowCount())); return ntile; } }
public Expression implementResult(AggContext info, AggResultContext result) { WinAggResultContext winResult = (WinAggResultContext) result; List<RexNode> rexArgs = winResult.rexArguments(); Expression tiles = winResult.rowTranslator(winResult.index()).translate( rexArgs.get(0), int.class); Expression ntile = Expressions.add(Expressions.constant(1), Expressions.divide( Expressions.multiply( tiles, Expressions.subtract( winResult.index(), winResult.startIndex())), winResult.getPartitionRowCount())); return ntile; } }
operand = Expressions.subtract(operand, Expressions.constant(1L));
operand = Expressions.subtract(operand, Expressions.constant(1L));
switch (call.getKind()) { case MINUS: return normalize(typeName, Expressions.subtract(trop0, trop1)); default: return normalize(typeName, Expressions.add(trop0, trop1)); TimeUnit toUnit = TimeUnit.MILLISECOND; return multiplyDivide( Expressions.convert_(Expressions.subtract(trop0, trop1), (Class) long.class), fromUnit.multiplier, toUnit.multiplier);
switch (call.getKind()) { case MINUS: return normalize(typeName, Expressions.subtract(trop0, trop1)); default: return normalize(typeName, Expressions.add(trop0, trop1)); TimeUnit toUnit = TimeUnit.MILLISECOND; return multiplyDivide( Expressions.convert_(Expressions.subtract(trop0, trop1), (Class) long.class), fromUnit.multiplier, toUnit.multiplier);
public Expression implementResult(AggContext info, AggResultContext result) { WinAggResultContext winResult = (WinAggResultContext) result; List<RexNode> rexArgs = winResult.rexArguments(); ParameterExpression res = Expressions.parameter(0, info.returnType(), result.currentBlock().newName("nth")); RexToLixTranslator currentRowTranslator = winResult.rowTranslator( winResult.computeIndex(Expressions.constant(0), SeekType.START)); Expression dstIndex = winResult.computeIndex( Expressions.subtract( currentRowTranslator.translate(rexArgs.get(1), int.class), Expressions.constant(1)), SeekType.START); Expression rowInRange = winResult.rowInPartition(dstIndex); BlockBuilder thenBlock = result.nestBlock(); Expression nthValue = winResult.rowTranslator(dstIndex) .translate(rexArgs.get(0), res.type); thenBlock.add(Expressions.statement(Expressions.assign(res, nthValue))); result.exitBlock(); BlockStatement thenBranch = thenBlock.toBlock(); Expression defaultValue = getDefaultValue(res.type); result.currentBlock().add(Expressions.declare(0, res, null)); result.currentBlock().add( Expressions.ifThenElse(rowInRange, thenBranch, Expressions.statement(Expressions.assign(res, defaultValue)))); return res; } }
public Expression implementResult(AggContext info, AggResultContext result) { WinAggResultContext winResult = (WinAggResultContext) result; List<RexNode> rexArgs = winResult.rexArguments(); ParameterExpression res = Expressions.parameter(0, info.returnType(), result.currentBlock().newName("nth")); RexToLixTranslator currentRowTranslator = winResult.rowTranslator( winResult.computeIndex(Expressions.constant(0), SeekType.START)); Expression dstIndex = winResult.computeIndex( Expressions.subtract( currentRowTranslator.translate(rexArgs.get(1), int.class), Expressions.constant(1)), SeekType.START); Expression rowInRange = winResult.rowInPartition(dstIndex); BlockBuilder thenBlock = result.nestBlock(); Expression nthValue = winResult.rowTranslator(dstIndex) .translate(rexArgs.get(0), res.type); thenBlock.add(Expressions.statement(Expressions.assign(res, nthValue))); result.exitBlock(); BlockStatement thenBranch = thenBlock.toBlock(); Expression defaultValue = getDefaultValue(res.type); result.currentBlock().add(Expressions.declare(0, res, null)); result.currentBlock().add( Expressions.ifThenElse(rowInRange, thenBranch, Expressions.statement(Expressions.assign(res, defaultValue)))); return res; } }
Expressions.lessThan( add.compareRows( Expressions.subtract(add.currentPosition(), Expressions.constant(1)), add.currentPosition()),
Expressions.lessThan( add.compareRows( Expressions.subtract(add.currentPosition(), Expressions.constant(1)), add.currentPosition()),