170 lines
3.8 KiB
Python
170 lines
3.8 KiB
Python
# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/
|
|
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
# copy of this software and associated documentation files (the
|
|
# "Software"), to deal in the Software without restriction, including
|
|
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
|
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
|
# persons to whom the Software is furnished to do so, subject to the fol-
|
|
# lowing conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included
|
|
# in all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
|
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
# IN THE SOFTWARE.
|
|
#
|
|
|
|
from boto.dynamodb.types import dynamize_value
|
|
|
|
|
|
class Condition(object):
|
|
"""
|
|
Base class for conditions. Doesn't do a darn thing but allows
|
|
is to test if something is a Condition instance or not.
|
|
"""
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, Condition):
|
|
return self.to_dict() == other.to_dict()
|
|
|
|
class ConditionNoArgs(Condition):
|
|
"""
|
|
Abstract class for Conditions that require no arguments, such
|
|
as NULL or NOT_NULL.
|
|
"""
|
|
|
|
def __repr__(self):
|
|
return '%s' % self.__class__.__name__
|
|
|
|
def to_dict(self):
|
|
return {'ComparisonOperator': self.__class__.__name__}
|
|
|
|
|
|
class ConditionOneArg(Condition):
|
|
"""
|
|
Abstract class for Conditions that require a single argument
|
|
such as EQ or NE.
|
|
"""
|
|
|
|
def __init__(self, v1):
|
|
self.v1 = v1
|
|
|
|
def __repr__(self):
|
|
return '%s:%s' % (self.__class__.__name__, self.v1)
|
|
|
|
def to_dict(self):
|
|
return {'AttributeValueList': [dynamize_value(self.v1)],
|
|
'ComparisonOperator': self.__class__.__name__}
|
|
|
|
|
|
class ConditionTwoArgs(Condition):
|
|
"""
|
|
Abstract class for Conditions that require two arguments.
|
|
The only example of this currently is BETWEEN.
|
|
"""
|
|
|
|
def __init__(self, v1, v2):
|
|
self.v1 = v1
|
|
self.v2 = v2
|
|
|
|
def __repr__(self):
|
|
return '%s(%s, %s)' % (self.__class__.__name__, self.v1, self.v2)
|
|
|
|
def to_dict(self):
|
|
values = (self.v1, self.v2)
|
|
return {'AttributeValueList': [dynamize_value(v) for v in values],
|
|
'ComparisonOperator': self.__class__.__name__}
|
|
|
|
|
|
class ConditionSeveralArgs(Condition):
|
|
"""
|
|
Abstract class for conditions that require several argument (ex: IN).
|
|
"""
|
|
|
|
def __init__(self, values):
|
|
self.values = values
|
|
|
|
def __repr__(self):
|
|
return '{0}({1})'.format(self.__class__.__name__,
|
|
', '.join(self.values))
|
|
|
|
def to_dict(self):
|
|
return {'AttributeValueList': [dynamize_value(v) for v in self.values],
|
|
'ComparisonOperator': self.__class__.__name__}
|
|
|
|
|
|
class EQ(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class NE(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class LE(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class LT(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class GE(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class GT(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class NULL(ConditionNoArgs):
|
|
|
|
pass
|
|
|
|
|
|
class NOT_NULL(ConditionNoArgs):
|
|
|
|
pass
|
|
|
|
|
|
class CONTAINS(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class NOT_CONTAINS(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class BEGINS_WITH(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class IN(ConditionSeveralArgs):
|
|
|
|
pass
|
|
|
|
|
|
class BEGINS_WITH(ConditionOneArg):
|
|
|
|
pass
|
|
|
|
|
|
class BETWEEN(ConditionTwoArgs):
|
|
|
|
pass
|