private function _checkSolrConfigState()
 {
     $vo_solr = new WLPlugSearchEngineSolr();
     if ($vo_solr->_SolrConfigIsOutdated()) {
         return __CA_SEARCH_CONFIG_WARNING__;
     }
     return __CA_SEARCH_CONFIG_OK__;
 }
Example #2
0
 public function flushContentBuffer()
 {
     /* build Solr xml indexing format for each core */
     $va_post_xml = array();
     foreach (WLPlugSearchEngineSolr::$s_doc_content_buffer as $vs_key => $va_doc_content_buffer) {
         $va_key = explode('/', $vs_key);
         $va_post_xml[$va_key[0]] .= "\t<doc>\n";
         foreach ($va_doc_content_buffer as $vs_field_name => $va_field_content) {
             $va_acc = array();
             foreach ($va_field_content as $vs_field_content) {
                 if (is_array($vs_field_content)) {
                     foreach ($vs_field_content as $vs_field_content_element) {
                         $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="';
                         $va_post_xml[$va_key[0]] .= $vs_field_name;
                         $va_post_xml[$va_key[0]] .= '"><![CDATA[';
                         $va_post_xml[$va_key[0]] .= caEscapeForXML($vs_field_content_element);
                         $va_post_xml[$va_key[0]] .= ']]></field>' . "\n";
                     }
                 } else {
                     $va_acc[] = $vs_field_content;
                 }
             }
             if (sizeof($va_acc)) {
                 $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="';
                 $va_post_xml[$va_key[0]] .= $vs_field_name;
                 $va_post_xml[$va_key[0]] .= '"><![CDATA[';
                 $va_post_xml[$va_key[0]] .= caEscapeForXML(join("\n", $va_acc));
                 $va_post_xml[$va_key[0]] .= ']]></field>' . "\n";
             }
         }
         if (!isset($va_doc_content_buffer[$va_key[0] . "." . $va_key[1]])) {
             /* add pk */
             $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="' . $va_key[0] . "." . $va_key[1] . '">' . $va_key[2] . '</field>' . "\n";
         }
         $va_post_xml[$va_key[0]] .= "\t</doc>\n";
         // Output created on and modified on timestamps
         $qr_res = $this->opo_db->query("\t\n\t\t\t\t\t\t\t\tSELECT ccl.log_id, ccl.log_datetime, ccl.changetype, ccl.user_id\n\t\t\t\t\t\t\t\tFROM ca_change_log ccl\n\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t(ccl.logged_table_num = ?) AND (ccl.logged_row_id = ?)\n\t\t\t\t\t\t\t\t\tAND\n\t\t\t\t\t\t\t\t\t(ccl.changetype <> 'D')\n\t\t\t\t", $this->opo_datamodel->getTableNum($va_key[0]), (int) $va_key[2]);
         while ($qr_res->nextRow()) {
             $va_post_xml[$va_key[0]] .= "\t<doc>\n";
             // We "fake" the <table>.<primary key> value here to be the log_id of the change log entry to ensure that the log entry
             // document has a different unique key than the entry for the actual record. If we didn't do this then we'd overwrite
             // the indexing for the record itself with indexing for successful log entries. Since the SearchEngine is looking for
             // just the primary key, sans table name, it's ok to do this hack.
             $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="' . $va_key[0] . "." . $va_key[1] . '">' . $qr_res->get('log_id') . '</field>' . "\n";
             $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="' . $va_key[1] . '">' . $va_key[2] . '</field>' . "\n";
             if ($qr_res->get('changetype') == 'I') {
                 $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="created"';
                 $va_post_xml[$va_key[0]] .= '><![CDATA[';
                 $va_post_xml[$va_key[0]] .= date("c", $qr_res->get('log_datetime')) . 'Z';
                 $va_post_xml[$va_key[0]] .= ']]></field>' . "\n";
                 $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="created_user_id"><![CDATA[' . $qr_res->get('user_id') . ']]></field>' . "\n";
             } else {
                 $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="modified"';
                 $va_post_xml[$va_key[0]] .= '><![CDATA[';
                 $va_post_xml[$va_key[0]] .= date("c", $qr_res->get('log_datetime')) . 'Z';
                 $va_post_xml[$va_key[0]] .= ']]></field>' . "\n";
                 $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="modified_user_id"><![CDATA[' . $qr_res->get('user_id') . ']]></field>' . "\n";
             }
             $va_post_xml[$va_key[0]] .= "\t</doc>\n";
         }
     }
     /* No delete of the old stuff needed. If the pk (defined as uniqueKey) already exists, it is automatically updated */
     /* send data */
     try {
         $vo_http_client = new Zend_Http_Client();
         foreach ($va_post_xml as $vs_core => $vs_post_xml) {
             $vo_http_client->setUri($this->ops_search_solr_url . "/" . $vs_core . "/update");
             $vo_http_client->setRawData($x = "<add>{$vs_post_xml}</add>")->setEncType('text/xml')->request('POST');
             try {
                 $vo_http_response = $vo_http_client->request();
                 if ($o_resp = new SimpleXMLElement($vo_http_response->getBody())) {
                     $va_status = $o_resp->xpath("/response/lst/int[@name='status']");
                     $vn_status = (int) $va_status[0];
                     if ($vn_status > 0) {
                         caLogEvent('ERR', _t('Indexing failed for %1: status %2, msg %3', $vs_core, $vn_status, $o_resp->asXML()), 'Solr->flushContentBuffer()');
                     } else {
                         /* commit */
                         try {
                             $vs_post_xml = '<commit />';
                             $vo_http_client->setRawData($vs_post_xml)->setEncType('text/xml')->request('POST');
                             $vo_http_response = $vo_http_client->request();
                             if ($o_resp = new SimpleXMLElement($vo_http_response->getBody())) {
                                 $va_status = $o_resp->xpath("/response/lst/int[@name='status']");
                                 $vn_status = (int) $va_status[0];
                                 if ($vn_status > 0) {
                                     caLogEvent('ERR', _t('Indexing commit failed for %1: status %2, msg %3', $vs_core, $vn_status, $o_resp->asXML()), 'Solr->flushContentBuffer()');
                                 }
                             } else {
                                 caLogEvent('ERR', _t('Indexing commit failed for %1: invalid response from SOLR %2', $vs_core, $vo_http_response->getBody()), 'Solr->flushContentBuffer()');
                             }
                         } catch (Exception $e) {
                             // Commit error
                             caLogEvent('ERR', _t('Indexing commit failed: %1; response was %2', $e->getMessage(), $vo_http_response->getBody()), 'Solr->flushContentBuffer()');
                         }
                     }
                 } else {
                     caLogEvent('ERR', _t('Indexing failed for %1: invalid response from SOLR %2', $vs_core, $vo_http_response->getBody()), 'Solr->flushContentBuffer()');
                 }
             } catch (Exception $e) {
                 // Indexing error
                 caLogEvent('ERR', _t('Indexing failed for %1: %2; response was %3', $vs_core, $e->getMessage(), $vo_http_response->getBody()), 'Solr->flushContentBuffer()');
             }
         }
     } catch (Exception $e) {
         caLogEvent('ERR', _t('Could not connect to SOLR server: %1', $e->getMessage()), 'Solr->flushContentBuffer()');
     }
     /* clean up */
     unset($vo_http_client);
     unset($vs_post_xml);
     $this->opa_doc_content_buffer = array();
     WLPlugSearchEngineSolr::$s_doc_content_buffer = array();
 }