Upd with offset
authorJeroen van der Heijden <jeroen@cesbit.com>
Tue, 24 Oct 2023 12:54:59 +0000 (14:54 +0200)
committerJeroen van der Heijden <jeroen@cesbit.com>
Tue, 24 Oct 2023 12:54:59 +0000 (14:54 +0200)
grammar/grammar.py
include/siri/grammar/grammar.h
include/siri/version.h
src/siri/db/aggregate.c
src/siri/grammar/grammar.c

index 59460271a2f0ca4dfed7b3c65be31d91af19f80d..8107db5331db36d47de75abb70eb1107a6c2f8cf 100644 (file)
@@ -126,6 +126,7 @@ class SiriGrammar(Grammar):
     k_ninf = Sequence('-', k_inf)
     k_now = Keyword('now')
     k_number = Keyword('number')
+    k_offset = Keyword('offset')
     k_online = Keyword('online')
     k_open_files = Keyword('open_files')
     k_or = Keyword('or')
@@ -527,6 +528,9 @@ class SiriGrammar(Grammar):
     f_last = Sequence(
         k_last,
         '(', Optional(time_expr), ')')
+    f_offset = Sequence(
+        k_offset,
+        '(', Optional(time_expr), ')')
     f_timeval = Sequence(
         k_timeval,
         '(', ')')
@@ -572,6 +576,7 @@ class SiriGrammar(Grammar):
 
     aggregate_functions = List(Choice(
         f_all,
+        f_offset,
         f_limit,
         f_mean,
         f_sum,
index 3d48891f319dba563969cd0a1a29e1efb831082d..c1e148bd225a9e524305332dc1c28d9eddb9251e 100644 (file)
@@ -5,7 +5,7 @@
  * should be used with the libcleri module.
  *
  * Source class: SiriGrammar
- * Created at: 2022-05-05 15:08:05
+ * Created at: 2023-10-24 14:29:56
  */
 #ifndef CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_
 #define CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_
@@ -70,6 +70,7 @@ enum cleri_grammar_ids {
     CLERI_GID_F_MEDIAN_HIGH,
     CLERI_GID_F_MEDIAN_LOW,
     CLERI_GID_F_MIN,
+    CLERI_GID_F_OFFSET,
     CLERI_GID_F_POINTS,
     CLERI_GID_F_PVARIANCE,
     CLERI_GID_F_STDDEV,
@@ -201,6 +202,7 @@ enum cleri_grammar_ids {
     CLERI_GID_K_NINF,
     CLERI_GID_K_NOW,
     CLERI_GID_K_NUMBER,
+    CLERI_GID_K_OFFSET,
     CLERI_GID_K_ONLINE,
     CLERI_GID_K_OPEN_FILES,
     CLERI_GID_K_OR,
index 52b8907c1a6c340693fe56a6d8e4175646451eb9..15eb357331a6966fc81e649e6596b09704f8f67c 100644 (file)
@@ -6,7 +6,7 @@
 
 #define SIRIDB_VERSION_MAJOR 2
 #define SIRIDB_VERSION_MINOR 0
-#define SIRIDB_VERSION_PATCH 50
+#define SIRIDB_VERSION_PATCH 51
 
 /*
  * Use SIRIDB_VERSION_PRE_RELEASE for alpha release versions.
@@ -15,7 +15,7 @@
  * Note that debian alpha packages should use versions like this:
  *   2.0.34-0alpha0
  */
-#define SIRIDB_VERSION_PRE_RELEASE ""
+#define SIRIDB_VERSION_PRE_RELEASE "-alpha-0"
 
 #ifndef NDEBUG
 #define SIRIDB_VERSION_BUILD_RELEASE "+debug"
index 2dad9014d83bbf14e308ed22e55a10fc175419bf..476b3a4091fbab3469f4ee596c8d67a2e0f97d23 100644 (file)
@@ -206,7 +206,7 @@ void siridb_init_aggregates(void)
 vec_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg)
 {
     uint32_t gid;
-    siridb_aggr_t * aggr;
+    siridb_aggr_t * aggr = NULL;
     vec_t * vec = vec_new(VEC_DEFAULT_SIZE);
     if (vec == NULL)
     {
@@ -221,6 +221,30 @@ vec_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg)
 
         switch (gid)
         {
+        case CLERI_GID_F_OFFSET:
+            if (aggr == NULL || aggr->group_by == 0)
+            {
+                sprintf(err_msg,
+                        "Offset must be used after an aggregation method.");
+                siridb_aggregate_list_free(vec);
+                return NULL;
+            }
+            if (cleri_gn(cleri_gn(children)->children)
+                    ->children->next->next->next != NULL)
+            {
+                /* result is always positive, checked earlier */
+                aggr->offset = CLERI_NODE_DATA(
+                        cleri_gn(cleri_gn(cleri_gn(cleri_gn(children)
+                        ->children)->children->next->next)->children));
+
+                if (aggr->offset >= aggr->group_by)
+                {
+                    sprintf(err_msg, "Offset too large.");
+                    siridb_aggregate_list_free(vec);
+                    return NULL;
+                }
+            }
+            break;
         case CLERI_GID_F_LIMIT:
             AGGR_NEW
             {
@@ -319,11 +343,6 @@ vec_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg)
         case CLERI_GID_F_TIMEVAL:
         case CLERI_GID_F_INTERVAL:
             AGGR_NEW
-            {
-                aggr->timespan = 1;
-                aggr->group_by = 0;
-            }
-
             VEC_APPEND
 
             break;
index ba49e8a914a180e8e635957b07e4d7c0f957edbf..96029ed49656123a024761e973553637d7dd34fe 100644 (file)
@@ -5,7 +5,7 @@
  * should be used with the libcleri module.
  *
  * Source class: SiriGrammar
- * Created at: 2022-05-05 15:08:05
+ * Created at: 2023-10-24 14:29:56
  */
 
 #include "siri/grammar/grammar.h"
@@ -124,6 +124,7 @@ cleri_grammar_t * compile_siri_grammar_grammar(void)
     );
     cleri_t * k_now = cleri_keyword(CLERI_GID_K_NOW, "now", CLERI_CASE_SENSITIVE);
     cleri_t * k_number = cleri_keyword(CLERI_GID_K_NUMBER, "number", CLERI_CASE_SENSITIVE);
+    cleri_t * k_offset = cleri_keyword(CLERI_GID_K_OFFSET, "offset", CLERI_CASE_SENSITIVE);
     cleri_t * k_online = cleri_keyword(CLERI_GID_K_ONLINE, "online", CLERI_CASE_SENSITIVE);
     cleri_t * k_open_files = cleri_keyword(CLERI_GID_K_OPEN_FILES, "open_files", CLERI_CASE_SENSITIVE);
     cleri_t * k_or = cleri_keyword(CLERI_GID_K_OR, "or", CLERI_CASE_SENSITIVE);
@@ -1050,6 +1051,14 @@ cleri_grammar_t * compile_siri_grammar_grammar(void)
         cleri_optional(CLERI_NONE, time_expr),
         cleri_token(CLERI_NONE, ")")
     );
+    cleri_t * f_offset = cleri_sequence(
+        CLERI_GID_F_OFFSET,
+        4,
+        k_offset,
+        cleri_token(CLERI_NONE, "("),
+        cleri_optional(CLERI_NONE, time_expr),
+        cleri_token(CLERI_NONE, ")")
+    );
     cleri_t * f_timeval = cleri_sequence(
         CLERI_GID_F_TIMEVAL,
         3,
@@ -1094,7 +1103,8 @@ cleri_grammar_t * compile_siri_grammar_grammar(void)
         cleri_choice(
             CLERI_NONE,
             CLERI_FIRST_MATCH,
-            13,
+            14,
+            k_offset,
             k_mean,
             k_median,
             k_median_high,
@@ -1114,8 +1124,9 @@ cleri_grammar_t * compile_siri_grammar_grammar(void)
     cleri_t * aggregate_functions = cleri_list(CLERI_GID_AGGREGATE_FUNCTIONS, cleri_choice(
         CLERI_NONE,
         CLERI_FIRST_MATCH,
-        21,
+        22,
         f_all,
+        f_offset,
         f_limit,
         f_mean,
         f_sum,