@@ -929,6 +929,112 @@ public void FilterByLong()
929929 Assert . AreEqual ( "p3" , endWithTicksAssignment ? . Id . Name ) ;
930930 Assert . AreEqual ( "637656739543829486" , ( endWithTicksAssignment ? . Init as IntegerLiteral ) ? . Value ) ;
931931 }
932+
933+ [ Test ]
934+ public void AggregateWindow ( )
935+ {
936+ var query = from s in InfluxDBQueryable < Sensor > . Queryable ( "my-bucket" , "my-org" , _queryApi )
937+ where s . Timestamp . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , TimeSpan . FromSeconds ( 40 ) , "mean" )
938+ where s . Value == 5
939+ select s ;
940+ var visitor = BuildQueryVisitor ( query ) ;
941+
942+ StringAssert . Contains ( "aggregateWindow(every: p3, period: p4, fn: p5)" , visitor . BuildFluxQuery ( ) ) ;
943+
944+ var ast = visitor . BuildFluxAST ( ) ;
945+
946+ Assert . NotNull ( ast ) ;
947+ Assert . NotNull ( ast . Body ) ;
948+ Assert . AreEqual ( 6 , ast . Body . Count ) ;
949+
950+ var everyAssignment = ( ( OptionStatement ) ast . Body [ 2 ] ) . Assignment as VariableAssignment ;
951+ Assert . AreEqual ( "p3" , everyAssignment ? . Id . Name ) ;
952+ Assert . AreEqual ( 20000000 , ( everyAssignment . Init as DurationLiteral ) ? . Values [ 0 ] . Magnitude ) ;
953+ Assert . AreEqual ( "us" , ( everyAssignment . Init as DurationLiteral ) ? . Values [ 0 ] . Unit ) ;
954+
955+ var periodAssignment = ( ( OptionStatement ) ast . Body [ 3 ] ) . Assignment as VariableAssignment ;
956+ Assert . AreEqual ( "p4" , periodAssignment ? . Id . Name ) ;
957+ Assert . AreEqual ( 40000000 , ( periodAssignment . Init as DurationLiteral ) ? . Values [ 0 ] . Magnitude ) ;
958+ Assert . AreEqual ( "us" , ( periodAssignment . Init as DurationLiteral ) ? . Values [ 0 ] . Unit ) ;
959+
960+ var fnAssignment = ( ( OptionStatement ) ast . Body [ 4 ] ) . Assignment as VariableAssignment ;
961+ Assert . AreEqual ( "p5" , fnAssignment ? . Id . Name ) ;
962+ Assert . AreEqual ( "mean" , ( fnAssignment . Init as Identifier ) ? . Name ) ;
963+ }
964+
965+ [ Test ]
966+ public void AggregateWindowFluxQuery ( )
967+ {
968+ var queries = new [ ]
969+ {
970+ (
971+ from s in InfluxDBQueryable < Sensor > . Queryable ( "my-bucket" , "my-org" , _queryApi )
972+ where s . Timestamp . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , TimeSpan . FromSeconds ( 40 ) , "mean" )
973+ select s ,
974+ "aggregateWindow(every: p3, period: p4, fn: p5)" ,
975+ ""
976+ ) ,
977+ (
978+ from s in InfluxDBQueryable < Sensor > . Queryable ( "my-bucket" , "my-org" , _queryApi )
979+ where s . Timestamp . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , null , "mean" )
980+ select s ,
981+ "aggregateWindow(every: p3, fn: p4)" ,
982+ ""
983+ ) ,
984+ (
985+ from s in InfluxDBQueryable < Sensor > . Queryable ( "my-bucket" , "my-org" , _queryApi )
986+ where s . Timestamp . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , null , "mean" )
987+ where s . Value == 5
988+ select s ,
989+ "aggregateWindow(every: p3, fn: p4)" ,
990+ " |> filter(fn: (r) => (r[\" data\" ] == p5))"
991+ ) ,
992+ (
993+ from s in InfluxDBQueryable < Sensor > . Queryable ( "my-bucket" , "my-org" , _queryApi )
994+ where s . Value == 5
995+ where s . Timestamp . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , null , "mean" )
996+ select s ,
997+ "aggregateWindow(every: p4, fn: p5)" ,
998+ " |> filter(fn: (r) => (r[\" data\" ] == p3))"
999+ ) ,
1000+ (
1001+ from s in InfluxDBQueryable < Sensor > . Queryable ( "my-bucket" , "my-org" , _queryApi )
1002+ where s . Deployment == "prod"
1003+ where s . Value == 5
1004+ where s . Timestamp . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , null , "mean" )
1005+ select s ,
1006+ "filter(fn: (r) => (r[\" deployment\" ] == p3)) |> aggregateWindow(every: p5, fn: p6)" ,
1007+ " |> filter(fn: (r) => (r[\" data\" ] == p4))"
1008+ ) ,
1009+ (
1010+ from s in InfluxDBQueryable < Sensor > . Queryable ( "my-bucket" , "my-org" , _queryApi )
1011+ where s . Deployment == "prod" && s . Value == 5 && s . Timestamp . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , null , "mean" )
1012+ select s ,
1013+ "filter(fn: (r) => (r[\" deployment\" ] == p3)) |> aggregateWindow(every: p5, fn: p6)" ,
1014+ " |> filter(fn: (r) => (r[\" data\" ] == p4))"
1015+ )
1016+ } ;
1017+
1018+ foreach ( var ( queryable , expected , filter ) in queries )
1019+ {
1020+ var visitor = BuildQueryVisitor ( queryable ) ;
1021+
1022+ var flux = "start_shifted = int(v: time(v: p2))\n \n from(bucket: p1) |> range(start: time(v: start_shifted)) |> " + expected + " |> pivot(rowKey:[\" _time\" ], columnKey: [\" _field\" ], valueColumn: \" _value\" ) |> drop(columns: [\" _start\" , \" _stop\" , \" _measurement\" ])" + filter ;
1023+ Assert . AreEqual ( flux , visitor . BuildFluxQuery ( ) ) ;
1024+ }
1025+ }
1026+
1027+ [ Test ]
1028+ public void AggregateWindowOnlyForTimestamp ( )
1029+ {
1030+ var query = from s in InfluxDBQueryable < SensorDateTimeAsField > . Queryable ( "my-bucket" , "my-org" , _queryApi )
1031+ where s . DateTimeField . AggregateWindow ( TimeSpan . FromSeconds ( 20 ) , TimeSpan . FromSeconds ( 40 ) , "mean" )
1032+ where s . Value == 5
1033+ select s ;
1034+
1035+ var nse = Assert . Throws < NotSupportedException > ( ( ) => BuildQueryVisitor ( query ) ) ;
1036+ Assert . AreEqual ( "AggregateWindow() has to be used only for Timestamp member, e.g. [Column(IsTimestamp = true)]." , nse ? . Message ) ;
1037+ }
9321038
9331039 private InfluxDBQueryVisitor BuildQueryVisitor ( IQueryable queryable , Expression expression = null )
9341040 {
0 commit comments