Fixed querying many series by name, solves #118
authorJeroen van der Heijden <jeroen@transceptor.technology>
Wed, 6 Mar 2019 15:35:03 +0000 (16:35 +0100)
committerJeroen van der Heijden <jeroen@transceptor.technology>
Wed, 6 Mar 2019 15:35:03 +0000 (16:35 +0100)
grammar/grammar.py
include/siri/grammar/grammar.h
include/siri/version.h
itest/test_parentheses.py
itest/test_select.py
src/siri/db/query.c
src/siri/grammar/grammar.c

index 47152d6c9a33061a2814a60acc7cad6b33770940..fea49e33a8bade4d2c6d26db4f6765ac9179136a 100644 (file)
@@ -423,6 +423,12 @@ class SiriGrammar(Grammar):
     uuid = Choice(r_uuid_str, string, most_greedy=False)
     group_match = Repeat(r_grave_str, 1, 1)
     series_match = Prio(
+        List(Choice(
+            series_all,
+            series_name,
+            group_match,
+            series_re,
+            most_greedy=False), series_setopr, 1),
         Choice(
             series_all,
             series_name,
index b4d098b6bd7e1ccb782bfc8816cabd6b53fd197e..3f41f461471b1904359f0a770086ccd4d2ac7e89 100644 (file)
@@ -5,7 +5,7 @@
  * should be used with the libcleri module.
  *
  * Source class: SiriGrammar
- * Created at: 2019-01-03 10:42:54
+ * Created at: 2019-03-06 11:59:02
  */
 #ifndef CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_
 #define CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_
index 770916648bf555b61e0dd95ed9d0ab753db0d10f..2d07f755efcaaa12659da2444dcf7a6e286903d9 100644 (file)
@@ -15,7 +15,7 @@
  * Note that debian alpha packages should use versions like this:
  *   2.0.30-0alpha0
  */
-#define SIRIDB_VERSION_PRE_RELEASE "-alpha-0"
+#define SIRIDB_VERSION_PRE_RELEASE "-alpha-1"
 
 #ifndef NDEBUG
 #define SIRIDB_VERSION_BUILD_RELEASE "+debug"
index c31be3636ad76e718c415f006e467c669f2759f1..26a48fc9d793e925025fb791b6246f2b5ff703de 100644 (file)
@@ -88,29 +88,38 @@ class TestParenth(TestBase):
             {'success_msg': 'Successfully inserted {} point(s).'.format(
                 LENPOINTS)})
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series
                     all - ("series-001" | "series-002" | /windows.*/)
-               '''),
+               ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-003'],
                     ['series-004'],
                     ['linux-001'],
                     ['linux-002'],
                     ['linux-003'],
-                    ['linux-004']]})
+                    ['linux-004']
+                ])
+            }
+        )
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series all - (
                     "series-001" | "series-002" | (/windows.*/ & /.*001/))
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-003'],
                     ['series-004'],
                     ['linux-001'],
@@ -119,52 +128,72 @@ class TestParenth(TestBase):
                     ['linux-004'],
                     ['windows-002'],
                     ['windows-003'],
-                    ['windows-004']]})
-
-        self.assertEqual(
-            await self.client0.query('''
+                    ['windows-004']
+                ])
+            }
+        )
+        result = await self.client0.query('''
                 list series all - (
                     "series-001" | "series-002" | (/windows.*/ - /.*001/))
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-003'],
                     ['series-004'],
                     ['linux-001'],
                     ['linux-002'],
                     ['linux-003'],
                     ['linux-004'],
-                    ['windows-001']]})
+                    ['windows-001']
+                ])
+            }
+        )
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series (
                     "series-001" | "series-002" | /windows.*/) - /.*003/
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-001'],
                     ['series-002'],
                     ['windows-001'],
                     ['windows-002'],
-                    ['windows-004']]})
+                    ['windows-004']
+                ])
+            }
+        )
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series all - (/series.*/ ^ /.*001/)
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-001'],
                     ['linux-002'],
                     ['linux-003'],
                     ['linux-004'],
                     ['windows-002'],
                     ['windows-003'],
-                    ['windows-004']]})
+                    ['windows-004']
+                ])
+            }
+        )
 
         self.assertEqual(
             await self.client0.query('''
@@ -174,49 +203,73 @@ class TestParenth(TestBase):
                 'columns': ['name'],
                 'series': []})
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series /.*001/ & (/series.*/ | /linux.*/)
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-001'],
-                    ['linux-001']]})
+                    ['linux-001']
+                ])
+            }
+        )
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series /.*001/ & ((((/series.*/ | /linux.*/))))
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-001'],
-                    ['linux-001']]})
+                    ['linux-001']
+                ])
+            }
+        )
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series (/.*001/ | /.*002/) & (/series.*/ | /linux.*/)
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-001'],
                     ['series-002'],
                     ['linux-001'],
-                    ['linux-002']]})
+                    ['linux-002']
+                ])
+            }
+        )
 
-        self.assertEqual(
-            await self.client0.query('''
+        result = await self.client0.query('''
                 list series ((/.*001/ | /.*002/) & (/series.*/ | /linux.*/))
-                '''),
+                ''')
+        result['series'] = sorted(result['series'])
+
+        self.assertEqual(
+            result,
             {
                 'columns': ['name'],
-                'series': [
+                'series': sorted([
                     ['series-001'],
                     ['series-002'],
                     ['linux-001'],
-                    ['linux-002']]})
+                    ['linux-002']
+                ])
+            }
+        )
 
         with self.assertRaisesRegex(
                 QueryError,
index 70af9cb07961495788550c9063b52d054bac4407..d688412df464dfa926fe3382b03645740445c1b1 100644 (file)
@@ -217,6 +217,13 @@ class TestSelect(TestBase):
                 [1447254000, 31530.520833333332],
                 [1447257600, 4.666666666666667]]})
 
+        self.assertEqual(
+            await self.client0.query('select * from {}'.format(
+                ','.join(['"aggr"'] * 600)
+            )),
+            {'aggr': DATA['aggr']}
+        )
+
         self.assertEqual(
             await self.client0.query('select difference(1h) from "aggr"'),
             {'aggr': [[1447250400, 1], [1447254000, -3], [1447257600, 5]]})
index 02e5cd2ab73a02cc7f8e306c8d8c07420f05b789..d4807b16afb3d889f0b0ebfa8668fb92629d06ec 100644 (file)
@@ -405,6 +405,26 @@ void siridb_query_timeit_from_unpacker(
     }
 }
 
+static void QUERY_unique(cleri_olist_t * olist)
+{
+    while (olist != NULL && olist->next != NULL)
+    {
+        cleri_olist_t * test = olist;
+        while (test->next != NULL)
+        {
+            if (olist->cl_obj == test->next->cl_obj)
+            {
+                cleri_olist_t * tmp = test->next->next;
+                free(test->next);
+                test->next = tmp;
+                continue;
+            }
+            test = test->next;
+        }
+        olist = olist->next;
+    }
+}
+
 static void QUERY_send_invalid_error(uv_async_t * handle)
 {
     size_t len;
@@ -419,6 +439,9 @@ static void QUERY_send_invalid_error(uv_async_t * handle)
             "Query error at position %zd. Expecting ",
             query->pr->pos);
 
+    /* required for libcleri versions prior to 0.10.1 */
+    QUERY_unique(query->pr->expecting->required);
+
     /* expand the error message with suggestions. we try to add nice names
      * for regular expressions etc.
      */
index 305d4c6d5803c68bfb377d1261193b1f5c0ec850..6ed2519f0117daabc5cb8d2887ff217318ea67e7 100644 (file)
@@ -5,7 +5,7 @@
  * should be used with the libcleri module.
  *
  * Source class: SiriGrammar
- * Created at: 2019-01-03 10:42:54
+ * Created at: 2019-03-06 11:59:02
  */
 
 #include "siri/grammar/grammar.h"
@@ -781,7 +781,16 @@ cleri_grammar_t * compile_siri_grammar_grammar(void)
     cleri_t * group_match = cleri_dup(CLERI_GID_GROUP_MATCH, r_grave_str);
     cleri_t * series_match = cleri_prio(
         CLERI_GID_SERIES_MATCH,
-        3,
+        4,
+        cleri_list(CLERI_NONE, cleri_choice(
+            CLERI_NONE,
+            CLERI_FIRST_MATCH,
+            4,
+            series_all,
+            series_name,
+            group_match,
+            series_re
+        ), series_setopr, 1, 0, 0),
         cleri_choice(
             CLERI_NONE,
             CLERI_FIRST_MATCH,