diff options
author | Jordan Augé <jordan.auge+fdio@email.com> | 2017-02-24 14:58:01 +0100 |
---|---|---|
committer | Jordan Augé <jordan.auge+fdio@cisco.com> | 2017-02-24 18:36:29 +0000 |
commit | 85a341d645b57b7cd88a26ed2ea0a314704240ea (patch) | |
tree | bdda2b35003aae20103a796f86daced160b8a730 /netmodel/model/query.py | |
parent | 9b30fc10fb1cbebe651e5a107e8ca5b24de54675 (diff) |
Initial commit: vICN
Change-Id: I7ce66c4e84a6a1921c63442f858b49e083adc7a7
Signed-off-by: Jordan Augé <jordan.auge+fdio@cisco.com>
Diffstat (limited to 'netmodel/model/query.py')
-rw-r--r-- | netmodel/model/query.py | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/netmodel/model/query.py b/netmodel/model/query.py new file mode 100644 index 00000000..c182cb45 --- /dev/null +++ b/netmodel/model/query.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2017 Cisco and/or its affiliates. +# +# 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. +# + +from netmodel.model.filter import Filter +from netmodel.model.field_names import FieldNames + +ACTION_INSERT = 1 +ACTION_SELECT = 2 +ACTION_UPDATE = 3 +ACTION_DELETE = 4 +ACTION_EXECUTE = 5 +ACTION_SUBSCRIBE = 6 +ACTION_UNSUBSCRIBE = 7 + +ACTION2STR = { + ACTION_INSERT : 'insert', + ACTION_SELECT : 'select', + ACTION_UPDATE : 'update', + ACTION_DELETE : 'delete', + ACTION_EXECUTE : 'execute', + ACTION_SUBSCRIBE : 'subscribe', + ACTION_UNSUBSCRIBE : 'unsubscribe', +} +STR2ACTION = dict((v, k) for k, v in ACTION2STR.items()) + +FUNCTION_SUM = 1 + +FUNCTION2STR = { + FUNCTION_SUM : 'sum' +} +STR2FUNCTION = dict((v, k) for k, v in FUNCTION2STR.items()) + +class Query: + def __init__(self, action, object_name, filter = None, params = None, + field_names = None, aggregate = None, last = False, reply = False): + self.action = action + self.object_name = object_name + + if filter: + if isinstance(filter, Filter): + self.filter = filter + else: + self.filter = Filter.from_list(filter) + else: + self.filter = Filter() + + self.params = params + + if field_names: + if isinstance(field_names, FieldNames): + self.field_names = field_names + else: + self.field_names = FieldNames(field_names) + else: + self.field_names = FieldNames() + + self.aggregate = aggregate + + self.last = last + self.reply = reply + + def to_dict(self): + aggregate = FUNCTION2STR[self.aggregate] if self.aggregate else None + return { + 'action': ACTION2STR[self.action], + 'object_name': self.object_name, + 'filter': self.filter.to_list(), + 'params': self.params, + 'field_names': self.field_names, + 'aggregate': aggregate, + 'reply': self.reply, + 'last': self.last + } + + @staticmethod + def from_dict(dic): + action = STR2ACTION[dic.get('action').lower()] + object_name = dic.get('object_name') + filter = dic.get('filter', None) + params = dic.get('params', None) + field_names = dic.get('field_names', None) + aggregate = STR2FUNCTION[dic.get('aggregate').lower()] \ + if dic.get('aggregate') else None + if field_names == '*': + field_names = FieldNames(star = True) + last = dic.get('last', False) + reply = dic.get('reply', False) + return Query(action, object_name, filter, params, field_names, + aggregate, last) + + def to_sql(self, multiline = False): + """ + Args: + platform: A String corresponding to a namespace (or platform name) + multiline: A boolean indicating whether the String could contain + carriage return. + Returns: + The String representing this Query. + """ + get_params_str = lambda : ", ".join(["%s = %r" % (k, v) \ + for k, v in self.params.items()]) + + object_name = self.object_name + field_names = self.field_names + field_names_str = ('*' if field_names.is_star() \ + else ', '.join([field for field in field_names])) + select = "SELECT %s" % ((FUNCTION2STR[self.aggregate] + "(%s)") \ + if self.aggregate else '%s') % field_names_str + filter = "WHERE %s" % self.filter if self.filter else '' + #at = "AT %s" % self.get_timestamp() if self.get_timestamp() else "" + at = '' + params = "SET %s" % get_params_str() if self.params else '' + + sep = " " if not multiline else "\n " + + strmap = { + ACTION_SELECT : "%(select)s%(sep)s%(at)s%(sep)sFROM %(object_name)s%(sep)s%(filter)s", + ACTION_UPDATE : "UPDATE %(object_name)s%(sep)s%(params)s%(sep)s%(filter)s%(sep)s%(select)s", + ACTION_INSERT : "INSERT INTO %(object_name)s%(sep)s%(params)s", + ACTION_DELETE : "DELETE FROM %(object_name)s%(sep)s%(filter)s", + ACTION_SUBSCRIBE : "SUBSCRIBE : %(select)s%(sep)s%(at)s%(sep)sFROM %(object_name)s%(sep)s%(filter)s", + ACTION_UNSUBSCRIBE : "UNSUBSCRIBE : %(select)s%(sep)s%(at)s%(sep)sFROM %(object_name)s%(sep)s%(filter)s", + ACTION_EXECUTE : "EXECUTE : %(select)s%(sep)s%(at)s%(sep)sFROM %(object_name)s%(sep)s%(filter)s", + } + + return strmap[self.action] % locals() + + def __str__(self): + return self.to_sql() + + def __repr__(self): + return self.to_sql() |