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 |             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_musts, | ||||||
|             tag_mays, |             tag_mays, | ||||||
|             tag_forbids, |             tag_forbids, | ||||||
|  | @ -594,17 +594,10 @@ class PDBPhotoMixin: | ||||||
|         for (column, value) in maximums.items(): |         for (column, value) in maximums.items(): | ||||||
|             wheres.append(column + ' <= ' + str(value)) |             wheres.append(column + ' <= ' + str(value)) | ||||||
| 
 | 
 | ||||||
|         # In order to use ORDER BY RANDOM(), we must place all of the intersect |         if photo_tag_rel_exist_clauses: | ||||||
|         # tag searches into a subquery. If we simply try to do |             wheres.extend(photo_tag_rel_exist_clauses) | ||||||
|         # SELECT * ... INTERSECT SELECT * ... ORDER BY RANDOM() | 
 | ||||||
|         # we get an error that random is not a column. But placing all of the |         query = ['SELECT * FROM photos'] | ||||||
|         # 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 wheres: |         if wheres: | ||||||
|             wheres = 'WHERE ' + ' AND '.join(wheres) |             wheres = 'WHERE ' + ' AND '.join(wheres) | ||||||
|  |  | ||||||
|  | @ -358,37 +358,36 @@ def normalize_tag_expression(expression): | ||||||
| 
 | 
 | ||||||
|     return expression |     return expression | ||||||
| 
 | 
 | ||||||
| INTERSECT_FORMAT = ''' | EXIST_FORMAT = ''' | ||||||
| SELECT * FROM photos WHERE {operator} ( | {operator} ( | ||||||
|     SELECT 1 FROM photo_tag_rel WHERE photos.id == photo_tag_rel.photoid |     SELECT 1 FROM photo_tag_rel WHERE photos.id == photo_tag_rel.photoid | ||||||
|     AND tagid IN {tagset} |     AND tagid IN {tagset} | ||||||
| ) | ) | ||||||
| '''.strip() | '''.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) = expand_mmf( | ||||||
|         tag_musts, |         tag_musts, | ||||||
|         tag_mays, |         tag_mays, | ||||||
|         tag_forbids, |         tag_forbids, | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     intersections = [] |     clauses = [] | ||||||
|     for tag_must_group in tag_musts: |     for tag_must_group in tag_musts: | ||||||
|         intersections.append( ('EXISTS', tag_must_group) ) |         clauses.append( ('EXISTS', tag_must_group) ) | ||||||
|     if tag_mays: |     if tag_mays: | ||||||
|         intersections.append( ('EXISTS', tag_mays) ) |         clauses.append( ('EXISTS', tag_mays) ) | ||||||
|     if tag_forbids: |     if tag_forbids: | ||||||
|         intersections.append( ('NOT EXISTS', tag_forbids) ) |         clauses.append( ('NOT EXISTS', tag_forbids) ) | ||||||
| 
 | 
 | ||||||
|     intersections = [ |     clauses = [ | ||||||
|         #(operator, helpers.sql_listify([tag.id for tag in tagset] + [""])) |  | ||||||
|         (operator, helpers.sql_listify(tag.id for tag in tagset)) |         (operator, helpers.sql_listify(tag.id for tag in tagset)) | ||||||
|         for (operator, tagset) in intersections |         for (operator, tagset) in clauses | ||||||
|     ] |     ] | ||||||
|     intersections = [ |     clauses = [ | ||||||
|         INTERSECT_FORMAT.format(operator=operator, tagset=tagset) |         EXIST_FORMAT.format(operator=operator, tagset=tagset) | ||||||
|         for (operator, tagset) in intersections |         for (operator, tagset) in clauses | ||||||
|     ] |     ] | ||||||
|     return intersections |     return clauses | ||||||
| 
 | 
 | ||||||
| def normalize_tagset(photodb, tags, warning_bag=None): | def normalize_tagset(photodb, tags, warning_bag=None): | ||||||
|     if not tags: |     if not tags: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue