/**
  * @param EMongoCriteria $criteria
  * @param string $group
  * @return array
  */
 public function findAllIds(EMongoCriteria $criteria = null, $group = '')
 {
     $id = property_exists($this, 'id') ? 'id' : '_id';
     $select = [$id];
     if ($group) {
         array_push($select, $group);
     }
     $cursor = $this->findAllAsArray($criteria->select($select));
     return $group ? ArrayHelper::groupByAttribute($cursor, $group, $id) : ArrayHelper::pickAttribute($cursor, $id, false);
 }
Example #2
0
 public function getDateLastImportByBiobank($biobank_id)
 {
     $criteria = new EMongoCriteria();
     $criteria->biobank_id = $biobank_id;
     $criteria->limit(1);
     $criteria->sort('date_import', EMongoCriteria::SORT_DESC);
     $criteria->select(array('date_import'));
     $result = $this->find($criteria);
     if ($result != null) {
         return $result->date_import;
     }
 }
Example #3
0
 public function search($caseSensitive = false)
 {
     $criteria = new EMongoCriteria();
     if (isset($this->type) && !empty($this->type)) {
         $criteria->addCond('type', '==', new MongoRegex($this->regexString($this->type)));
     }
     if (isset($this->user) && !empty($this->user)) {
         $regex = $this->regexString($this->user);
         $criteriaUser = new EMongoCriteria();
         $criteriaUser->nom = new MongoRegex($regex);
         $criteriaUser->select(array('_id'));
         $users = User::model()->findAll($criteriaUser);
         $listUsers = array();
         if ($users != null) {
             foreach ($users as $user) {
                 $listUsers[] = $user->_id;
             }
         }
         $criteria->addCond('login', 'in', $listUsers);
     }
     if (isset($this->id_patient) && !empty($this->id_patient)) {
         $criteria->addCond('id_patient', '==', new MongoRegex($this->regexString($this->id_patient)));
     }
     if (isset($this->name) && !empty($this->name)) {
         $criteria->addCond('name', '==', new MongoRegex($this->regexString($this->name)));
     }
     if (isset($this->last_updated) && !empty($this->last_updated)) {
         $answerFormat = $this->formatDatePicker($this->last_updated);
         $date_from = str_replace('/', '-', $answerFormat[0]);
         $date_to = str_replace('/', '-', $answerFormat[1]);
         $criteria->last_updated->date = array('$gte' => date('Y-m-d', strtotime($date_from)) . " 00:00:00.000000", '$lte' => date('Y-m-d', strtotime($date_to)) . " 23:59:59.000000");
     }
     if (isset($this->dynamics) && !empty($this->dynamics)) {
         $index = 0;
         $nbCriteria = array();
         foreach ($this->dynamics as $questionId => $answerValue) {
             if ($answerValue != null && !empty($answerValue)) {
                 if ($index != 0) {
                     $nbCriteria = '$criteria' . $index;
                     $nbCriteria = new EMongoCriteria();
                 }
                 if (isset($this->compare[$questionId])) {
                     if ($index == 0) {
                         if ($this->compare[$questionId] == "between") {
                             $answerDate = $this->formatDatePicker($answerValue);
                             $criteria->addCond('answers_group.answers', 'elemmatch', array('id' => $questionId, 'answer.date' => array('$gte' => $answerDate['date_from'] . " 00:00:00.000000", '$lte' => $answerDate['date_to'] . " 23:59:59.000000")));
                         } else {
                             $criteria->addCond('answers_group.answers', 'elemmatch', array('id' => $questionId, 'answer' => array(EMongoCriteria::$operators[$this->compare[$questionId]] => (int) $answerValue)));
                         }
                     } else {
                         if ($this->compare[$questionId] == "between") {
                             $answerDate = $this->formatDatePicker($answerValue);
                             $nbCriteria->addCond('answers_group.answers', 'elemmatch', array('id' => $questionId, 'answer.date' => array('$gte' => $answerDate['date_from'] . " 00:00:00.000000", '$lte' => $answerDate['date_to'] . " 23:59:59.000000")));
                         } else {
                             $nbCriteria->addCond('answers_group.answers', 'elemmatch', array('id' => $questionId, 'answer' => array(EMongoCriteria::$operators[$this->compare[$questionId]] => (int) $answerValue)));
                         }
                     }
                 } else {
                     $values = !is_array($answerValue) ? split(',', $answerValue) : $answerValue;
                     if ($index == 0) {
                         $criteria->addCond('answers_group.answers', 'elemmatch', array('id' => $questionId, 'answer' => new MongoRegex($this->regexString($values))));
                     } else {
                         $nbCriteria->addCond('answers_group.answers', 'elemmatch', array('id' => $questionId, 'answer' => new MongoRegex($this->regexString($values))));
                     }
                 }
             }
             if ($index != 0) {
                 $criteria->mergeWith($nbCriteria, $this->condition[$questionId]);
             }
             $index++;
         }
     }
     $criteria->sort('id_patient', EMongoCriteria::SORT_ASC);
     $criteria->sort('type', EMongoCriteria::SORT_ASC);
     $criteria->sort('last_updated', EMongoCriteria::SORT_DESC);
     Yii::app()->session['criteria'] = $criteria;
     return new EMongoDocumentDataProvider($this, array('criteria' => $criteria));
 }
Example #4
0
 /**
  * affichage de la page de recherche des echantillons
  */
 public function actionSearch()
 {
     $model = new Sample('search');
     $model->unsetAttributes();
     $biobankId = null;
     if (isset($_GET['id']) && isset($_GET['layout']) && $_GET['layout'] == 'vitrine_layout') {
         $biobankId = $_GET['id'];
     }
     $model->biobank_id = $biobankId;
     $user = CommonTools::getConnectedUser();
     if (isset($_GET['Preferences'])) {
         $user->preferences->attributes = $_GET['Preferences'];
         $user->disableBehavior('LoggableBehavior');
         if ($user->validate(array('preferences'))) {
             $user->save(false);
         } else {
             var_dump($user->preferences->errors);
         }
     }
     if (isset($_GET['Sample'])) {
         $model->attributes = $_GET['Sample'];
         //Used to search terms in model->biobank->collection_id and model->biobank->collection_name
         $arrayOfBiobanks = array();
         if (!empty($_GET['collection_id'])) {
             $criteria = new EMongoCriteria();
             $listWords = explode(",", $_GET['collection_id']);
             $regexId = "";
             foreach ($listWords as $word) {
                 $regexId .= "{$word}|";
             }
             $regexId = substr($regexId, 0, -1);
             $criteria->addCond('collection_id', '==', new MongoRegex("/({$regexId})/i"));
             $criteria->select(array('_id'));
             $biobanks = Biobank::model()->findAll($criteria);
             foreach ($biobanks as $biobank) {
                 $arrayOfBiobanks[(string) $biobank->_id] = (string) $biobank->_id;
             }
         }
         if (!empty($_GET['collection_name'])) {
             $criteria = new EMongoCriteria();
             $listWords = explode(",", $_GET['collection_name']);
             $regexId = "";
             foreach ($listWords as $word) {
                 $regexId .= "{$word}|";
             }
             $regexId = substr($regexId, 0, -1);
             $criteria->addCond('collection_name', '==', new MongoRegex("/({$regexId})/i"));
             $criteria->select(array('_id'));
             $biobanks = Biobank::model()->findAll($criteria);
             foreach ($biobanks as $biobank) {
                 $arrayOfBiobanks[$biobank->_id] = (string) $biobank->_id;
             }
         }
         if (!empty($arrayOfBiobanks)) {
             //     $model->arrayOfBiobanks;
             $model->setArrayOfBiobanks(array_values($arrayOfBiobanks));
         }
         $content = '';
         foreach ($_GET['Sample'] as $key => $value) {
             if (is_array($value)) {
                 foreach ($value as $vkey => $vval) {
                     $content = $content . (string) $vkey . '=' . str_replace(';', ',', (string) $vval) . ';';
                 }
             } else {
                 if ($value != null && !empty($value) && (string) $value != '0') {
                     $content = $content . (string) $key . '=' . str_replace(';', ',', (string) $value) . ';';
                 }
             }
         }
         if (Yii::app()->session['SampleForm'] != $_GET['Sample']) {
             $_GET['Echantillon_page'] = null;
             $this->logAdvancedSearch($content);
         }
         Yii::app()->session['SampleForm'] = $_GET['Sample'];
     }
     //form de la recherche intelligente
     $smartForm = new SampleSmartForm();
     if (isset($_POST['SampleSmartForm'])) {
         $model->unsetAttributes();
         $smartForm->attributes = $_POST['SampleSmartForm'];
         if (Yii::app()->session['keywords'] != $smartForm->keywords) {
             $_GET['Echantillon_page'] = null;
             $this->logSmartSearch($smartForm->keywords);
         }
         Yii::app()->session['keywords'] = $smartForm->keywords;
         $model = SmartResearcherTool::search($smartForm->keywords, $biobankId);
     }
     $this->render('search_samples', array('model' => $model, 'smartForm' => $smartForm));
 }
Example #5
0
 /**
  * 获取内容列表
  * http://db.admin.mofang.com/api/card/getitems?setid=1&select=name
  */
 public function actionGetItems()
 {
     $return = array('code' => 0, 'data' => array(), 'pages' => array(), 'show_type' => 1);
     //参数接收
     //http://db.dev.mofang.com/api/card/getitems/setid/4/filter/djfl|珍品::/regex/djname|水/order/xyd|1/page/-2/size/20
     $datasetId = isset($_GET['setid']) ? intval($_GET['setid']) : 0;
     //表id			setid = 4
     $select = isset($_GET['select']) ? $_GET['select'] : '';
     //返回字段		select = data.name
     $filter = isset($_GET['filter']) ? $this->paramStr2Arr($_GET['filter']) : '';
     //过滤条件		filter = djfl|珍品::	m_power|[20,1000](多个且关系)[m_power]魔力在20-1000范围内
     $regex = isset($_GET['regex']) ? $this->paramStr2Arr($_GET['regex']) : '';
     //正则匹配		regex = djname|碎片(目前是不限定头尾匹配,后面需要优化)
     $order = isset($_GET['order']) ? $this->paramStr2Arr($_GET['order']) : '';
     //排序			order = xyd|1
     $currPage = isset($_GET['page']) && $_GET['page'] >= 1 ? intval($_GET['page']) : 1;
     //当前页码		page = 1
     $pageSize = isset($_GET['size']) ? intval($_GET['size']) : 0;
     //每页数量		size = 20
     //参数验证
     if (empty($datasetId)) {
         $return['code'] = -9101;
         //接口参数不足
     }
     $cache_data = null;
     $this->checkCache($cache_data);
     //检查缓存
     if (!empty($cache_data)) {
         echo $cache_data;
         return;
     }
     //开始查询
     if (empty($return['code'])) {
         $dsModel = $this->loadModel($datasetId, 'ds');
         $fields = array_keys($dsModel->fields);
         //查询器
         $criteria = new EMongoCriteria();
         $criteria->addCond('dataset_id', '==', $datasetId);
         //指明对象
         if ($select) {
             $select = explode(',', $select);
             foreach ($select as $skey => $sfield) {
                 $select[$skey] = 'data.' . $sfield;
             }
             array_unshift($select, 'id');
             //压入默认字段
             $criteria->select($select);
         }
         //加入过滤条件
         if ($filter) {
             foreach ($filter as $fkey => $fval) {
                 //特殊处理20:1000 数据
                 if (preg_match("/\\d+:\\d+/", $fval)) {
                     $_numberfield = explode(':', $fval);
                     $_minval = intval($_numberfield[0]);
                     $_maxval = intval($_numberfield[1]);
                     // ==
                     if ($_minval == $_maxval) {
                         $criteria->addCond('data.' . $fkey, '==', $_minval);
                         continue;
                     }
                     !empty($_minval) && $criteria->addCond('data.' . $fkey, '>=', $_minval);
                     if ($_minval <= $_maxval) {
                         !empty($_maxval) && $criteria->addCond('data.' . $fkey, '<=', $_maxval);
                     }
                     continue;
                 }
                 if (in_array($fkey, $fields)) {
                     //只查询定义的字段
                     $criteria->addCond('data.' . $fkey, '==', $fval);
                 } else {
                     if (in_array($fkey, array('id'))) {
                         $criteria->addCond($fkey, '==', intval($fval));
                     }
                 }
             }
         }
         //加入正则
         if ($regex) {
             foreach ($regex as $rkey => $rval) {
                 if (in_array($rkey, $fields)) {
                     //只查询定义的字段
                     $rkey = 'data.' . $rkey;
                     $criteria->{$rkey} = new MongoRegex('/' . $rval . '/i');
                 }
             }
         }
         //排序
         if ($order) {
             foreach ($order as $okey => $oval) {
                 if (in_array($okey, $fields)) {
                     //只查询定义的字段
                     $criteria->sort('data.' . $okey, $oval);
                 }
             }
         } else {
             $criteria->sort('id', EMongoCriteria::SORT_ASC);
             //默认id正序
         }
         //构建分页
         $count = CardItem::model()->count($criteria);
         $pages = new CPagination($count);
         $pages->pageSize = $pageSize;
         $offset = ($currPage - 1) * $pageSize;
         $criteria->limit($pageSize)->offset($offset);
         //查询本页
         $return['data'] = CardItem::model()->findAll($criteria);
         //数据显示方式
         $return['show_type'] = $dsModel->show_type;
         $return['pages'] = array('itemCount' => $count, 'pageSize' => $pageSize, 'currPage' => $currPage);
         foreach ($return['data'] as $rkey => $rval) {
             $arr_info = $return['data'][$rkey]->toArray();
             //清除无用的字段
             unset($arr_info['dataset_id']);
             unset($arr_info['request_times']);
             unset($arr_info['last_uid']);
             unset($arr_info['update_time']);
             unset($arr_info['_id']);
             $return['data'][$rkey] = $arr_info;
         }
         $this->writeCache(CJSON::encode($return));
         //设置缓存
     }
     echo CJSON::encode($return);
 }
Example #6
0
 /**
  * get an array of biobanks used by dropDownLIst.
  * The first line is blank to allow empty case.
  */
 public function getArrayActiveContact()
 {
     $result = array();
     $criteria = new EMongoCriteria();
     $criteria->select(array('_id', 'contact_id'));
     $biobankListe = Biobank::model()->findAll($criteria);
     foreach ($biobankListe as $biobank) {
         if ($biobank->contact_id != null && $biobank->contact_id != "") {
             $contactCriteria = new EMongoCriteria();
             $contactCriteria->_id = new MongoId($biobank->contact_id);
             $contactCriteria->select(array('_id', 'first_name', 'last_name'));
             $contact = Contact::model()->find($contactCriteria);
             $result[(string) $contact->_id] = $contact->last_name . " " . $contact->first_name;
         }
     }
     asort($result);
     return $result;
 }