Files
neutron-lib/neutron_lib/objects/utils.py
Hongbin Lu dafbd30ef8 Support custom filters in OVO
In sqlalchemy, there are some advanced filter criterion but
such filter criterion is not supported in OVO. An example
is the "not in" criterion which is achieved by
"query.filter(~db_model.column.in_(values))". Another example
is the "not equal" criterion which is achieved by
"query.filter(db_model.column != value)"

This commit adds support for custom filtering. We introduce
a base class called "FilterObj" from which the custom
filter class should inherit. This commit also implements two filter
class: one for implementing the "not in" criterion and the other for
the "not equal" criterion. In addition, it makes StringMatchingFilterObj
inherit from the FilterObj class.

Needed-By: https://review.openstack.org/#/c/609848/

Change-Id: I9ac7fb000d2bed445efbc226c30abdcd981b90cb
Partial-Implements: blueprint adopt-oslo-versioned-objects-for-db
2018-10-29 15:27:50 +00:00

101 lines
2.4 KiB
Python

# 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.
import abc
import copy
import six
from neutron_lib import exceptions
def convert_filters(**kwargs):
result = copy.deepcopy(kwargs)
if 'tenant_id' in result:
if 'project_id' in result:
raise exceptions.TenantIdProjectIdFilterConflict()
result['project_id'] = result.pop('tenant_id')
return result
@six.add_metaclass(abc.ABCMeta)
class FilterObj(object):
@abc.abstractmethod
def filter(self, column):
pass
class StringMatchingFilterObj(FilterObj):
@property
def is_contains(self):
return bool(getattr(self, "contains", False))
@property
def is_starts(self):
return bool(getattr(self, "starts", False))
@property
def is_ends(self):
return bool(getattr(self, "ends", False))
class StringContains(StringMatchingFilterObj):
def __init__(self, matching_string):
super(StringContains, self).__init__()
self.contains = matching_string
def filter(self, column):
return column.contains(self.contains)
class StringStarts(StringMatchingFilterObj):
def __init__(self, matching_string):
super(StringStarts, self).__init__()
self.starts = matching_string
def filter(self, column):
return column.startswith(self.starts)
class StringEnds(StringMatchingFilterObj):
def __init__(self, matching_string):
super(StringEnds, self).__init__()
self.ends = matching_string
def filter(self, column):
return column.endswith(self.ends)
class NotIn(FilterObj):
def __init__(self, value):
super(NotIn, self).__init__()
self.value = value
def filter(self, column):
return ~column.in_(self.value)
class NotEqual(FilterObj):
def __init__(self, value):
super(NotEqual, self).__init__()
self.value = value
def filter(self, column):
return column != self.value