Make the Ferret query compiler keep functions sticky across non-initial quoted tokens
Summary: Ref T13509. In `title:big "red" dog`, keep "title" sticky across all three terms, since this seems like it's probably the best match for intent. Test Plan: Added unit tests; ran unit tests. Maniphest Tasks: T13509 Differential Revision: https://secure.phabricator.com/D21111
This commit is contained in:
		| @@ -358,7 +358,14 @@ final class PhutilSearchQueryCompiler | ||||
|  | ||||
|         $result['function'] = $function; | ||||
|  | ||||
|         $is_sticky = !$result['quoted']; | ||||
|         // Note that the function remains sticky across quoted terms appearing | ||||
|         // after the function term. For example, all of these terms are title | ||||
|         // terms: | ||||
|         // | ||||
|         //   title:a "b c" d | ||||
|  | ||||
|         $is_sticky = (!$result['quoted'] || ($token['function'] === null)); | ||||
|  | ||||
|         switch ($operator) { | ||||
|           case self::OPERATOR_ABSENT: | ||||
|           case self::OPERATOR_PRESENT: | ||||
|   | ||||
| @@ -185,6 +185,14 @@ final class PhutilSearchQueryCompilerTestCase | ||||
|         array(null, $op_and, 'x'), | ||||
|       ), | ||||
|  | ||||
|       // Functions like "title:" continue to stick across quotes if the | ||||
|       // quotes aren't the initial argument. | ||||
|       'title:a "b c" d' => array( | ||||
|         array('title', $op_and, 'a'), | ||||
|         array('title', $op_and, 'b c'), | ||||
|         array('title', $op_and, 'd'), | ||||
|       ), | ||||
|  | ||||
|       // These queries require a field be both present and absent, which is | ||||
|       // impossible. | ||||
|       'title:- title:x' => false, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 epriestley
					epriestley