Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F570003
FerretSearchFunction.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
FerretSearchFunction.php
View Options
<?php
abstract
class
FerretSearchFunction
extends
Phobject
{
abstract
public
function
getFerretFunctionName
();
abstract
public
function
getFerretFieldKey
();
abstract
public
function
supportsObject
(
PhabricatorFerretInterface
$object
);
final
public
static
function
getNormalizedFunctionName
(
$name
)
{
return
phutil_utf8_strtolower
(
$name
);
}
final
public
static
function
validateFerretFunctionName
(
$function_name
)
{
if
(!
preg_match
(
'/^[a-zA-Z-]+
\z
/'
,
$function_name
))
{
throw
new
Exception
(
pht
(
'Ferret search engine function name ("%s") is invalid. Function '
.
'names must be nonempty and may only contain latin letters and '
.
'hyphens.'
,
$function_name
));
}
}
final
public
static
function
validateFerretFunctionFieldKey
(
$field_key
)
{
if
(!
preg_match
(
'/^[a-z]{4}
\z
/'
,
$field_key
))
{
throw
new
Exception
(
pht
(
'Ferret search engine field key ("%s") is invalid. Field keys '
.
'must be exactly four characters long and contain only '
.
'lowercase latin letters.'
,
$field_key
));
}
}
final
public
static
function
newFerretSearchFunctions
()
{
$extensions
=
PhabricatorFulltextEngineExtension
::
getAllExtensions
();
$function_map
=
array
();
$field_map
=
array
();
$results
=
array
();
foreach
(
$extensions
as
$extension
)
{
$functions
=
$extension
->
newFerretSearchFunctions
();
if
(!
is_array
(
$functions
))
{
throw
new
Exception
(
pht
(
'Expected fulltext engine extension ("%s") to return a '
.
'list of functions from "newFerretSearchFunctions()", '
.
'got "%s".'
,
get_class
(
$extension
),
phutil_describe_type
(
$functions
)));
}
foreach
(
$functions
as
$idx
=>
$function
)
{
if
(!(
$function
instanceof
FerretSearchFunction
))
{
throw
new
Exception
(
pht
(
'Expected fulltext engine extension ("%s") to return a list '
.
'of "FerretSearchFunction" objects from '
.
'"newFerretSearchFunctions()", but found something else '
.
'("%s") at index "%s".'
,
get_class
(
$extension
),
phutil_describe_type
(
$function
),
$idx
));
}
$function_name
=
$function
->
getFerretFunctionName
();
self
::
validateFerretFunctionName
(
$function_name
);
$normal_name
=
self
::
getNormalizedFunctionName
(
$function_name
);
if
(
$normal_name
!==
$function_name
)
{
throw
new
Exception
(
pht
(
'Ferret function "%s" is specified with a denormalized name. '
.
'Instead, specify the function using the normalized '
.
'function name ("%s").'
,
$function_name
,
$normal_name
));
}
if
(
isset
(
$function_map
[
$function_name
]))
{
$other_extension
=
$function_map
[
$function_name
];
throw
new
Exception
(
pht
(
'Two different fulltext engine extensions ("%s" and "%s") '
.
'both define a search function with the same name ("%s"). '
.
'Each function must have a unique name.'
,
get_class
(
$extension
),
get_class
(
$other_extension
),
$function_name
));
}
$function_map
[
$function_name
]
=
$extension
;
$field_key
=
$function
->
getFerretFieldKey
();
self
::
validateFerretFunctionFieldKey
(
$field_key
);
if
(
isset
(
$field_map
[
$field_key
]))
{
$other_extension
=
$field_map
[
$field_key
];
throw
new
Exception
(
pht
(
'Two different fulltext engine extensions ("%s" and "%s") '
.
'both define a search function with the same key ("%s"). '
.
'Each function must have a unique key.'
,
get_class
(
$extension
),
get_class
(
$other_extension
),
$field_key
));
}
$field_map
[
$field_key
]
=
$extension
;
$results
[
$function_name
]
=
$function
;
}
}
ksort
(
$results
);
return
$results
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Tue, May 13, 3:10 PM (1 d, 23 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
100512
Default Alt Text
FerretSearchFunction.php (4 KB)
Attached To
Mode
rP Phorge
Attached
Detach File
Event Timeline
Log In to Comment