]> git.jsancho.org Git - datasette-pytables.git/commitdiff
custom pytables sql
authorJavier Sancho <jsf@jsancho.org>
Mon, 26 Oct 2020 16:57:40 +0000 (17:57 +0100)
committerJavier Sancho <jsf@jsancho.org>
Mon, 26 Oct 2020 16:57:40 +0000 (17:57 +0100)
datasette_pytables/__init__.py
tests/test_api.py

index a730cb7e72daae411a7c4c791e759fdd1a4d29a1..9dc2a099bc32666af22122d94f19d39d4da532a5 100644 (file)
@@ -22,6 +22,8 @@ class PyTablesConnector(dc.Connector):
         'lte': '<=',
         'and': '&',
         'or': '|',
+        'binary_and': '&',
+        'binary_or': '|',
     }
 
     def table_names(self):
@@ -127,12 +129,22 @@ class PyTablesConnector(dc.Connector):
                 start = int(params['p0']) + 1
             else:
                 left, right = where[operator]
-                if left in params:
+
+                if isinstance(left, dict):
+                    left = "(" + _translate_where(left) + ")"
+                elif left in params:
                     _cast_param(right, left)
+
+                if isinstance(right, dict):
+                    right = "(" + _translate_where(right) + ")"
                 elif right in params:
                     _cast_param(left, right)
 
-                expr = "{left} {operator} {right}".format(left=left, operator=self.operators.get(operator, operator), right=right)
+                expr = "{left} {operator} {right}".format(
+                    left=left,
+                    operator=self.operators.get(operator, operator),
+                    right=right,
+                )
 
             return expr
 
index c1938b1ddd8a059a0b523004dfd525030ddd6f43..80e379c93d81595d7584647c1654b6390eaef7a7 100644 (file)
@@ -88,20 +88,20 @@ def test_custom_complex_sql(app_client):
     response = app_client.get(
         '/test_tables.json?' + urlencode({
             'sql': 'select identity from [/group1/table1] where speed > 100 and idnumber < 55',
-            '_shape': 'objects'
+            '_shape': 'objects',
         }),
     )
     data = response.json
     assert {
         'sql': 'select identity from [/group1/table1] where speed > 100 and idnumber < 55',
-        'params': {}
+        'params': {},
     } == data['query']
     assert 4 == len(data['rows'])
     assert [
         {'identity': 'This is particle: 51'},
         {'identity': 'This is particle: 52'},
         {'identity': 'This is particle: 53'},
-        {'identity': 'This is particle: 54'}
+        {'identity': 'This is particle: 54'},
     ] == data['rows']
     assert ['identity'] == data['columns']
     assert 'test_tables' == data['database']
@@ -111,19 +111,19 @@ def test_custom_pytables_sql(app_client):
     response = app_client.get(
         '/test_tables.json?' + urlencode({
             'sql': 'select identity from [/group1/table1] where (speed > 100) & (speed < 500)',
-            '_shape': 'objects'
-            }),
+            '_shape': 'objects',
+        }),
     )
     data = response.json
     assert {
         'sql': 'select identity from [/group1/table1] where (speed > 100) & (speed < 500)',
-        'params': {}
+        'params': {},
     } == data['query']
     assert 199 == len(data['rows'])
     assert [
         {'identity': 'This is particle: 51'},
         {'identity': 'This is particle: 52'},
-        {'identity': 'This is particle: 53'}
+        {'identity': 'This is particle: 53'},
     ] == data['rows'][:3]
     assert ['identity'] == data['columns']
     assert 'test_tables' == data['database']