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