use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\Node;
+use OCP\Files\Search\ISearchComparison;
use OCP\Files\Search\ISearchOperator;
use OCP\Files\Search\ISearchOrder;
use OCP\Files\Search\ISearchQuery;
if (count($operator->arguments) !== 2) {
throw new \InvalidArgumentException('Invalid number of arguments for ' . $trimmedType . ' operation');
}
- if (!($operator->arguments[0] instanceof SearchPropertyDefinition)) {
- throw new \InvalidArgumentException('Invalid argument 1 for ' . $trimmedType . ' operation, expected property');
- }
if (!($operator->arguments[1] instanceof Literal)) {
throw new \InvalidArgumentException('Invalid argument 2 for ' . $trimmedType . ' operation, expected literal');
}
-
+ $value = $operator->arguments[1]->value;
+ case Operator::OPERATION_IS_DEFINED:
+ if (!($operator->arguments[0] instanceof SearchPropertyDefinition)) {
+ throw new \InvalidArgumentException('Invalid argument 1 for ' . $trimmedType . ' operation, expected property');
+ }
$property = $operator->arguments[0];
- $value = $this->castValue($property, $operator->arguments[1]->value);
+
if (str_starts_with($property->name, FilesPlugin::FILE_METADATA_PREFIX)) {
- return new SearchComparison($trimmedType, substr($property->name, strlen(FilesPlugin::FILE_METADATA_PREFIX)), $value, IMetadataQuery::EXTRA);
+ $field = substr($property->name, strlen(FilesPlugin::FILE_METADATA_PREFIX));
+ $extra = IMetadataQuery::EXTRA;
} else {
- return new SearchComparison($trimmedType, $this->mapPropertyNameToColumn($property), $value);
+ $field = $this->mapPropertyNameToColumn($property);
}
- // no break
+ return new SearchComparison(
+ ISearchComparison::COMPARE_DEFINED,
+ $field,
+ $this->castValue($property, $value ?? ''),
+ $extra ?? ''
+ );
+
case Operator::OPERATION_IS_COLLECTION:
return new SearchComparison('eq', 'mimetype', ICacheEntry::DIRECTORY_MIMETYPE);
default:
}
private function castValue(SearchPropertyDefinition $property, $value) {
- switch ($property->dataType) {
+ if ($value === '') {
+ return '';
+ }
+
+ switch ($property->dataType) {
case SearchPropertyDefinition::DATATYPE_BOOLEAN:
return $value === 'yes';
case SearchPropertyDefinition::DATATYPE_DECIMAL:
ISearchComparison::COMPARE_GREATER_THAN_EQUAL => 'gte',
ISearchComparison::COMPARE_LESS_THAN => 'lt',
ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'lte',
+ ISearchComparison::COMPARE_DEFINED => 'isNotNull',
];
protected static $searchOperatorNegativeMap = [
ISearchComparison::COMPARE_GREATER_THAN_EQUAL => 'lt',
ISearchComparison::COMPARE_LESS_THAN => 'gte',
ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'gt',
+ ISearchComparison::COMPARE_DEFINED => 'isNull',
];
public const TAG_FAVORITE = '_$!<Favorite>!$_';