dedupe searching a bit
This commit is contained in:
		
							parent
							
								
									525fd20540
								
							
						
					
					
						commit
						7f2609f727
					
				| @ -796,21 +796,6 @@ class Image { | |||||||
| 		return new Querylet($sql, $terms); | 		return new Querylet($sql, $terms); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * @param Querylet $img_search |  | ||||||
| 	 * @return Querylet |  | ||||||
| 	 */ |  | ||||||
| 	private static function build_simple_query($img_search) { |  | ||||||
| 		$query = new Querylet("SELECT images.* FROM images "); |  | ||||||
| 
 |  | ||||||
| 		if (!empty($img_search->sql)) { |  | ||||||
| 			$query->append_sql(" WHERE "); |  | ||||||
| 			$query->append($img_search); |  | ||||||
| 			return $query; |  | ||||||
| 		} |  | ||||||
| 		return $query; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * WARNING: this description is no longer accurate, though it does get across | 	 * WARNING: this description is no longer accurate, though it does get across | ||||||
| 	 * the general idea - the actual method has a few extra optimisations | 	 * the general idea - the actual method has a few extra optimisations | ||||||
| @ -877,7 +862,11 @@ class Image { | |||||||
| 
 | 
 | ||||||
| 		// no tags, do a simple search (+image metadata if we have any)
 | 		// no tags, do a simple search (+image metadata if we have any)
 | ||||||
| 		if($count_tag_querylets === 0) { | 		if($count_tag_querylets === 0) { | ||||||
| 			$query = self::build_simple_query($img_search); | 			$query = new Querylet(" | ||||||
|  | 				SELECT images.* | ||||||
|  | 				FROM images | ||||||
|  | 				WHERE 1=1 | ||||||
|  | 			");
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// one positive tag (a common case), do an optimised search
 | 		// one positive tag (a common case), do an optimised search
 | ||||||
| @ -889,11 +878,6 @@ class Image { | |||||||
| 				JOIN tags ON image_tags.tag_id=tags.id | 				JOIN tags ON image_tags.tag_id=tags.id | ||||||
| 				WHERE SCORE_STRNORM(tag) = SCORE_STRNORM(:tag) | 				WHERE SCORE_STRNORM(tag) = SCORE_STRNORM(:tag) | ||||||
| 			"), array("tag"=>$tag_querylets[0]->tag));
 | 			"), array("tag"=>$tag_querylets[0]->tag));
 | ||||||
| 
 |  | ||||||
| 			if(!empty($img_search->sql)) { |  | ||||||
| 				$query->append_sql(" AND "); |  | ||||||
| 				$query->append($img_search); |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// more than one positive tag, or more than zero negative tags
 | 		// more than one positive tag, or more than zero negative tags
 | ||||||
| @ -902,30 +886,29 @@ class Image { | |||||||
| 			$negative_tag_id_array = array(); | 			$negative_tag_id_array = array(); | ||||||
| 			$tags_ok = true; | 			$tags_ok = true; | ||||||
| 
 | 
 | ||||||
| 			foreach($tag_querylets as $tq) { | 			foreach ($tag_querylets as $tq) { | ||||||
| 				$tag_ids = $database->get_col( | 				$tag_ids = $database->get_col( | ||||||
| 					$database->scoreql_to_sql(" | 					$database->scoreql_to_sql(" | ||||||
| 						SELECT id | 						SELECT id | ||||||
| 						FROM tags | 						FROM tags | ||||||
| 						WHERE SCORE_STRNORM(tag) = SCORE_STRNORM(:tag) | 						WHERE SCORE_STRNORM(tag) = SCORE_STRNORM(:tag) | ||||||
| 					"), array("tag"=>$tq->tag)
 | 					"), array("tag" => $tq->tag)
 | ||||||
| 				); | 				); | ||||||
| 				if($tq->positive) { | 				if ($tq->positive) { | ||||||
| 					$positive_tag_id_array = array_merge($positive_tag_id_array, $tag_ids); | 					$positive_tag_id_array = array_merge($positive_tag_id_array, $tag_ids); | ||||||
| 					$tags_ok = count($tag_ids) > 0; | 					$tags_ok = count($tag_ids) > 0; | ||||||
| 					if(!$tags_ok) break; | 					if (!$tags_ok) break; | ||||||
| 				} | 				} else { | ||||||
| 				else { |  | ||||||
| 					$negative_tag_id_array = array_merge($negative_tag_id_array, $tag_ids); | 					$negative_tag_id_array = array_merge($negative_tag_id_array, $tag_ids); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if($tags_ok) { | 			if ($tags_ok) { | ||||||
| 				$have_pos = count($positive_tag_id_array) > 0; | 				$have_pos = count($positive_tag_id_array) > 0; | ||||||
| 				$have_neg = count($negative_tag_id_array) > 0; | 				$have_neg = count($negative_tag_id_array) > 0; | ||||||
| 
 | 
 | ||||||
| 				$sql = ""; | 				$sql = ""; | ||||||
| 				if($have_pos) { | 				if ($have_pos) { | ||||||
| 					$positive_tag_id_list = join(', ', $positive_tag_id_array); | 					$positive_tag_id_list = join(', ', $positive_tag_id_array); | ||||||
| 					$sql .= " | 					$sql .= " | ||||||
| 						SELECT image_id | 						SELECT image_id | ||||||
| @ -935,10 +918,10 @@ class Image { | |||||||
| 						HAVING COUNT(image_id)>=$positive_tag_count | 						HAVING COUNT(image_id)>=$positive_tag_count | ||||||
| 					";
 | 					";
 | ||||||
| 				} | 				} | ||||||
| 				if($have_pos && $have_neg) { | 				if ($have_pos && $have_neg) { | ||||||
| 					$sql .= " EXCEPT "; | 					$sql .= " EXCEPT "; | ||||||
| 				} | 				} | ||||||
| 				if($have_neg) { | 				if ($have_neg) { | ||||||
| 					$negative_tag_id_list = join(', ', $negative_tag_id_array); | 					$negative_tag_id_list = join(', ', $negative_tag_id_array); | ||||||
| 					$sql .= " | 					$sql .= " | ||||||
| 						SELECT image_id | 						SELECT image_id | ||||||
| @ -951,13 +934,7 @@ class Image { | |||||||
| 					FROM images | 					FROM images | ||||||
| 					WHERE images.id IN ($sql) | 					WHERE images.id IN ($sql) | ||||||
| 				");
 | 				");
 | ||||||
| 
 | 			} else { | ||||||
| 				if(strlen($img_search->sql) > 0) { |  | ||||||
| 					$query->append_sql(" AND "); |  | ||||||
| 					$query->append($img_search); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				# one of the positive tags had zero results, therefor there
 | 				# one of the positive tags had zero results, therefor there
 | ||||||
| 				# can be no results; "where 1=0" should shortcut things
 | 				# can be no results; "where 1=0" should shortcut things
 | ||||||
| 				$query = new Querylet(" | 				$query = new Querylet(" | ||||||
| @ -968,6 +945,12 @@ class Image { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if (!empty($img_search->sql)) { | ||||||
|  | 			$query->append_sql(" AND "); | ||||||
|  | 			$query->append($img_search); | ||||||
|  | 			return $query; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		return $query; | 		return $query; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -1040,7 +1023,11 @@ class Image { | |||||||
| 
 | 
 | ||||||
| 		// no tags, do a simple search (+image metadata if we have any)
 | 		// no tags, do a simple search (+image metadata if we have any)
 | ||||||
| 		if($positive_tag_count + $negative_tag_count == 0) { | 		if($positive_tag_count + $negative_tag_count == 0) { | ||||||
| 			$query = self::build_simple_query($img_search); | 			$query = new Querylet(" | ||||||
|  | 				SELECT images.* | ||||||
|  | 				FROM images | ||||||
|  | 				WHERE 1=1 | ||||||
|  | 			");
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// one positive tag (a common case), do an optimised search
 | 		// one positive tag (a common case), do an optimised search
 | ||||||
| @ -1056,11 +1043,6 @@ class Image { | |||||||
| 				WHERE tag LIKE :tag0 | 				WHERE tag LIKE :tag0 | ||||||
| 				{$group_by} | 				{$group_by} | ||||||
| 			", $tag_search->variables);
 | 			", $tag_search->variables);
 | ||||||
| 
 |  | ||||||
| 			if(!empty($img_search->sql)) { |  | ||||||
| 				$query->append_sql(" AND "); |  | ||||||
| 				$query->append($img_search); |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// more than one positive tag, and zero or more negative tags
 | 		// more than one positive tag, and zero or more negative tags
 | ||||||
| @ -1101,12 +1083,9 @@ class Image { | |||||||
| 				); | 				); | ||||||
| 				$query = new Querylet(' | 				$query = new Querylet(' | ||||||
| 					SELECT * | 					SELECT * | ||||||
| 					FROM ('.$subquery->sql.') AS images ', $subquery->variables); | 					FROM ('.$subquery->sql.') AS images | ||||||
| 
 | 					WHERE 1=1 | ||||||
| 				if(!empty($img_search->sql)) { | 				', $subquery->variables); | ||||||
| 					$query->append_sql(" WHERE "); |  | ||||||
| 					$query->append($img_search); |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 			else { | 			else { | ||||||
| 				# there are no results, "where 1=0" should shortcut things
 | 				# there are no results, "where 1=0" should shortcut things
 | ||||||
| @ -1120,13 +1099,20 @@ class Image { | |||||||
| 
 | 
 | ||||||
| 		//zero positive tags and one or more negative tags
 | 		//zero positive tags and one or more negative tags
 | ||||||
| 		//TODO: This isn't currently implemented. SEE: https://github.com/shish/shimmie2/issues/66
 | 		//TODO: This isn't currently implemented. SEE: https://github.com/shish/shimmie2/issues/66
 | ||||||
| 		else{ | 		else { | ||||||
| 			$query = new Querylet(" | 			$query = new Querylet(" | ||||||
| 				SELECT images.* | 				SELECT images.* | ||||||
| 				FROM images | 				FROM images | ||||||
| 				WHERE 1=0 | 				WHERE 1=0 | ||||||
| 			");
 | 			");
 | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		if (!empty($img_search->sql)) { | ||||||
|  | 			$query->append_sql(" AND "); | ||||||
|  | 			$query->append($img_search); | ||||||
|  | 			return $query; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		Image::$tag_n = 0; | 		Image::$tag_n = 0; | ||||||
| 		return $query; | 		return $query; | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user