diff --git a/private/lib/dao/DaoSearchable.php b/private/lib/dao/DaoSearchable.php new file mode 100644 index 0000000..2dbb936 --- /dev/null +++ b/private/lib/dao/DaoSearchable.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/private/lib/dao/GenericDao.php b/private/lib/dao/GenericDao.php index 974950e..61a7b03 100644 --- a/private/lib/dao/GenericDao.php +++ b/private/lib/dao/GenericDao.php @@ -261,6 +261,8 @@ class GenericDao{ return $rval; } + + /** * Ritorna la lista dei notizia model ordinati per pertinenza * @param string $modelClass @@ -271,11 +273,91 @@ class GenericDao{ * @return DaoSaveable[] */ public function search($modelClass, $search, array $filter = array(), array $options = array()){ + if ( is_a($modelClass, DaoSearchable::class, true ) ) { + return $this->query($modelClass, self::getSearchFilter( $modelClass, $search, $filter, $options, $modelClass::getSearchableFields() ), $options); + } + else { + return $this->searchUseIndex($modelClass, $search, $filter, $options); + } + } + + public function searchCount($modelClass, $search, array $filter = array(), array $options = array()){ + if ( is_a($modelClass, DaoSearchable::class, true ) ) { + return $this->count($modelClass, self::getSearchFilter( $modelClass, $search, $filter, $options, $modelClass::getSearchableFields() ), $options); + } + else { + return $this->searchUseIndexCount($modelClass, $search, $filter, $options); + } + } + + /** + * Versione MODDATA di quello in PHPFramework (usa solo SEARCH_MODE_DAO in modalità regex) + * @param string $modelClass + * @param string $search + * @param array $filter + * @param array $options + * @param array $recursiveIgnore + * @throws CoreException + * @return array|string[] + */ + private function getSearchFilter($modelClass, $search, array $filter = array(), array $options = array(), array $searchFields){ + $search = trim($search); + + if ( strcmp($search, "")!=0 ){ + $searchArr = preg_split("/\s+/", $search); + + if (sizeof($searchFields)>0) { + $internalAnd = [ '$and' => [] ]; + + foreach ($searchArr as $ele){ + + $internalOr = [ '$or' => [] ]; + + foreach ($searchFields as $field){ + + $internalOr['$or'][] = [ + $field => new MongoDB\BSON\Regex($ele,'i') + ]; + + } + + $internalAnd['$and'][] = $internalOr; + } + + if (sizeof($filter)>0){ + $andFilter = array(); + $andFilter['$and'] = array(); + $andFilter['$and'][] = $filter; + $andFilter['$and'][] = $internalAnd; + + $filter = $andFilter; + } + else { + $filter = $internalAnd; + } + + } + + } + return $filter; + } + + + /** + * Ritorna la lista dei notizia model ordinati per pertinenza + * @param string $modelClass + * @param string $searchWord + * @param array $filter + * @param array $options + * @throws CoreException + * @return DaoSaveable[] + */ + public function searchUseIndex($modelClass, $search, array $filter = array(), array $options = array()){ $filter['$text'] = array('$search'=> trim($search) ); return $this->query($modelClass, $filter, $options); } - public function searchCount($modelClass, $search, array $filter = array(), array $options = array()){ + public function searchUseIndexCount($modelClass, $search, array $filter = array(), array $options = array()){ $filter['$text'] = array('$search'=> trim($search) ); return $this->count($modelClass, $filter, $options); } diff --git a/private/lib/dao/lib.inclusion.php b/private/lib/dao/lib.inclusion.php index c7981cb..854cc9e 100644 --- a/private/lib/dao/lib.inclusion.php +++ b/private/lib/dao/lib.inclusion.php @@ -7,6 +7,8 @@ Creation Date: 07/gen/2016 // Inclue Saam require_once(dirname(__FILE__)."/DaoSaveableInterface.php"); +require_once(dirname(__FILE__)."/DaoSearchable.php"); + require_once(dirname(__FILE__)."/DaoSaveableDefaultImplementation.php"); require_once(dirname(__FILE__)."/GenericDao.php"); diff --git a/private/lib/dao/models/NotiziaModel.php b/private/lib/dao/models/NotiziaModel.php index 14c3bcf..5d6a458 100644 --- a/private/lib/dao/models/NotiziaModel.php +++ b/private/lib/dao/models/NotiziaModel.php @@ -16,7 +16,7 @@ Creation Date: 07/gen/2016 * @author rik * */ -class NotiziaModel extends HasMediaModel{ +class NotiziaModel extends HasMediaModel implements DaoSearchable{ const STATUS_PENDING = 1; const STATUS_ACCEPTED = 2; const STATUS_REJECTED = 3; @@ -113,6 +113,15 @@ class NotiziaModel extends HasMediaModel{ } return $rval; } + public static function getSearchableFields(): array { + return [ + "about.author", + "sottotitolo", + "testo", + "titolo" + ]; + } + } ?>