Statistics
| Branch: | Tag: | Revision:

root / lib / qlang.py @ 3b877f08

History | View | Annotate | Download (2.7 kB)

1 a123dc19 Michael Hanselmann
#
2 a123dc19 Michael Hanselmann
#
3 a123dc19 Michael Hanselmann
4 a123dc19 Michael Hanselmann
# Copyright (C) 2010 Google Inc.
5 a123dc19 Michael Hanselmann
#
6 a123dc19 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 a123dc19 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 a123dc19 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 a123dc19 Michael Hanselmann
# (at your option) any later version.
10 a123dc19 Michael Hanselmann
#
11 a123dc19 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 a123dc19 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a123dc19 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a123dc19 Michael Hanselmann
# General Public License for more details.
15 a123dc19 Michael Hanselmann
#
16 a123dc19 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 a123dc19 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 a123dc19 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a123dc19 Michael Hanselmann
# 02110-1301, USA.
20 a123dc19 Michael Hanselmann
21 a123dc19 Michael Hanselmann
22 a123dc19 Michael Hanselmann
"""Module for a simple query language"""
23 a123dc19 Michael Hanselmann
24 a123dc19 Michael Hanselmann
from ganeti import errors
25 a123dc19 Michael Hanselmann
26 a123dc19 Michael Hanselmann
27 88076fd1 Michael Hanselmann
# Logic operators
28 a123dc19 Michael Hanselmann
OP_OR = "|"
29 88076fd1 Michael Hanselmann
OP_AND = "&"
30 88076fd1 Michael Hanselmann
31 88076fd1 Michael Hanselmann
32 88076fd1 Michael Hanselmann
# Unary operators
33 88076fd1 Michael Hanselmann
OP_NOT = "!"
34 3b877f08 Michael Hanselmann
OP_TRUE = "?"
35 88076fd1 Michael Hanselmann
36 88076fd1 Michael Hanselmann
37 88076fd1 Michael Hanselmann
# Binary operators
38 a123dc19 Michael Hanselmann
OP_EQUAL = "="
39 88076fd1 Michael Hanselmann
OP_NOT_EQUAL = "!="
40 88076fd1 Michael Hanselmann
OP_GLOB = "=*"
41 88076fd1 Michael Hanselmann
OP_REGEXP = "=~"
42 88076fd1 Michael Hanselmann
OP_CONTAINS = "=[]"
43 a123dc19 Michael Hanselmann
44 a123dc19 Michael Hanselmann
45 a123dc19 Michael Hanselmann
def ReadSimpleFilter(namefield, filter_):
46 a123dc19 Michael Hanselmann
  """Function extracting wanted names from restricted filter.
47 a123dc19 Michael Hanselmann

48 a123dc19 Michael Hanselmann
  This should only be used until proper filtering is implemented. The filter
49 a123dc19 Michael Hanselmann
  must either be empty or of the format C{["|", ["=", field, "name1"], ["=",
50 a123dc19 Michael Hanselmann
  field, "name2"], ...]}.
51 a123dc19 Michael Hanselmann

52 a123dc19 Michael Hanselmann
  """
53 a123dc19 Michael Hanselmann
  if filter_ is None:
54 a123dc19 Michael Hanselmann
    return []
55 a123dc19 Michael Hanselmann
56 a123dc19 Michael Hanselmann
  if not isinstance(filter_, list):
57 a123dc19 Michael Hanselmann
    raise errors.ParameterError("Filter should be list")
58 a123dc19 Michael Hanselmann
59 a123dc19 Michael Hanselmann
  if not filter_ or filter_[0] != OP_OR:
60 a123dc19 Michael Hanselmann
    raise errors.ParameterError("Filter should start with OR operator")
61 a123dc19 Michael Hanselmann
62 a123dc19 Michael Hanselmann
  if len(filter_) < 2:
63 a123dc19 Michael Hanselmann
    raise errors.ParameterError("Invalid filter, OR operator should have"
64 a123dc19 Michael Hanselmann
                                " operands")
65 a123dc19 Michael Hanselmann
66 a123dc19 Michael Hanselmann
  result = []
67 a123dc19 Michael Hanselmann
68 a123dc19 Michael Hanselmann
  for idx, item in enumerate(filter_[1:]):
69 a123dc19 Michael Hanselmann
    if not isinstance(item, list):
70 a123dc19 Michael Hanselmann
      raise errors.ParameterError("Invalid OR operator, operand %s not a"
71 a123dc19 Michael Hanselmann
                                  " list" % idx)
72 a123dc19 Michael Hanselmann
73 a123dc19 Michael Hanselmann
    if len(item) != 3 or item[0] != OP_EQUAL:
74 a123dc19 Michael Hanselmann
      raise errors.ParameterError("Invalid OR operator, operand %s is not an"
75 a123dc19 Michael Hanselmann
                                  " equality filter" % idx)
76 a123dc19 Michael Hanselmann
77 a123dc19 Michael Hanselmann
    (_, name, value) = item
78 a123dc19 Michael Hanselmann
79 a123dc19 Michael Hanselmann
    if not isinstance(value, basestring):
80 a123dc19 Michael Hanselmann
      raise errors.ParameterError("Operand %s for OR should compare against a"
81 a123dc19 Michael Hanselmann
                                  " string" % idx)
82 a123dc19 Michael Hanselmann
83 a123dc19 Michael Hanselmann
    if name != namefield:
84 a123dc19 Michael Hanselmann
      raise errors.ParameterError("Operand %s for OR should filter field '%s',"
85 a123dc19 Michael Hanselmann
                                  " not '%s'" % (idx, namefield, name))
86 a123dc19 Michael Hanselmann
87 a123dc19 Michael Hanselmann
    result.append(value)
88 a123dc19 Michael Hanselmann
89 a123dc19 Michael Hanselmann
  return result
90 60cba7f8 Michael Hanselmann
91 60cba7f8 Michael Hanselmann
92 60cba7f8 Michael Hanselmann
def MakeSimpleFilter(namefield, values):
93 60cba7f8 Michael Hanselmann
  """Builds a filter for use with L{ReadSimpleFilter}.
94 60cba7f8 Michael Hanselmann

95 60cba7f8 Michael Hanselmann
  @param namefield: Name of field containing item name
96 60cba7f8 Michael Hanselmann
  @param values: List of names
97 60cba7f8 Michael Hanselmann

98 60cba7f8 Michael Hanselmann
  """
99 60cba7f8 Michael Hanselmann
  if values:
100 60cba7f8 Michael Hanselmann
    return [OP_OR] + [[OP_EQUAL, namefield, i] for i in values]
101 60cba7f8 Michael Hanselmann
102 60cba7f8 Michael Hanselmann
  return None