|
6 | 6 | class TestQueryBuilder(unittest.TestCase):
|
7 | 7 | def test_query_builder(self):
|
8 | 8 | db = DAL("sqlite:memory")
|
9 |
| - db.define_table("thing", Field("name")) |
10 |
| - builder = QueryBuilder(db.think) |
| 9 | + db.define_table("thing", Field("name"), Field("solid", "boolean")) |
| 10 | + builder = QueryBuilder(db.thing) |
11 | 11 | query = builder.parse("name is null")
|
12 | 12 | self.assertEqual(str(query), '("thing"."name" IS NULL)')
|
13 | 13 | query = builder.parse("name is not null")
|
14 | 14 | self.assertEqual(str(query), '("thing"."name" IS NOT NULL)')
|
15 |
| - query = builder.parse("name is Max") |
16 |
| - self.assertEqual(str(query), '("thing"."name" = \'Max\')') |
17 |
| - query = builder.parse("name is equal to Max") |
18 |
| - self.assertEqual(str(query), '("thing"."name" = \'Max\')') |
19 |
| - query = builder.parse("name == Max") |
20 |
| - self.assertEqual(str(query), '("thing"."name" = \'Max\')') |
21 |
| - query = builder.parse('name == "Max"') |
22 |
| - self.assertEqual(str(query), '("thing"."name" = \'Max\')') |
23 |
| - query = builder.parse('name == "Ma\\"x"') |
24 |
| - self.assertEqual(str(query), '("thing"."name" = \'Ma\\"x\')') |
25 |
| - query = builder.parse('name != "Max"') |
26 |
| - self.assertEqual(str(query), '("thing"."name" <> \'Max\')') |
27 |
| - query = builder.parse('name < "Max"') |
28 |
| - self.assertEqual(str(query), '("thing"."name" < \'Max\')') |
29 |
| - query = builder.parse('name > "Max"') |
30 |
| - self.assertEqual(str(query), '("thing"."name" > \'Max\')') |
31 |
| - query = builder.parse('name <= "Max"') |
32 |
| - self.assertEqual(str(query), '("thing"."name" <= \'Max\')') |
33 |
| - query = builder.parse('name >= "Max"') |
34 |
| - self.assertEqual(str(query), '("thing"."name" >= \'Max\')') |
35 |
| - query = builder.parse("name in Max, John") |
36 |
| - self.assertEqual(str(query), "(\"thing\".\"name\" IN ('John','Max'))") |
37 |
| - query = builder.parse("name belongs Max, John") |
38 |
| - self.assertEqual(str(query), "(\"thing\".\"name\" IN ('John','Max'))") |
39 |
| - query = builder.parse('name belongs "Max", "John"') |
40 |
| - self.assertEqual(str(query), '("thing"."name" IN (\'Max", "John\'))') |
41 |
| - query = builder.parse('name contains "Max"') |
| 15 | + query = builder.parse("solid is true") |
| 16 | + self.assertEqual(str(query), '("thing"."solid" = \'T\')') |
| 17 | + query = builder.parse("solid is false") |
| 18 | + self.assertEqual(str(query), '("thing"."solid" = \'F\')') |
| 19 | + query = builder.parse("name is Chair") |
| 20 | + self.assertEqual(str(query), '("thing"."name" = \'Chair\')') |
| 21 | + query = builder.parse("name is equal to Chair") |
| 22 | + self.assertEqual(str(query), '("thing"."name" = \'Chair\')') |
| 23 | + query = builder.parse("name == Chair") |
| 24 | + self.assertEqual(str(query), '("thing"."name" = \'Chair\')') |
| 25 | + query = builder.parse('name == "Chair"') |
| 26 | + self.assertEqual(str(query), '("thing"."name" = \'Chair\')') |
| 27 | + query = builder.parse('name == "Cha\\"ir"') |
| 28 | + self.assertEqual(str(query), '("thing"."name" = \'Cha\\"ir\')') |
| 29 | + query = builder.parse('name != "Chair"') |
| 30 | + self.assertEqual(str(query), '("thing"."name" <> \'Chair\')') |
| 31 | + query = builder.parse('name < "Chair"') |
| 32 | + self.assertEqual(str(query), '("thing"."name" < \'Chair\')') |
| 33 | + query = builder.parse('name > "Chair"') |
| 34 | + self.assertEqual(str(query), '("thing"."name" > \'Chair\')') |
| 35 | + query = builder.parse('name <= "Chair"') |
| 36 | + self.assertEqual(str(query), '("thing"."name" <= \'Chair\')') |
| 37 | + query = builder.parse('name >= "Chair"') |
| 38 | + self.assertEqual(str(query), '("thing"."name" >= \'Chair\')') |
| 39 | + query = builder.parse("name in Chair, John") |
| 40 | + self.assertEqual(str(query), "(\"thing\".\"name\" IN ('John','Chair'))") |
| 41 | + query = builder.parse("name belongs Chair, John") |
| 42 | + self.assertEqual(str(query), "(\"thing\".\"name\" IN ('John','Chair'))") |
| 43 | + query = builder.parse('name belongs "Chair", "John"') |
| 44 | + self.assertEqual(str(query), '("thing"."name" IN (\'Chair", "John\'))') |
| 45 | + query = builder.parse('name contains "Chair"') |
42 | 46 | self.assertEqual(
|
43 |
| - str(query), "(LOWER(\"thing\".\"name\") LIKE '%max%' ESCAPE '\\')" |
| 47 | + str(query), "(LOWER(\"thing\".\"name\") LIKE '%chair%' ESCAPE '\\')" |
44 | 48 | )
|
45 |
| - query = builder.parse('name startswith "Max"') |
46 |
| - self.assertEqual(str(query), "(\"thing\".\"name\" LIKE 'Max%' ESCAPE '\\')") |
47 |
| - query = builder.parse('name starts with "Max"') |
48 |
| - self.assertEqual(str(query), "(\"thing\".\"name\" LIKE 'Max%' ESCAPE '\\')") |
49 |
| - query = builder.parse("name lower == max") |
50 |
| - self.assertEqual(str(query), '(LOWER("thing"."name") = \'max\')') |
51 |
| - query = builder.parse("name lower is equal to max") |
52 |
| - self.assertEqual(str(query), '(LOWER("thing"."name") = \'max\')') |
53 |
| - query = builder.parse("name upper == MAX") |
54 |
| - self.assertEqual(str(query), '(UPPER("thing"."name") = \'MAX\')') |
55 |
| - query = builder.parse("not name == Max") |
56 |
| - self.assertEqual(str(query), '(NOT ("thing"."name" = \'Max\'))') |
| 49 | + query = builder.parse('name startswith "Chair"') |
| 50 | + self.assertEqual(str(query), "(\"thing\".\"name\" LIKE 'Chair%' ESCAPE '\\')") |
| 51 | + query = builder.parse('name starts with "Chair"') |
| 52 | + self.assertEqual(str(query), "(\"thing\".\"name\" LIKE 'Chair%' ESCAPE '\\')") |
| 53 | + query = builder.parse("name lower == chair") |
| 54 | + self.assertEqual(str(query), '(LOWER("thing"."name") = \'chair\')') |
| 55 | + query = builder.parse("name lower is equal to chair") |
| 56 | + self.assertEqual(str(query), '(LOWER("thing"."name") = \'chair\')') |
| 57 | + query = builder.parse("name upper == CHAIR") |
| 58 | + self.assertEqual(str(query), '(UPPER("thing"."name") = \'CHAIR\')') |
| 59 | + query = builder.parse("not name == Chair") |
| 60 | + self.assertEqual(str(query), '(NOT ("thing"."name" = \'Chair\'))') |
57 | 61 |
|
58 |
| - query = builder.parse("not (name == Max)") |
59 |
| - self.assertEqual(str(query), '(NOT ("thing"."name" = \'Max\'))') |
| 62 | + query = builder.parse("not (name == Chair)") |
| 63 | + self.assertEqual(str(query), '(NOT ("thing"."name" = \'Chair\'))') |
60 | 64 |
|
61 |
| - query = builder.parse("name == Max or name is John") |
| 65 | + query = builder.parse("name == Chair or name is John") |
62 | 66 | self.assertEqual(
|
63 |
| - str(query), '(("thing"."name" = \'Max\') OR ("thing"."name" = \'John\'))' |
| 67 | + str(query), '(("thing"."name" = \'Chair\') OR ("thing"."name" = \'John\'))' |
64 | 68 | )
|
65 | 69 |
|
66 |
| - query = builder.parse("name == Max and not name is John") |
| 70 | + query = builder.parse("name == Chair and not name is John") |
67 | 71 | self.assertEqual(
|
68 | 72 | str(query),
|
69 |
| - '(("thing"."name" = \'Max\') AND (NOT ("thing"."name" = \'John\')))', |
| 73 | + '(("thing"."name" = \'Chair\') AND (NOT ("thing"."name" = \'John\')))', |
70 | 74 | )
|
71 | 75 |
|
72 |
| - query = builder.parse("not ((name == Max) and not (name == John))") |
| 76 | + query = builder.parse("not ((name == Chair) and not (name == John))") |
73 | 77 | self.assertEqual(
|
74 | 78 | str(query),
|
75 |
| - '(NOT (("thing"."name" = \'Max\') AND (NOT ("thing"."name" = \'John\'))))', |
| 79 | + '(NOT (("thing"."name" = \'Chair\') AND (NOT ("thing"."name" = \'John\'))))', |
76 | 80 | )
|
| 81 | + |
| 82 | + def test_translations(self): |
| 83 | + db = DAL("sqlite:memory") |
| 84 | + db.define_table("thing", Field("name")) |
| 85 | + field_aliases = {"id": "id", "nome": "name"} |
| 86 | + token_aliases = {"non è nullo": "is not null", "è uguale a": "=="} |
| 87 | + builder = QueryBuilder( |
| 88 | + db.thing, field_aliases=field_aliases, token_aliases=token_aliases |
| 89 | + ) |
| 90 | + |
| 91 | + query = builder.parse("nome non è nullo") |
| 92 | + self.assertEqual(str(query), '("thing"."name" IS NOT NULL)') |
| 93 | + query = builder.parse("nome è uguale a Chair") |
| 94 | + self.assertEqual(str(query), '("thing"."name" = \'Chair\')') |
0 commit comments