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";
+ # """)