You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2010/10/31 15:37:33 UTC

svn commit: r1029366 - in /cassandra/trunk: drivers/py/ drivers/py/cql/ drivers/py/cql/__init__.py drivers/py/setup.py test/system/test_cql.py

Author: eevans
Date: Sun Oct 31 14:37:33 2010
New Revision: 1029366

URL: http://svn.apache.org/viewvc?rev=1029366&view=rev
Log:
python driver and functional tests

Patch by eevans

Added:
    cassandra/trunk/drivers/py/
    cassandra/trunk/drivers/py/cql/
    cassandra/trunk/drivers/py/cql/__init__.py
    cassandra/trunk/drivers/py/setup.py
    cassandra/trunk/test/system/test_cql.py

Added: cassandra/trunk/drivers/py/cql/__init__.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/py/cql/__init__.py?rev=1029366&view=auto
==============================================================================
--- cassandra/trunk/drivers/py/cql/__init__.py (added)
+++ cassandra/trunk/drivers/py/cql/__init__.py Sun Oct 31 14:37:33 2010
@@ -0,0 +1,65 @@
+
+from avro.ipc  import HTTPTransceiver, Requestor
+import avro.protocol, zlib
+from os.path   import exists, abspath, dirname, join
+
+def _load_protocol():
+    # By default, look for the proto schema in the same dir as this file.
+    avpr = join(abspath(dirname(__file__)), 'cassandra.avpr')
+    if exists(avpr):
+        return avro.protocol.parse(open(avpr).read())
+
+    # Fall back to ../../interface/avro/cassandra.avpr (dev environ).
+    avpr = join(abspath(dirname(__file__)),
+                '..',
+                '..',
+                '..',
+                'interface',
+                'avro',
+                'cassandra.avpr')
+    if exists(avpr):
+        return avro.protocol.parse(open(avpr).read())
+
+    raise Exception("Unable to locate an avro protocol schema!")
+
+COMPRESSION_SCHEMES = ['GZIP']
+DEFAULT_COMPRESSION = 'GZIP'
+
+
+class Connection(object):
+    def __init__(self, keyspace, host, port=9160):
+        client = HTTPTransceiver(host, port)
+        self.requestor = Requestor(_load_protocol(), client)
+        if keyspace:
+            self.execute('USE %s' % keyspace)
+
+    def execute(self, query, compression=None):
+        compress = compression is None and DEFAULT_COMPRESSION \
+                or compression.upper()
+        if not compress in COMPRESSION_SCHEMES:
+            raise InvalidCompressionScheme(compress)
+    
+        compressed_query = Connection.compress_query(query, compress)
+        request_params = dict(query=compressed_query, compression=compress)
+        response = self.requestor.request('execute_cql_query', request_params)
+
+        if response['type'] == 'ROWS':
+            return response['rows']
+        return None
+
+    @classmethod
+    def compress_query(cls, query, compression):
+        if compression == 'GZIP':
+            return zlib.compress(query)
+
+
+class InvalidCompressionScheme(Exception): pass
+
+if __name__ == '__main__':
+    dbconn = Connection('localhost', 9160)
+    query = 'USE Keyspace1;'
+    dbconn.execute(query, 'GZIP') 
+    query = 'UPDATE Standard2 WITH ROW("k", COL("c", "v"));'
+    dbconn.execute(query, 'GZIP') 
+
+# vi: ai ts=4 tw=0 sw=4 et

Added: cassandra/trunk/drivers/py/setup.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/py/setup.py?rev=1029366&view=auto
==============================================================================
    (empty)

Added: cassandra/trunk/test/system/test_cql.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_cql.py?rev=1029366&view=auto
==============================================================================
--- cassandra/trunk/test/system/test_cql.py (added)
+++ cassandra/trunk/test/system/test_cql.py Sun Oct 31 14:37:33 2010
@@ -0,0 +1,89 @@
+
+from os.path import abspath, dirname, join
+import sys
+
+sys.path.append(join(abspath(dirname(__file__)), '../../drivers/py'))
+
+from cql import Connection
+from . import AvroTester
+
+def load_sample(dbconn):
+    dbconn.execute("""
+        UPDATE
+            Standard1
+        WITH
+            ROW("ka", COL("ca1", "va1"), COL("col", "val")) AND
+            ROW("kb", COL("cb1", "vb1"), COL("col", "val")) AND
+            ROW("kc", COL("cc1", "vc1"), COL("col", "val")) AND
+            ROW("kd", COL("cd1", "vd1"), COL("col", "val"));
+    """)
+    #dbconn.execute("""
+    #  UPDATE
+    #      StandardLong1
+    #  WITH
+    #    ROW("aa", COL(1L, "1"), COL(2L, "2"), COL(3L, "3"), COL(4L, "4")) AND
+    #    ROW("ab", COL(5L, "5"), COL(6L, "6"), COL(7L, "8"), COL(9L, "9")) AND
+    #    ROW("ac", COL(9L, "9"), COL(8L, "8"), COL(7L, "7"), COL(6L, "6")) AND
+    #    ROW("ad", COL(5L, "5"), COL(4L, "4"), COL(3L, "3"), COL(2L, "2")) AND
+    #    ROW("ae", COL(1L, "1"), COL(2L, "2"), COL(3L, "3"), COL(4L, "4")) AND
+    #    ROW("af", COL(1L, "1"), COL(2L, "2"), COL(3L, "3"), COL(4L, "4")) AND
+    #    ROW("ag", COL(5L, "5"), COL(6L, "6"), COL(7L, "8"), COL(9L, "9")));
+    #""")
+
+def init(keyspace="Keyspace1"):
+    dbconn = Connection(keyspace, 'localhost', 9170)
+    load_sample(dbconn)
+    return dbconn
+
+class TestCql(AvroTester):
+    def test_select_simple(self):
+        "retrieve a column"
+        conn = init()
+        r = conn.execute('SELECT FROM Standard1 WHERE KEY="ka" AND COL="ca1"')
+        assert r[0]['key'] == 'ka'
+        assert r[0]['columns'][0]['name'] == 'ca1'
+        assert r[0]['columns'][0]['value'] == 'va1'
+
+    def test_select_columns(self):
+        "retrieve multiple columns"
+        conn = init()
+        r = conn.execute("""
+            SELECT FROM Standard1 WHERE KEY = "kd" AND COLUMN = "cd1"
+                    AND COLUMN = "col"
+        """)
+        assert "cd1" in [i['name'] for i in r[0]['columns']]
+        assert "col" in [i['name'] for i in r[0]['columns']]
+
+    def test_select_rows_columns(self):
+        "fetch multiple rows and columns"
+        conn = init()
+        r = conn.execute("""
+            SELECT FROM
+                Standard1
+            WHERE
+                KEY = "ka" AND KEY = "kd" AND COLUMN = "col";
+        """)
+        for result in r:
+            assert result['key'] in ("ka", "kd")
+            assert result['columns'][0]['name'] == "col"
+            assert result['columns'][0]['value'] == "val"
+
+    def test_select_rows(self):
+        "fetch multiple rows, all columns"
+        conn = init()
+        r = conn.execute("""
+            SELECT FROM
+                Standard1
+            WHERE
+                KEY = "ka" AND KEY = "kd" AND KEY = "kb"
+        """)
+        for result in r:
+            assert result['key'] in ("ka", "kd", "kb")
+            assert len(result['columns']) == 2
+
+    #def test_select_row_range(self):
+    #    "retrieve a range of rows with columns"
+    #    conn = init()
+    #    r = conn.execute("""
+    #        SELECT FROM Standard1Long WHERE KEY > "ad" AND KEY < "ag";
+    #    """)