All of the INTERSECTs can just be WHERE clauses.
This commit is contained in:
		
							parent
							
								
									c0df14db62
								
							
						
					
					
						commit
						028a8cb2ef
					
				
					 2 changed files with 18 additions and 26 deletions
				
			
		|  | @ -530,7 +530,7 @@ class PDBPhotoMixin: | |||
|             } | ||||
|             yield parameters | ||||
| 
 | ||||
|         photo_tag_rel_intersections = searchhelpers.photo_tag_rel_intersections( | ||||
|         photo_tag_rel_exist_clauses = searchhelpers.photo_tag_rel_exist_clauses( | ||||
|             tag_musts, | ||||
|             tag_mays, | ||||
|             tag_forbids, | ||||
|  | @ -594,17 +594,10 @@ class PDBPhotoMixin: | |||
|         for (column, value) in maximums.items(): | ||||
|             wheres.append(column + ' <= ' + str(value)) | ||||
| 
 | ||||
|         # In order to use ORDER BY RANDOM(), we must place all of the intersect | ||||
|         # tag searches into a subquery. If we simply try to do | ||||
|         # SELECT * ... INTERSECT SELECT * ... ORDER BY RANDOM() | ||||
|         # we get an error that random is not a column. But placing all of the | ||||
|         # selects into a named subquery fixes that. | ||||
|         query = ['SELECT * FROM'] | ||||
|         if photo_tag_rel_intersections: | ||||
|             intersections = '(%s) photos' % '\nINTERSECT\n'.join(photo_tag_rel_intersections) | ||||
|             query.append(intersections) | ||||
|         else: | ||||
|             query.append('photos') | ||||
|         if photo_tag_rel_exist_clauses: | ||||
|             wheres.extend(photo_tag_rel_exist_clauses) | ||||
| 
 | ||||
|         query = ['SELECT * FROM photos'] | ||||
| 
 | ||||
|         if wheres: | ||||
|             wheres = 'WHERE ' + ' AND '.join(wheres) | ||||
|  |  | |||
|  | @ -358,37 +358,36 @@ def normalize_tag_expression(expression): | |||
| 
 | ||||
|     return expression | ||||
| 
 | ||||
| INTERSECT_FORMAT = ''' | ||||
| SELECT * FROM photos WHERE {operator} ( | ||||
| EXIST_FORMAT = ''' | ||||
| {operator} ( | ||||
|     SELECT 1 FROM photo_tag_rel WHERE photos.id == photo_tag_rel.photoid | ||||
|     AND tagid IN {tagset} | ||||
| ) | ||||
| '''.strip() | ||||
| def photo_tag_rel_intersections(tag_musts, tag_mays, tag_forbids): | ||||
| def photo_tag_rel_exist_clauses(tag_musts, tag_mays, tag_forbids): | ||||
|     (tag_musts, tag_mays, tag_forbids) = expand_mmf( | ||||
|         tag_musts, | ||||
|         tag_mays, | ||||
|         tag_forbids, | ||||
|     ) | ||||
| 
 | ||||
|     intersections = [] | ||||
|     clauses = [] | ||||
|     for tag_must_group in tag_musts: | ||||
|         intersections.append( ('EXISTS', tag_must_group) ) | ||||
|         clauses.append( ('EXISTS', tag_must_group) ) | ||||
|     if tag_mays: | ||||
|         intersections.append( ('EXISTS', tag_mays) ) | ||||
|         clauses.append( ('EXISTS', tag_mays) ) | ||||
|     if tag_forbids: | ||||
|         intersections.append( ('NOT EXISTS', tag_forbids) ) | ||||
|         clauses.append( ('NOT EXISTS', tag_forbids) ) | ||||
| 
 | ||||
|     intersections = [ | ||||
|         #(operator, helpers.sql_listify([tag.id for tag in tagset] + [""])) | ||||
|     clauses = [ | ||||
|         (operator, helpers.sql_listify(tag.id for tag in tagset)) | ||||
|         for (operator, tagset) in intersections | ||||
|         for (operator, tagset) in clauses | ||||
|     ] | ||||
|     intersections = [ | ||||
|         INTERSECT_FORMAT.format(operator=operator, tagset=tagset) | ||||
|         for (operator, tagset) in intersections | ||||
|     clauses = [ | ||||
|         EXIST_FORMAT.format(operator=operator, tagset=tagset) | ||||
|         for (operator, tagset) in clauses | ||||
|     ] | ||||
|     return intersections | ||||
|     return clauses | ||||
| 
 | ||||
| def normalize_tagset(photodb, tags, warning_bag=None): | ||||
|     if not tags: | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue