source: pmb4.2/trunk/fuentes/pmb/admin/connecteurs/in/entrez/entrez.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 13.1 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: entrez.class.php,v 1.8.4.1 2015-09-15 14:32:56 apetithomme Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9global $class_path,$base_path, $include_path;
10if (version_compare(PHP_VERSION,'5','>=') && extension_loaded('xsl')) {
11        if (substr(phpversion(), 0, 1) == "5") @ini_set("zend.ze1_compatibility_mode", "0");
12        require_once($include_path.'/xslt-php4-to-php5.inc.php');
13}
14
15require_once("pubmed_analyse_query.class.php");
16/**There be komodo dragons**/
17
18class entrez extends connector {
19        var $available_entrezdatabases = array("pubmed" => "PubMed");
20       
21    function entrez($connector_path="") {
22        parent::connector($connector_path);
23    }
24       
25    function get_id() {
26        return "entrez";
27    }
28   
29    //Est-ce un entrepot ?
30        function is_repository() {
31                return 2;
32        }
33   
34    function source_get_property_form($source_id) {
35        global $charset,$pmb_default_operator;
36       
37        $params=$this->get_source_params($source_id);
38                if ($params["PARAMETERS"]) {
39                        //Affichage du formulaire avec $params["PARAMETERS"]
40                        $vars=unserialize($params["PARAMETERS"]);
41                        foreach ($vars as $key=>$val) {
42                                global $$key;
43                                $$key=$val;
44                        }       
45                }
46                if (!isset($entrez_database))
47                        $entrez_database = "pubmed";
48               
49                if (!isset($entrez_maxresults))
50                        $entrez_maxresults = 100;
51                $entrez_maxresults += 0;
52
53                if (!isset($entrez_operator))
54                        $entrez_operator = 2;
55                $entrez_operator += 0;
56               
57                $options = "";
58                foreach ($this->available_entrezdatabases as $code => $caption)
59                        $options .= '<option value="'.$code.'" '.($code == $entrez_database ? "selected" : "").'>'.htmlentities($caption, ENT_QUOTES, $charset).'</option>';
60
61                $form="<div class='row'>
62                        <div class='colonne3'>
63                                <label for='url'>".$this->msg["entrez_database"]."</label>
64                        </div>
65                        <div class='colonne_suite'>
66                                <select name=\"entrez_database\">
67                                        ".$options."
68                                </select>
69                        </div>
70                </div>";
71                $form="<div class='row'>
72                        <div class='colonne3'>
73                                <label for='operator'>".$this->msg["entrez_operator"]."</label>
74                        </div>
75                        <div class='colonne_suite'>
76                                <select name=\"entrez_operator\">
77                                        <option value='2' ".($entrez_operator == 2 ? "selected" : "").">".$this->msg["entrez_operator_default"]."</option>
78                                        <option value='0' ".($entrez_operator == 0 ? "selected" : "").">".$this->msg["entrez_operator_or"]."</option>
79                                        <option value='1' ".($entrez_operator == 1 ? "selected" : "").">".$this->msg["entrez_operator_and"]."</option>
80                                </select>
81                        </div>
82                </div>";               
83                $form.="<div class='row'>
84                        <div class='colonne3'>
85                                <label for='url'>".$this->msg["entrez_maxresults"]."</label>
86                        </div>
87                        <div class='colonne_suite'>
88                                <input name=\"entrez_maxresults\" type=\"text\" value=\"".$entrez_maxresults."\">
89                        </div>
90                </div>
91                <div class='row'>
92                        <div class='colonne3'>
93                                <label for='xslt_file'>".$this->msg["entrez_xslt_file"]."</label>
94                        </div>
95                        <div class='colonne_suite'>
96                                <input name='xslt_file' type='file'/>";
97                if ($xsl_transform) $form.="<br /><i>".sprintf($this->msg["entrez_xslt_file_linked"],$xsl_transform["name"])."</i> : ".$this->msg["entrez_del_xslt_file"]." <input type='checkbox' name='del_xsl_transform' value='1'/>";
98                 $form.="       </div>
99                </div>
100                <div class='row'></div>
101";
102                return $form;
103    }
104       
105    function make_serialized_source_properties($source_id) {
106        global $entrez_database, $entrez_maxresults, $entrez_operator;
107        global $del_xsl_transform;
108       
109        $t["entrez_database"]=stripslashes($entrez_database);
110        $t["entrez_maxresults"]=$entrez_maxresults+0;
111        $t["entrez_operator"]=$entrez_operator+0;
112       
113        //Vérification du fichier
114        if (($_FILES["xslt_file"])&&(!$_FILES["xslt_file"]["error"])) {
115                $xslt_file_content=array();
116                $xslt_file_content["name"]=$_FILES["xslt_file"]["name"];
117                $xslt_file_content["code"]=file_get_contents($_FILES["xslt_file"]["tmp_name"]);
118                $t["xsl_transform"]=$xslt_file_content;
119        } else if ($del_xsl_transform) {
120                        $t["xsl_transform"]="";
121        } else {
122                $oldparams=$this->get_source_params($source_id);
123                        if ($oldparams["PARAMETERS"]) {
124                                //Anciens paramètres
125                                $oldvars=unserialize($oldparams["PARAMETERS"]);
126                        }
127                        $t["xsl_transform"] = $oldvars["xsl_transform"];
128        }
129
130                $this->sources[$source_id]["PARAMETERS"]=serialize($t);
131        }
132       
133        //Récupération  des proriétés globales par défaut du connecteur (timeout, retry, repository, parameters)
134        function fetch_default_global_values() {
135                $this->timeout=5;
136                $this->repository=2;
137                $this->retry=3;
138                $this->ttl=1800;
139                $this->parameters="";
140        }
141       
142        //Formulaire des propriétés générales
143        function get_property_form() {
144                $this->fetch_global_properties();
145                return "";
146        }
147       
148        function make_serialized_properties() {
149                $this->parameters="";
150        }
151   
152        function apply_xsl_to_xml($xml, $xsl) {
153                global $charset;
154                $xh = xslt_create();
155                xslt_set_encoding($xh, $charset);
156                $arguments = array(
157                  '/_xml' => $xml,
158                  '/_xsl' => $xsl
159                );
160                $result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
161                xslt_free($xh);
162                return $result;         
163        }
164       
165        //Fonction de recherche
166        function search($source_id,$query,$search_id) {
167                global $base_path;
168                global $pmb_default_operator;
169               
170                $params=$this->get_source_params($source_id);
171                $this->fetch_global_properties();
172                if ($params["PARAMETERS"]) {
173                        //Affichage du formulaire avec $params["PARAMETERS"]
174                        $vars=unserialize($params["PARAMETERS"]);
175                        foreach ($vars as $key=>$val) {
176                                global $$key;
177                                $$key=$val;
178                        }       
179                }
180                if (!isset($entrez_database)) {
181                        $this->error_message = $this->msg["entrez_unconfigured"];
182                        $this->error = 1;
183                        return;
184                }
185                $entrez_operator = $entrez_operator+0;
186                $entrez_maxresults= $entrez_maxresults+0;
187               
188                $unimarc_pubmed_mapping = array (
189                        'XXX' => '',
190                        '200$a' => '[Title]',
191                        '7XX' => '[Author]',
192                        '210$c' => '[Publisher]',
193                        '210$d' => '[Publication Date]',
194                        '461$t' => '[Journal]'
195                );
196               
197                $pubmed_stopword = array(
198                        "a","about","again", "all", "almost", "also", "although", "always", "among", "an", "and", "another", "any", "are", "as", "at",
199                        "be", "because", "been", "before", "being", "between", "both","but", "by",
200                        "can", "could",
201                        "did", "do", "does", "done", "due", "during",
202                        "each", "either", "enough", "especially", "etc",
203                        "for", "found", "from", "further",
204                        "had", "has", "have", "having", "here", "how", "however",
205                        "i", "if", "in", "into", "is", "it", "its", "itself",
206                        "just",
207                        "kg", "km",
208                        "made", "mainly", "make", "may", "mg", "might", "ml", "mm", "most", "mostly", "must",
209                        "nearly", "neither", "no", "nor",
210                        "obtained", "of", "often", "on", "our", "overall",
211                        "perhaps", "pmid",
212                        "quite",
213                        "rather", "really", "regarding",
214                        "seem", "seen", "several", "should", "show", "showed", "shown", "shows", "significantly", "since", "so", "some", "such",
215                        "than", "that", "the", "their", "theirs", "them", "then", "there", "therefore", "these", "they", "this", "those", "through", "thus", "to",
216                        "upon", "use", "used", "using",
217                        "various", "very",
218                        "was", "we", "were", "what", "when", "which", "while", "with", "within", "without", "would"
219                );
220               
221                $search_query = "";
222                foreach($query as $aquery){
223                        $search_querys = array();
224                        if($entrez_operator != 2){
225                                $operator = $pmb_default_operator;
226                                $pmb_default_operator = $entrez_operator;
227                        }
228                        $field= (isset($unimarc_pubmed_mapping[$aquery->ufield]) ? $unimarc_pubmed_mapping[$aquery->ufield] : '');
229                        $a=new pubmed_analyse_query($aquery->values[0],0,0,1,0,$field,$pubmed_stopword);
230                        $sub_search_query =$a->show_analyse();
231                        if($entrez_operator != 2) $pmb_default_operator=$operator;
232                        if ($search_query) $search_query = $search_query . " " . strtoupper($aquery->inter) . " " . $sub_search_query;
233                        else $search_query = $sub_search_query;
234                }
235
236                require_once 'entrez_protocol.class.php';
237                $entrez_client = new entrez_request($entrez_database, $search_query);
238                $entrez_client->get_next_idlist($entrez_maxresults);
239                $entrez_client->retrieve_currentidlist_notices();
240                $responses = $entrez_client->get_current_responses();
241               
242                if($xsl_transform){
243                        if($xsl_transform['code'])
244                                $xsl_transform_content = $xsl_transform['code'];
245                        else $xsl_transform_content = "";
246                }       
247                if($xsl_transform_content == "")
248                        $xsl_transform_content = file_get_contents($base_path."/admin/connecteurs/in/entrez/xslt/pubmed_to_unimarc.xsl");
249
250
251                $notices_pmbunimarc = array();
252                foreach ($responses as $aresponse) {
253                        $anotice = $this->apply_xsl_to_xml($aresponse, $xsl_transform_content);
254                        $notices_pmbunimarc[] = $anotice;
255                }
256                foreach($notices_pmbunimarc as $anotice)
257                        $this->rec_records($anotice, $source_id, $search_id, $search_query);
258        }
259       
260        function rec_records($noticesxml, $source_id, $search_id, $search_term="") {
261                global $charset,$base_path;
262                if (!trim($noticesxml))
263                        return;
264
265                $rec_uni_dom=new xml_dom_entrez($noticesxml,$charset);
266                $notices=$rec_uni_dom->get_nodes("unimarc/notice");
267                foreach ($notices as $anotice) {
268                        $this->rec_record($rec_uni_dom, $anotice, $source_id, $search_id, $search_term);
269                }
270        }
271       
272        function rec_record($rec_uni_dom, $noticenode, $source_id, $search_id, $search_term="") {
273                global $charset,$base_path;
274               
275                if (!$rec_uni_dom->error) {
276                        //Initialisation
277                        $ref="";
278                        $ufield="";
279                        $usubfield="";
280                        $field_order=0;
281                        $subfield_order=0;
282                        $value="";
283                        $date_import=date("Y-m-d H:i:s",time());
284                       
285                        $fs=$rec_uni_dom->get_nodes("f", $noticenode);
286
287                        $fs[] = array("NAME" => "f", "ATTRIBS" => array("c" => "1000"), 'TYPE' => 1, "CHILDS" => array(array("DATA" => $search_term, "TYPE" => 2)));
288                        //Recherche du 001
289                        if ($fs)
290                                for ($i=0; $i<count($fs); $i++) {
291                                        if ($fs[$i]["ATTRIBS"]["c"]=="001") {
292                                                $ref=$rec_uni_dom->get_datas($fs[$i]);
293                                                break;
294                                        }
295                                }
296                        if (!$ref) $ref = md5($record);
297                        //Mise à jour
298                        if ($ref) {
299                                //Si conservation des anciennes notices, on regarde si elle existe
300                                if (!$this->del_old) {
301                                        $requete="select count(*) from entrepot_source_".$source_id." where ref='".addslashes($ref)."'";
302                                        $rref=pmb_mysql_query($requete);
303                                        if ($rref) $ref_exists=pmb_mysql_result($rref,0,0);
304                                }
305                                //Si pas de conservation des anciennes notices, on supprime
306                                if ($this->del_old) {
307                                        $requete="delete from entrepot_source_".$source_id." where ref='".addslashes($ref)."'";
308                                        pmb_mysql_query($requete);
309                                        $this->delete_from_external_count($source_id, $ref);
310                                }
311                                $ref_exists = false;
312                                //Si pas de conservation ou ref�rence inexistante
313                                if (($this->del_old)||((!$this->del_old)&&(!$ref_exists))) {
314                                        //Insertion de l'ent�te
315                                        $n_header["rs"]=$rec_uni_dom->get_value("unimarc/notice/rs");
316                                        $n_header["ru"]=$rec_uni_dom->get_value("unimarc/notice/ru");
317                                        $n_header["el"]=$rec_uni_dom->get_value("unimarc/notice/el");
318                                        $n_header["bl"]=$rec_uni_dom->get_value("unimarc/notice/bl");
319                                        $n_header["hl"]=$rec_uni_dom->get_value("unimarc/notice/hl");
320                                        $n_header["dt"]=$rec_uni_dom->get_value("unimarc/notice/dt");
321                                       
322                                        //R�cup�ration d'un ID
323                                        $requete="insert into external_count (recid, source_id) values('".addslashes($this->get_id()." ".$source_id." ".$ref)."', ".$source_id.")";
324                                        $rid=pmb_mysql_query($requete);
325                                        if ($rid) $recid=pmb_mysql_insert_id();
326                                       
327                                        foreach($n_header as $hc=>$code) {
328                                                $requete="insert into entrepot_source_".$source_id." (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid, search_id) values(
329                                                '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".addslashes($date_import)."',
330                                                '".$hc."','',-1,0,'".addslashes($code)."','',$recid, '$search_id')";
331                                                pmb_mysql_query($requete);
332                                        }
333                                        if ($fs)
334                                        for ($i=0; $i<count($fs); $i++) {
335                                                $ufield=$fs[$i]["ATTRIBS"]["c"];
336                                                $field_order=$i;
337                                                $ss=$rec_uni_dom->get_nodes("s",$fs[$i]);
338                                                if (is_array($ss)) {
339                                                        for ($j=0; $j<count($ss); $j++) {
340                                                                $usubfield=$ss[$j]["ATTRIBS"]["c"];
341                                                                $value=$rec_uni_dom->get_datas($ss[$j]);
342                                                                $subfield_order=$j;
343                                                                $requete="insert into entrepot_source_".$source_id." (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid, search_id) values(
344                                                                '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".addslashes($date_import)."',
345                                                                '".addslashes($ufield)."','".addslashes($usubfield)."',".$field_order.",".$subfield_order.",'".addslashes($value)."',
346                                                                ' ".addslashes(strip_empty_words($value))." ',$recid, '$search_id')";
347                                                                pmb_mysql_query($requete);
348                                                        }
349                                                } else {
350                                                        $value=$rec_uni_dom->get_datas($fs[$i]);
351                                                        $requete="insert into entrepot_source_".$source_id." (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid, search_id) values(
352                                                        '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".addslashes($date_import)."',
353                                                        '".addslashes($ufield)."','".addslashes($usubfield)."',".$field_order.",".$subfield_order.",'".addslashes($value)."',
354                                                        ' ".addslashes(strip_empty_words($value))." ',$recid, '$search_id')";
355                                                        pmb_mysql_query($requete);
356                                                }
357                                        }
358                                }
359                                $this->n_recu++;
360                        }
361                }
362        }
363       
364}
365
366?>
Note: See TracBrowser for help on using the repository browser.