| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #
- # Copyright 2013 Metamarkets Group Inc.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- try:
- import simplejson as json
- except ImportError:
- import json
- class Having:
- def __init__(self, **args):
- if args['type'] in ('equalTo', 'lessThan', 'greaterThan'):
- self.having = {'having': {'type': args['type'],
- 'aggregation': args['aggregation'],
- 'value': args['value']}}
- elif args['type'] == 'and':
- self.having = {'having': {'type': 'and',
- 'havingSpecs': args['havingSpecs']}}
- elif args['type'] == 'or':
- self.having = {'having': {'type': 'or',
- 'havingSpecs': args['havingSpecs']}}
- elif args['type'] == 'not':
- self.having = {'having': {'type': 'not',
- 'havingSpec': args['havingSpec']}}
- else:
- raise NotImplemented(
- 'Having type: {0} does not exist'.format(args['type']))
- def show(self):
- print(json.dumps(self.having, indent=4))
- def _combine(self, typ, x):
- # collapse nested and/ors
- if self.having['having']['type'] == typ:
- havingSpecs = self.having['having']['havingSpecs'] + [x.having['having']]
- return Having(type=typ, havingSpecs=havingSpecs)
- elif x.having['having']['type'] == typ:
- havingSpecs = [self.having['having']] + x.having['having']['havingSpecs']
- return Having(type=typ, havingSpecs=havingSpecs)
- else:
- return Having(type=typ,
- havingSpecs=[self.having['having'], x.having['having']])
- def __and__(self, x):
- return self._combine('and', x)
- def __or__(self, x):
- return self._combine('or', x)
- def __invert__(self):
- return Having(type='not', havingSpec=self.having['having'])
- @staticmethod
- def build_having(having_obj):
- return having_obj.having['having']
- class Aggregation:
- def __init__(self, agg):
- self.aggregation = agg
- def __eq__(self, other):
- return Having(type='equalTo', aggregation=self.aggregation, value=other)
- def __lt__(self, other):
- return Having(type='lessThan', aggregation=self.aggregation, value=other)
- def __gt__(self, other):
- return Having(type='greaterThan', aggregation=self.aggregation, value=other)
|