/** * @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); }
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; } }
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)); }
/** * 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)); }
/** * 获取内容列表 * 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); }
/** * 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; }