OLD | NEW |
(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() |
OLD | NEW |