15
15
use std:: fmt:: Display ;
16
16
17
17
use enum_as_inner:: EnumAsInner ;
18
+ use parse_display:: Display ;
18
19
use risingwave_common:: bail;
19
20
use risingwave_common:: types:: {
20
- DataType , Datum , ScalarImpl , ScalarRefImpl , Sentinelled , ToDatumRef , ToOwnedDatum ,
21
+ DataType , Datum , ScalarImpl , ScalarRefImpl , Sentinelled , ToDatumRef , ToOwnedDatum , ToText ,
21
22
} ;
22
23
use risingwave_common:: util:: sort_util:: { Direction , OrderType } ;
23
24
use risingwave_pb:: expr:: window_frame:: { PbBound , PbExclusion } ;
24
25
use risingwave_pb:: expr:: { PbWindowFrame , PbWindowFunction } ;
26
+ use FrameBound :: { CurrentRow , Following , Preceding , UnboundedFollowing , UnboundedPreceding } ;
25
27
26
28
use super :: WindowFuncKind ;
27
29
use crate :: aggregate:: AggArgs ;
@@ -185,7 +187,12 @@ pub struct RangeFrameBounds {
185
187
186
188
impl Display for RangeFrameBounds {
187
189
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
188
- write ! ( f, "RANGE BETWEEN {:?} AND {:?}" , self . start, self . end) ?; // TODO(): display
190
+ write ! (
191
+ f,
192
+ "RANGE BETWEEN {} AND {}" ,
193
+ self . start. for_display( ) ,
194
+ self . end. for_display( )
195
+ ) ?;
189
196
Ok ( ( ) )
190
197
}
191
198
}
@@ -311,22 +318,23 @@ impl RangeFrameBounds {
311
318
}
312
319
}
313
320
314
- #[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash , EnumAsInner ) ]
321
+ #[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash , EnumAsInner , Display ) ]
322
+ #[ display( style = "TITLE CASE" ) ]
315
323
pub enum FrameBound < T > {
316
- UnboundedPreceding , /* TODO(rc): maybe we can merge `UnboundedPreceding` and `UnboundedFollowing` */
324
+ UnboundedPreceding ,
325
+ #[ display( "{0} PRECEDING" ) ]
317
326
Preceding ( T ) ,
318
327
CurrentRow ,
328
+ #[ display( "{0} FOLLOWING" ) ]
319
329
Following ( T ) ,
320
330
UnboundedFollowing ,
321
331
}
322
332
323
333
impl < T > FrameBound < T > {
324
334
fn offset_value ( & self ) -> Option < & T > {
325
335
match self {
326
- FrameBound :: UnboundedPreceding
327
- | FrameBound :: UnboundedFollowing
328
- | FrameBound :: CurrentRow => None ,
329
- FrameBound :: Preceding ( offset) | FrameBound :: Following ( offset) => Some ( offset) ,
336
+ UnboundedPreceding | UnboundedFollowing | CurrentRow => None ,
337
+ Preceding ( offset) | Following ( offset) => Some ( offset) ,
330
338
}
331
339
}
332
340
@@ -336,15 +344,14 @@ impl<T> FrameBound<T> {
336
344
offset_checker : impl Fn ( & T ) -> Result < ( ) > ,
337
345
) -> Result < ( ) > {
338
346
match ( start, end) {
339
- ( _, FrameBound :: UnboundedPreceding ) => bail ! ( "frame end cannot be UNBOUNDED PRECEDING" ) ,
340
- ( FrameBound :: UnboundedFollowing , _) => {
347
+ ( _, UnboundedPreceding ) => bail ! ( "frame end cannot be UNBOUNDED PRECEDING" ) ,
348
+ ( UnboundedFollowing , _) => {
341
349
bail ! ( "frame start cannot be UNBOUNDED FOLLOWING" )
342
350
}
343
- ( FrameBound :: Following ( _) , FrameBound :: CurrentRow )
344
- | ( FrameBound :: Following ( _) , FrameBound :: Preceding ( _) ) => {
351
+ ( Following ( _) , CurrentRow ) | ( Following ( _) , Preceding ( _) ) => {
345
352
bail ! ( "frame starting from following row cannot have preceding rows" )
346
353
}
347
- ( FrameBound :: CurrentRow , FrameBound :: Preceding ( _) ) => {
354
+ ( CurrentRow , Preceding ( _) ) => {
348
355
bail ! ( "frame starting from current row cannot have preceding rows" )
349
356
}
350
357
_ => { }
@@ -366,11 +373,11 @@ where
366
373
{
367
374
fn reverse ( self ) -> FrameBound < T > {
368
375
match self {
369
- FrameBound :: UnboundedPreceding => FrameBound :: UnboundedFollowing ,
370
- FrameBound :: Preceding ( offset) => FrameBound :: Following ( offset) ,
371
- FrameBound :: CurrentRow => FrameBound :: CurrentRow ,
372
- FrameBound :: Following ( offset) => FrameBound :: Preceding ( offset) ,
373
- FrameBound :: UnboundedFollowing => FrameBound :: UnboundedPreceding ,
376
+ UnboundedPreceding => UnboundedFollowing ,
377
+ Preceding ( offset) => Following ( offset) ,
378
+ CurrentRow => CurrentRow ,
379
+ Following ( offset) => Preceding ( offset) ,
380
+ UnboundedFollowing => UnboundedPreceding ,
374
381
}
375
382
}
376
383
}
@@ -413,27 +420,14 @@ impl FrameBound<usize> {
413
420
}
414
421
}
415
422
416
- impl Display for FrameBound < usize > {
417
- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
418
- match self {
419
- FrameBound :: UnboundedPreceding => write ! ( f, "UNBOUNDED PRECEDING" ) ?,
420
- FrameBound :: Preceding ( n) => write ! ( f, "{} PRECEDING" , n) ?,
421
- FrameBound :: CurrentRow => write ! ( f, "CURRENT ROW" ) ?,
422
- FrameBound :: Following ( n) => write ! ( f, "{} FOLLOWING" , n) ?,
423
- FrameBound :: UnboundedFollowing => write ! ( f, "UNBOUNDED FOLLOWING" ) ?,
424
- }
425
- Ok ( ( ) )
426
- }
427
- }
428
-
429
423
impl FrameBound < usize > {
430
424
/// Convert the bound to sized offset from current row. `None` if the bound is unbounded.
431
425
pub fn to_offset ( & self ) -> Option < isize > {
432
426
match self {
433
- FrameBound :: UnboundedPreceding | FrameBound :: UnboundedFollowing => None ,
434
- FrameBound :: CurrentRow => Some ( 0 ) ,
435
- FrameBound :: Preceding ( n) => Some ( -( * n as isize ) ) ,
436
- FrameBound :: Following ( n) => Some ( * n as isize ) ,
427
+ UnboundedPreceding | UnboundedFollowing => None ,
428
+ CurrentRow => Some ( 0 ) ,
429
+ Preceding ( n) => Some ( -( * n as isize ) ) ,
430
+ Following ( n) => Some ( * n as isize ) ,
437
431
}
438
432
}
439
433
@@ -451,11 +445,21 @@ impl FrameBound<usize> {
451
445
impl FrameBound < ScalarImpl > {
452
446
fn as_ref ( & self ) -> FrameBound < ScalarRefImpl < ' _ > > {
453
447
match self {
454
- FrameBound :: UnboundedPreceding => FrameBound :: UnboundedPreceding ,
455
- FrameBound :: Preceding ( offset) => FrameBound :: Preceding ( offset. as_scalar_ref_impl ( ) ) ,
456
- FrameBound :: CurrentRow => FrameBound :: CurrentRow ,
457
- FrameBound :: Following ( offset) => FrameBound :: Following ( offset. as_scalar_ref_impl ( ) ) ,
458
- FrameBound :: UnboundedFollowing => FrameBound :: UnboundedFollowing ,
448
+ UnboundedPreceding => UnboundedPreceding ,
449
+ Preceding ( offset) => Preceding ( offset. as_scalar_ref_impl ( ) ) ,
450
+ CurrentRow => CurrentRow ,
451
+ Following ( offset) => Following ( offset. as_scalar_ref_impl ( ) ) ,
452
+ UnboundedFollowing => UnboundedFollowing ,
453
+ }
454
+ }
455
+
456
+ fn for_display ( & self ) -> FrameBound < String > {
457
+ match self {
458
+ UnboundedPreceding => UnboundedPreceding ,
459
+ Preceding ( offset) => Preceding ( offset. as_scalar_ref_impl ( ) . to_text ( ) ) ,
460
+ CurrentRow => CurrentRow ,
461
+ Following ( offset) => Following ( offset. as_scalar_ref_impl ( ) . to_text ( ) ) ,
462
+ UnboundedFollowing => UnboundedFollowing ,
459
463
}
460
464
}
461
465
}
@@ -464,11 +468,11 @@ impl FrameBound<ScalarRefImpl<'_>> {
464
468
fn bound_of ( self , order_value : impl ToDatumRef , order_type : OrderType ) -> Sentinelled < Datum > {
465
469
let order_value = order_value. to_datum_ref ( ) ;
466
470
match ( self , order_type. direction ( ) ) {
467
- ( FrameBound :: UnboundedPreceding , _) => Sentinelled :: Smallest ,
468
- ( FrameBound :: UnboundedFollowing , _) => Sentinelled :: Largest ,
469
- ( FrameBound :: CurrentRow , _) => Sentinelled :: Normal ( order_value. to_owned_datum ( ) ) ,
470
- ( FrameBound :: Preceding ( offset) , Direction :: Ascending )
471
- | ( FrameBound :: Following ( offset) , Direction :: Descending ) => {
471
+ ( UnboundedPreceding , _) => Sentinelled :: Smallest ,
472
+ ( UnboundedFollowing , _) => Sentinelled :: Largest ,
473
+ ( CurrentRow , _) => Sentinelled :: Normal ( order_value. to_owned_datum ( ) ) ,
474
+ ( Preceding ( offset) , Direction :: Ascending )
475
+ | ( Following ( offset) , Direction :: Descending ) => {
472
476
// should SUBTRACT the offset
473
477
if let Some ( value) = order_value {
474
478
let res = match ( value, offset) {
@@ -490,8 +494,8 @@ impl FrameBound<ScalarRefImpl<'_>> {
490
494
Sentinelled :: Normal ( None )
491
495
}
492
496
}
493
- ( FrameBound :: Following ( offset) , Direction :: Ascending )
494
- | ( FrameBound :: Preceding ( offset) , Direction :: Descending ) => {
497
+ ( Following ( offset) , Direction :: Ascending )
498
+ | ( Preceding ( offset) , Direction :: Descending ) => {
495
499
// should ADD the offset
496
500
if let Some ( value) = order_value {
497
501
let res = match ( value, offset) {
0 commit comments