testing min and max timeuuid functions with related debugging

This commit is contained in:
Blake Eggleston
2013-03-02 17:13:51 -08:00
parent 320682c76d
commit b4e09a324c
4 changed files with 68 additions and 2 deletions

View File

@@ -20,6 +20,9 @@ class BaseQueryFunction(object):
"""
return self._cql_string.format(value_id)
def get_value(self):
raise NotImplementedError
class MinTimeUUID(BaseQueryFunction):
_cql_string = 'MinTimeUUID(:{})'
@@ -33,6 +36,10 @@ class MinTimeUUID(BaseQueryFunction):
raise ValidationError('datetime instance is required')
super(MinTimeUUID, self).__init__(value)
def get_value(self):
epoch = datetime(1970, 1, 1)
return long((self.value - epoch).total_seconds() * 1000)
class MaxTimeUUID(BaseQueryFunction):
_cql_string = 'MaxTimeUUID(:{})'
@@ -46,3 +53,7 @@ class MaxTimeUUID(BaseQueryFunction):
raise ValidationError('datetime instance is required')
super(MaxTimeUUID, self).__init__(value)
def get_value(self):
epoch = datetime(1970, 1, 1)
return long((self.value - epoch).total_seconds() * 1000)

View File

@@ -78,7 +78,10 @@ class QueryOperator(object):
this should return the dict: {'colval':<self.value>}
SELECT * FROM column_family WHERE colname=:colval
"""
return {self.identifier: self.column.to_database(self.value)}
if isinstance(self.value, BaseQueryFunction):
return {self.identifier: self.column.to_database(self.value.get_value())}
else:
return {self.identifier: self.column.to_database(self.value)}
@classmethod
def get_operator(cls, symbol):

View File

@@ -1,7 +1,8 @@
from datetime import datetime
import time
from cqlengine.tests.base import BaseCassEngTestCase
from cqlengine import columns
from cqlengine import columns, Model
from cqlengine import functions
from cqlengine import query
@@ -30,3 +31,4 @@ class TestQuerySetOperation(BaseCassEngTestCase):
assert qry.cql == '"time" = MinTimeUUID(:{})'.format(qry.identifier)

View File

@@ -1,6 +1,11 @@
from datetime import datetime
import time
from uuid import uuid1, uuid4
from cqlengine.tests.base import BaseCassEngTestCase
from cqlengine.exceptions import ModelException
from cqlengine import functions
from cqlengine.management import create_table
from cqlengine.management import delete_table
from cqlengine.models import Model
@@ -386,6 +391,51 @@ class TestQuerySetConnectionHandling(BaseQuerySetUsage):
del q
assert ConnectionPool._queue.qsize() == 1
class TimeUUIDQueryModel(Model):
partition = columns.UUID(primary_key=True)
time = columns.TimeUUID(primary_key=True)
data = columns.Text(required=False)
class TestMinMaxTimeUUIDFunctions(BaseCassEngTestCase):
@classmethod
def setUpClass(cls):
super(TestMinMaxTimeUUIDFunctions, cls).setUpClass()
create_table(TimeUUIDQueryModel)
@classmethod
def tearDownClass(cls):
super(TestMinMaxTimeUUIDFunctions, cls).tearDownClass()
delete_table(TimeUUIDQueryModel)
def test_success_case(self):
""" Test that the min and max time uuid functions work as expected """
pk = uuid4()
TimeUUIDQueryModel.create(partition=pk, time=uuid1(), data='1')
time.sleep(0.2)
TimeUUIDQueryModel.create(partition=pk, time=uuid1(), data='2')
time.sleep(0.2)
midpoint = datetime.utcnow()
time.sleep(0.2)
TimeUUIDQueryModel.create(partition=pk, time=uuid1(), data='3')
time.sleep(0.2)
TimeUUIDQueryModel.create(partition=pk, time=uuid1(), data='4')
time.sleep(0.2)
q = TimeUUIDQueryModel.filter(partition=pk, time__lte=functions.MaxTimeUUID(midpoint))
q = [d for d in q]
assert len(q) == 2
datas = [d.data for d in q]
assert '1' in datas
assert '2' in datas
q = TimeUUIDQueryModel.filter(partition=pk, time__gte=functions.MinTimeUUID(midpoint))
assert len(q) == 2
datas = [d.data for d in q]
assert '3' in datas
assert '4' in datas