Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: appengine/monorail/search/test/ast2select_test.py

Issue 1868553004: Open Source Monorail (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is govered by a BSD-style
3 # license that can be found in the LICENSE file or at
4 # https://developers.google.com/open-source/licenses/bsd
5
6 """Tests for the ast2select module."""
7
8 import unittest
9
10 from proto import ast_pb2
11 from proto import tracker_pb2
12 from search import ast2select
13 from search import query2ast
14 from tracker import tracker_bizobj
15
16
17 BUILTIN_ISSUE_FIELDS = query2ast.BUILTIN_ISSUE_FIELDS
18 ANY_FIELD = query2ast.BUILTIN_ISSUE_FIELDS['any_field']
19
20
21 class AST2SelectTest(unittest.TestCase):
22
23 def setUp(self):
24 self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
25
26 def testBuildSQLQuery_EmptyAST(self):
27 ast = ast_pb2.QueryAST(conjunctions=[ast_pb2.Conjunction()]) # No conds
28 left_joins, where = ast2select.BuildSQLQuery(ast)
29 self.assertEqual([], left_joins)
30 self.assertEqual([], where)
31
32 def testBuildSQLQuery_Normal(self):
33 owner_field = BUILTIN_ISSUE_FIELDS['owner']
34 reporter_id_field = BUILTIN_ISSUE_FIELDS['reporter_id']
35 conds = [
36 ast_pb2.MakeCond(
37 ast_pb2.QueryOp.TEXT_HAS, [owner_field], ['example.com'], []),
38 ast_pb2.MakeCond(
39 ast_pb2.QueryOp.EQ, [reporter_id_field], [], [111L])]
40 ast = ast_pb2.QueryAST(conjunctions=[ast_pb2.Conjunction(conds=conds)])
41 left_joins, where = ast2select.BuildSQLQuery(ast)
42 self.assertEqual(
43 [('User AS Cond0 ON (Issue.owner_id = Cond0.user_id '
44 'OR Issue.derived_owner_id = Cond0.user_id)', [])],
45 left_joins)
46 self.assertEqual(
47 [('LOWER(Cond0.email) LIKE %s', ['%example.com%']),
48 ('Issue.reporter_id = %s', [111L])],
49 where)
50
51 def testBlockingIDCond_SingleValue(self):
52 fd = BUILTIN_ISSUE_FIELDS['blocking_id']
53 txt_cond = ast_pb2.MakeCond(
54 ast_pb2.QueryOp.TEXT_HAS, [fd], ['1'], [])
55 num_cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [1L])
56
57 for cond, expected in ((txt_cond, '1'), (num_cond, 1L)):
58 left_joins, where = ast2select._ProcessBlockingIDCond(
59 cond, 'Cond1', 'Issue1')
60 self.assertEqual(
61 [('IssueRelation AS Cond1 ON Issue.id = Cond1.dst_issue_id AND '
62 'Cond1.kind = %s',
63 ['blockedon'])],
64 left_joins)
65 self.assertEqual(
66 [('Cond1.issue_id = %s', [expected])],
67 where)
68
69 def testBlockingIDCond_MultiValue(self):
70 fd = BUILTIN_ISSUE_FIELDS['blocking_id']
71 txt_cond = ast_pb2.MakeCond(
72 ast_pb2.QueryOp.TEXT_HAS, [fd], ['1', '2', '3'], [])
73 num_cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [1L, 2L, 3L])
74
75 for cond, expected in ((txt_cond, ['1', '2', '3']),
76 (num_cond, [1L, 2L, 3L])):
77 left_joins, where = ast2select._ProcessBlockingIDCond(
78 cond, 'Cond1', 'Issue1')
79 self.assertEqual(
80 [('IssueRelation AS Cond1 ON Issue.id = Cond1.dst_issue_id AND '
81 'Cond1.kind = %s',
82 ['blockedon'])],
83 left_joins)
84 self.assertEqual(
85 [('Cond1.issue_id IN (%s,%s,%s)', expected)],
86 where)
87
88 def testBlockedOnIDCond_SingleValue(self):
89 fd = BUILTIN_ISSUE_FIELDS['blockedon_id']
90 txt_cond = ast_pb2.MakeCond(
91 ast_pb2.QueryOp.TEXT_HAS, [fd], ['1'], [])
92 num_cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [1L])
93
94 for cond, expected in ((txt_cond, '1'), (num_cond, 1L)):
95 left_joins, where = ast2select._ProcessBlockedOnIDCond(
96 cond, 'Cond1', 'Issue1')
97 self.assertEqual(
98 [('IssueRelation AS Cond1 ON Issue.id = Cond1.issue_id AND '
99 'Cond1.kind = %s',
100 ['blockedon'])],
101 left_joins)
102 self.assertEqual(
103 [('Cond1.dst_issue_id = %s', [expected])],
104 where)
105
106 def testBlockedIDCond_MultiValue(self):
107 fd = BUILTIN_ISSUE_FIELDS['blockedon_id']
108 txt_cond = ast_pb2.MakeCond(
109 ast_pb2.QueryOp.TEXT_HAS, [fd], ['1', '2', '3'], [])
110 num_cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [1L, 2L, 3L])
111
112 for cond, expected in ((txt_cond, ['1', '2', '3']),
113 (num_cond, [1L, 2L, 3L])):
114 left_joins, where = ast2select._ProcessBlockedOnIDCond(
115 cond, 'Cond1', 'Issue1')
116 self.assertEqual(
117 [('IssueRelation AS Cond1 ON Issue.id = Cond1.issue_id AND '
118 'Cond1.kind = %s',
119 ['blockedon'])],
120 left_joins)
121 self.assertEqual(
122 [('Cond1.dst_issue_id IN (%s,%s,%s)', expected)],
123 where)
124
125 def testHasBlockedCond(self):
126 for op, expected in ((ast_pb2.QueryOp.IS_DEFINED, 'IS NOT NULL'),
127 (ast_pb2.QueryOp.IS_NOT_DEFINED, 'IS NULL')):
128 fd = BUILTIN_ISSUE_FIELDS['blockedon_id']
129 cond = ast_pb2.MakeCond(op, [fd], [], [])
130
131 left_joins, where = ast2select._ProcessBlockedOnIDCond(
132 cond, 'Cond1', None)
133 self.assertEqual(
134 [('IssueRelation AS Cond1 ON Issue.id = Cond1.issue_id AND '
135 'Cond1.kind = %s', ['blockedon'])],
136 left_joins)
137 self.assertEqual([('Cond1.issue_id %s' % expected, [])], where)
138
139 def testHasBlockingCond(self):
140 for op, expected in ((ast_pb2.QueryOp.IS_DEFINED, 'IS NOT NULL'),
141 (ast_pb2.QueryOp.IS_NOT_DEFINED, 'IS NULL')):
142 fd = BUILTIN_ISSUE_FIELDS['blocking_id']
143 cond = ast_pb2.MakeCond(op, [fd], [], [])
144
145 left_joins, where = ast2select._ProcessBlockingIDCond(cond, 'Cond1', None)
146 self.assertEqual(
147 [('IssueRelation AS Cond1 ON Issue.id = Cond1.dst_issue_id AND '
148 'Cond1.kind = %s', ['blockedon'])],
149 left_joins)
150 self.assertEqual([('Cond1.dst_issue_id %s' % expected, [])], where)
151
152 def testProcessOwnerCond(self):
153 fd = BUILTIN_ISSUE_FIELDS['owner']
154 cond = ast_pb2.MakeCond(
155 ast_pb2.QueryOp.TEXT_HAS, [fd], ['example.com'], [])
156 left_joins, where = ast2select._ProcessOwnerCond(cond, 'Cond1', 'User1')
157 self.assertEqual(
158 [('User AS Cond1 ON (Issue.owner_id = Cond1.user_id '
159 'OR Issue.derived_owner_id = Cond1.user_id)', [])],
160 left_joins)
161 self.assertEqual(
162 [('LOWER(Cond1.email) LIKE %s', ['%example.com%'])],
163 where)
164
165 def testProcessOwnerIDCond(self):
166 fd = BUILTIN_ISSUE_FIELDS['owner_id']
167 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [111L])
168 left_joins, where = ast2select._ProcessOwnerIDCond(cond, 'Cond1', 'User1')
169 self.assertEqual([], left_joins)
170 self.assertEqual(
171 [('(Issue.owner_id = %s OR Issue.derived_owner_id = %s)',
172 [111L, 111L])],
173 where)
174
175 def testProcessReporterCond(self):
176 fd = BUILTIN_ISSUE_FIELDS['reporter']
177 cond = ast_pb2.MakeCond(
178 ast_pb2.QueryOp.TEXT_HAS, [fd], ['example.com'], [])
179 left_joins, where = ast2select._ProcessReporterCond(cond, 'Cond1', 'User1')
180 self.assertEqual(
181 [('User AS Cond1 ON Issue.reporter_id = Cond1.user_id', [])],
182 left_joins)
183 self.assertEqual(
184 [('LOWER(Cond1.email) LIKE %s', ['%example.com%'])],
185 where)
186
187 def testProcessReporterIDCond(self):
188 fd = BUILTIN_ISSUE_FIELDS['reporter_id']
189 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [111L])
190 left_joins, where = ast2select._ProcessReporterIDCond(
191 cond, 'Cond1', 'User1')
192 self.assertEqual([], left_joins)
193 self.assertEqual(
194 [('Issue.reporter_id = %s', [111L])],
195 where)
196
197 def testProcessCcCond(self):
198 fd = BUILTIN_ISSUE_FIELDS['cc']
199 cond = ast_pb2.MakeCond(
200 ast_pb2.QueryOp.TEXT_HAS, [fd], ['example.com'], [])
201 left_joins, where = ast2select._ProcessCcCond(cond, 'Cond1', 'User1')
202 self.assertEqual(
203 [('(Issue2Cc AS Cond1 JOIN User AS User1 '
204 'ON Cond1.cc_id = User1.user_id AND LOWER(User1.email) LIKE %s) '
205 'ON Issue.id = Cond1.issue_id AND Issue.shard = Cond1.issue_shard',
206 ['%example.com%'])],
207 left_joins)
208 self.assertEqual(
209 [('User1.email IS NOT NULL', [])],
210 where)
211
212 def testProcessCcIDCond(self):
213 fd = BUILTIN_ISSUE_FIELDS['cc_id']
214 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [111L])
215 left_joins, where = ast2select._ProcessCcIDCond(cond, 'Cond1', 'User1')
216 self.assertEqual(
217 [('Issue2Cc AS Cond1 ON Issue.id = Cond1.issue_id AND '
218 'Issue.shard = Cond1.issue_shard AND '
219 'Cond1.cc_id = %s',
220 [111L])],
221 left_joins)
222 self.assertEqual(
223 [('Cond1.cc_id IS NOT NULL', [])],
224 where)
225
226 def testProcessStarredByCond(self):
227 fd = BUILTIN_ISSUE_FIELDS['starredby']
228 cond = ast_pb2.MakeCond(
229 ast_pb2.QueryOp.TEXT_HAS, [fd], ['example.com'], [])
230 left_joins, where = ast2select._ProcessStarredByCond(
231 cond, 'Cond1', 'User1')
232 self.assertEqual(
233 [('(IssueStar AS Cond1 JOIN User AS User1 '
234 'ON Cond1.user_id = User1.user_id AND LOWER(User1.email) LIKE %s) '
235 'ON Issue.id = Cond1.issue_id', ['%example.com%'])],
236 left_joins)
237 self.assertEqual(
238 [('User1.email IS NOT NULL', [])],
239 where)
240
241 def testProcessStarredByIDCond(self):
242 fd = BUILTIN_ISSUE_FIELDS['starredby_id']
243 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [111L])
244 left_joins, where = ast2select._ProcessStarredByIDCond(
245 cond, 'Cond1', 'User1')
246 self.assertEqual(
247 [('IssueStar AS Cond1 ON Issue.id = Cond1.issue_id '
248 'AND Cond1.user_id = %s', [111L])],
249 left_joins)
250 self.assertEqual(
251 [('Cond1.user_id IS NOT NULL', [])],
252 where)
253
254 def testProcessCommentByCond(self):
255 fd = BUILTIN_ISSUE_FIELDS['commentby']
256 cond = ast_pb2.MakeCond(
257 ast_pb2.QueryOp.TEXT_HAS, [fd], ['example.com'], [])
258 left_joins, where = ast2select._ProcessCommentByCond(
259 cond, 'Cond1', 'User1')
260 self.assertEqual(
261 [('(Comment AS Cond1 JOIN User AS User1 '
262 'ON Cond1.commenter_id = User1.user_id '
263 'AND LOWER(User1.email) LIKE %s) '
264 'ON Issue.id = Cond1.issue_id', ['%example.com%'])],
265 left_joins)
266 self.assertEqual(
267 [('User1.email IS NOT NULL', [])],
268 where)
269
270 def testProcessCommentByIDCond(self):
271 fd = BUILTIN_ISSUE_FIELDS['commentby_id']
272 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [111L])
273 left_joins, where = ast2select._ProcessCommentByIDCond(
274 cond, 'Cond1', 'User1')
275 self.assertEqual(
276 [('Comment AS Cond1 ON Issue.id = Cond1.issue_id', [])],
277 left_joins)
278 self.assertEqual(
279 [('Cond1.commenter_id = %s', [111L])],
280 where)
281
282 def testProcessStatusIDCond(self):
283 fd = BUILTIN_ISSUE_FIELDS['status_id']
284 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [2])
285 left_joins, where = ast2select._ProcessStatusIDCond(cond, 'Cond1', 'User1')
286 self.assertEqual([], left_joins)
287 self.assertEqual(
288 [('(Issue.status_id = %s OR Issue.derived_status_id = %s)', [2, 2])],
289 where)
290
291 def testProcessLabelIDCond(self):
292 fd = BUILTIN_ISSUE_FIELDS['label_id']
293 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [1])
294 left_joins, where = ast2select._ProcessLabelIDCond(cond, 'Cond1', 'User1')
295 self.assertEqual(
296 [('Issue2Label AS Cond1 ON Issue.id = Cond1.issue_id AND '
297 'Issue.shard = Cond1.issue_shard AND '
298 'Cond1.label_id = %s', [1])],
299 left_joins)
300 self.assertEqual(
301 [('Cond1.label_id IS NOT NULL', [])],
302 where)
303
304 def testProcessComponentIDCond(self):
305 fd = BUILTIN_ISSUE_FIELDS['component_id']
306 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.EQ, [fd], [], [101])
307 left_joins, where = ast2select._ProcessComponentIDCond(
308 cond, 'Cond1', 'User1')
309 self.assertEqual(
310 [('Issue2Component AS Cond1 ON Issue.id = Cond1.issue_id AND '
311 'Issue.shard = Cond1.issue_shard AND '
312 'Cond1.component_id = %s', [101])],
313 left_joins)
314 self.assertEqual(
315 [('Cond1.component_id IS NOT NULL', [])],
316 where)
317
318 def testProcessCustomFieldCond(self):
319 pass # TODO(jrobbins): fill in this test case.
320
321 def testProcessAttachmentCond_HasAttachment(self):
322 fd = BUILTIN_ISSUE_FIELDS['attachment']
323 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.IS_DEFINED, [fd], [], [])
324 left_joins, where = ast2select._ProcessAttachmentCond(
325 cond, 'Cond1', 'User1')
326 self.assertEqual([], left_joins)
327 self.assertEqual(
328 [('(Issue.attachment_count IS NOT NULL AND '
329 'Issue.attachment_count != %s)',
330 [0])],
331 where)
332
333 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.IS_NOT_DEFINED, [fd], [], [])
334 left_joins, where = ast2select._ProcessAttachmentCond(
335 cond, 'Cond1', 'User1')
336 self.assertEqual([], left_joins)
337 self.assertEqual(
338 [('(Issue.attachment_count IS NULL OR '
339 'Issue.attachment_count = %s)',
340 [0])],
341 where)
342
343 def testProcessAttachmentCond_TextHas(self):
344 fd = BUILTIN_ISSUE_FIELDS['attachment']
345 cond = ast_pb2.MakeCond(ast_pb2.QueryOp.TEXT_HAS, [fd], ['jpg'], [])
346 left_joins, where = ast2select._ProcessAttachmentCond(
347 cond, 'Cond1', 'User1')
348 self.assertEqual(
349 [('Attachment AS Cond1 ON Issue.id = Cond1.issue_id AND '
350 'Cond1.deleted = %s',
351 [False])],
352 left_joins)
353 self.assertEqual(
354 [('Cond1.filename LIKE %s', ['%jpg%'])],
355 where)
356
357 def testCompare_IntTypes(self):
358 val_type = tracker_pb2.FieldTypes.INT_TYPE
359 cond_str, cond_args = ast2select._Compare(
360 'Alias', ast_pb2.QueryOp.IS_DEFINED, val_type, 'col', [1, 2])
361 self.assertEqual('(Alias.col IS NOT NULL AND Alias.col != %s)', cond_str)
362 self.assertEqual([0], cond_args)
363
364 cond_str, cond_args = ast2select._Compare(
365 'Alias', ast_pb2.QueryOp.EQ, val_type, 'col', [1])
366 self.assertEqual('Alias.col = %s', cond_str)
367 self.assertEqual([1], cond_args)
368
369 cond_str, cond_args = ast2select._Compare(
370 'Alias', ast_pb2.QueryOp.EQ, val_type, 'col', [1, 2])
371 self.assertEqual('Alias.col IN (%s,%s)', cond_str)
372 self.assertEqual([1, 2], cond_args)
373
374 cond_str, cond_args = ast2select._Compare(
375 'Alias', ast_pb2.QueryOp.NE, val_type, 'col', [])
376 self.assertEqual('TRUE', cond_str)
377 self.assertEqual([], cond_args)
378
379 cond_str, cond_args = ast2select._Compare(
380 'Alias', ast_pb2.QueryOp.NE, val_type, 'col', [1])
381 self.assertEqual('(Alias.col IS NULL OR Alias.col != %s)', cond_str)
382 self.assertEqual([1], cond_args)
383
384 cond_str, cond_args = ast2select._Compare(
385 'Alias', ast_pb2.QueryOp.NE, val_type, 'col', [1, 2])
386 self.assertEqual('(Alias.col IS NULL OR Alias.col NOT IN (%s,%s))',
387 cond_str)
388 self.assertEqual([1, 2], cond_args)
389
390 def testCompare_STRTypes(self):
391 val_type = tracker_pb2.FieldTypes.STR_TYPE
392 cond_str, cond_args = ast2select._Compare(
393 'Alias', ast_pb2.QueryOp.IS_DEFINED, val_type, 'col', ['a', 'b'])
394 self.assertEqual('(Alias.col IS NOT NULL AND Alias.col != %s)', cond_str)
395 self.assertEqual([''], cond_args)
396
397 cond_str, cond_args = ast2select._Compare(
398 'Alias', ast_pb2.QueryOp.EQ, val_type, 'col', ['a'])
399 self.assertEqual('Alias.col = %s', cond_str)
400 self.assertEqual(['a'], cond_args)
401
402 cond_str, cond_args = ast2select._Compare(
403 'Alias', ast_pb2.QueryOp.EQ, val_type, 'col', ['a', 'b'])
404 self.assertEqual('Alias.col IN (%s,%s)', cond_str)
405 self.assertEqual(['a', 'b'], cond_args)
406
407 cond_str, cond_args = ast2select._Compare(
408 'Alias', ast_pb2.QueryOp.NE, val_type, 'col', [])
409 self.assertEqual('TRUE', cond_str)
410 self.assertEqual([], cond_args)
411
412 cond_str, cond_args = ast2select._Compare(
413 'Alias', ast_pb2.QueryOp.NE, val_type, 'col', ['a'])
414 self.assertEqual('(Alias.col IS NULL OR Alias.col != %s)', cond_str)
415 self.assertEqual(['a'], cond_args)
416
417 cond_str, cond_args = ast2select._Compare(
418 'Alias', ast_pb2.QueryOp.NE, val_type, 'col', ['a', 'b'])
419 self.assertEqual('(Alias.col IS NULL OR Alias.col NOT IN (%s,%s))',
420 cond_str)
421 self.assertEqual(['a', 'b'], cond_args)
422
423 cond_str, cond_args = ast2select._Compare(
424 'Alias', ast_pb2.QueryOp.TEXT_HAS, val_type, 'col', ['a'])
425 self.assertEqual('Alias.col LIKE %s', cond_str)
426 self.assertEqual(['%a%'], cond_args)
427
428 cond_str, cond_args = ast2select._Compare(
429 'Alias', ast_pb2.QueryOp.NOT_TEXT_HAS, val_type, 'col', ['a'])
430 self.assertEqual('(Alias.col IS NULL OR Alias.col NOT LIKE %s)', cond_str)
431 self.assertEqual(['%a%'], cond_args)
432
433 def testCompareAlreadyJoined(self):
434 cond_str, cond_args = ast2select._CompareAlreadyJoined(
435 'Alias', ast_pb2.QueryOp.EQ, 'col')
436 self.assertEqual('Alias.col IS NOT NULL', cond_str)
437 self.assertEqual([], cond_args)
438
439 cond_str, cond_args = ast2select._CompareAlreadyJoined(
440 'Alias', ast_pb2.QueryOp.NE, 'col')
441 self.assertEqual('Alias.col IS NULL', cond_str)
442 self.assertEqual([], cond_args)
443
444
445 if __name__ == '__main__':
446 unittest.main()
OLDNEW
« no previous file with comments | « appengine/monorail/search/test/ast2ast_test.py ('k') | appengine/monorail/search/test/ast2sort_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698