# See the License for the specific language governing permissions and
# limitations under the License.
+import re
from sqlalchemy.sql.elements import ColumnElement
+from o2common.views.route_exception import BadRequestException
+from o2common.domain.filter import gen_orm_filter
+
from o2common.helper import o2logging
logger = o2logging.get_logger(__name__)
def gen_filter(obj: ColumnElement, filter_str: str):
- if filter_str == '':
- return []
+ check_filter(obj, filter_str)
+ try:
+ filter_list = gen_orm_filter(obj, filter_str)
+ except KeyError as e:
+ raise BadRequestException(e.args[0])
+ return filter_list
+
+
+# The regular expressions testing example put on here
+# (neq,testkey,value-1)
+# (neq,testkey,value-1,value-2)
+# (gt,hello,1)
+# (gte,world,2)
+# (lt,testlt,notint)
+# (ncont,key1,v1,v_2)
+# (gt,hello,1);(ncont,world,val1,val-2)
+# (eq,wrong,60cba7be-e2cd-3b8c-a7ff-16e0f10573f9)
+# (eq,description,value key)
+def check_filter(obj: ColumnElement, filter_str: str):
+ if not filter_str:
+ return
+ pattern = r'^(\((eq|neq|gt|lt|gte|lte){1},\w+,[\w -]+\)\;?|' +\
+ r'\((in|nin|cont|ncont){1},\w*(,[\w -]*)*\)\;?)+'
+ result = re.match(pattern, filter_str)
+ logger.warning('filter: {} match result is {}'.format(filter_str, result))
+ if not result:
+ raise BadRequestException(
+ 'filter value formater not correct.')
+ check_filter_attribute(obj, filter_str)
+
+
+def check_filter_attribute(obj: ColumnElement, filter_str: str):
filter_without_space = filter_str.replace(" ", "")
items = filter_without_space.split(';')
- filter_list = list()
for i in items:
if '(' in i:
i = i.replace("(", "")
i = i.replace(")", "")
filter_expr = i.split(',')
if len(filter_expr) < 3:
+ raise BadRequestException(
+ 'Filter {} formater not correct.'.format(i))
continue
- filter_op = filter_expr[0]
+ # filter_op = filter_expr[0]
filter_key = filter_expr[1]
- filter_vals = filter_expr[2:]
- filter_list.extend(toFilterArgs(
- filter_op, obj, filter_key, filter_vals))
- logger.info('Filter list length: %d' % len(filter_list))
- return filter_list
-
-
-def toFilterArgs(operation: str, obj: ColumnElement, key: str, values: list):
- if not hasattr(obj, key):
- logger.warning('Filter attrName %s not in Object %s.' %
- (key, str(obj)))
- return []
-
- ll = list()
- if operation == 'eq':
- for val in values:
- if val.lower() == 'null':
- val = None
- ll.append(getattr(obj, key) == val)
- elif operation == 'neq':
- for val in values:
- if val.lower() == 'null':
- val = None
- ll.append(getattr(obj, key) != val)
- elif operation == 'gt':
- for val in values:
- ll.append(getattr(obj, key) > val)
- elif operation == 'lt':
- for val in values:
- ll.append(getattr(obj, key) < val)
- elif operation == 'gte':
- for val in values:
- ll.append(getattr(obj, key) >= val)
- elif operation == 'lte':
- for val in values:
- ll.append(getattr(obj, key) <= val)
- elif operation == 'in':
- pass
- elif operation == 'nin':
- pass
- elif operation == 'count':
- pass
- elif operation == 'ncount':
- pass
- else:
- raise KeyError('Filter operation value not support.')
-
- return ll
+ # filter_vals = filter_expr[2:]
+ if not hasattr(obj, filter_key):
+ raise BadRequestException(
+ 'Filter attrName {} not in the Object'.format(filter_key))