예제 #1
0
 public function __construct(SearchEngineInterface $searchEngine)
 {
     $this->setName('Search Engine');
     foreach ($searchEngine->getStatus() as $infos) {
         $this->addInformation($infos[0], $infos[1]);
     }
 }
 public function testExcerptFromSimpleQuery()
 {
     $record = self::$DI['record_2'];
     $query_string = 'boomboklot' . $record->get_record_id() . 'excerptSimpleQuery';
     $this->editRecord($query_string, $record);
     self::$searchEngine->addRecord($record);
     $this->updateIndex();
     self::$searchEngine->resetCache();
     $results = self::$searchEngine->query($query_string, 0, 1, $this->options);
     $fields = [];
     $foundRecord = $results->getResults()->first();
     $this->assertInstanceOf('\\record_adapter', $foundRecord);
     foreach ($foundRecord->get_caption()->get_fields() as $field) {
         foreach ($field->get_values() as $metaId => $v) {
             $values[$metaId] = ['value' => $v->getValue(), 'from_thesaurus' => false, 'qjs' => null];
         }
         $fields[$field->get_name()] = ['values' => $values, 'separator' => ';'];
     }
     $found = false;
     $highlightedValues = self::$searchEngine->excerpt($query_string, $fields, $foundRecord);
     foreach ($highlightedValues as $fieldValues) {
         foreach ($fieldValues as $metaId => $field) {
             if (strpos($field, '[[em]]') !== false && strpos($field, '[[/em]]') !== false) {
                 $found = true;
                 break 2;
             }
         }
     }
     if (!$found && count($highlightedValues) > 0) {
         $this->fail('Unable to build the excerpt');
     }
 }
예제 #3
0
 /**
  * @todo move this fun in caption_field object
  * @param  string                $highlight
  * @param  array                 $grep_fields
  * @param  SearchEngineInterface $searchEngine
  * @return array
  */
 protected function highlight_fields($highlight, array $grep_fields = null, SearchEngineInterface $searchEngine = null, $includeBusiness = false, SearchEngineOptions $options = null)
 {
     $fields = [];
     foreach ($this->get_fields($grep_fields, $includeBusiness) as $meta_struct_id => $field) {
         $value = preg_replace("(([^']{1})((https?|file):((/{2,4})|(\\{2,4}))[\\w:#%/;\$()~_?/\\-=\\\\.&]*)([^']{1}))", '$1 $2 <a title="' . $this->app->trans('Open the URL in a new window') . '" class="ui-icon ui-icon-extlink" href="$2" style="display:inline;padding:2px 5px;margin:0 4px 0 2px;" target="_blank"> &nbsp;</a>$7', $highlight ? $field->highlight_thesaurus() : $field->get_serialized_values(false, false));
         $fields[$field->get_name()] = ['value' => $value, 'label' => $field->get_databox_field()->get_label($this->app['locale']), 'separator' => $field->get_databox_field()->get_separator()];
     }
     if ($searchEngine instanceof SearchEngineInterface) {
         $ret = $searchEngine->excerpt($highlight, $fields, $this->record, $options);
         if ($ret) {
             $n = -1;
             foreach ($fields as $key => $value) {
                 $n++;
                 if (!isset($fields[$key])) {
                     continue;
                 }
                 if (strpos($fields[$key]['value'], '<a class="bounce" ') !== false) {
                     continue;
                 }
                 //if(strpos($fields[$key]['value'], '<a ') === false)
                 $fields[$key]['value'] = $ret[$n];
             }
         }
     }
     return $fields;
 }
예제 #4
0
 public function get_train($pos = 0, $query = '', SearchEngineInterface $search_engine = null)
 {
     if ($this->train) {
         return $this->train;
     }
     switch ($this->env) {
         case 'RESULT':
             $perPage = 56;
             $index = $pos - 3 < 0 ? 0 : $pos - 3;
             $results = $search_engine->query($query, $index, $perPage);
             $this->train = $results->getResults()->toArray();
             break;
         case 'BASK':
             $this->train = $this->container->getElements();
             break;
         case 'REG':
             $this->train = $this->container->get_children();
             break;
     }
     return $this->train;
 }
예제 #5
0
 /**
  *
  * @param string                $highlight
  * @param array                 $grep_fields
  * @param SearchEngineInterface $searchEngine
  * @param Boolean               $includeBusiness
  *
  * @return array
  */
 public function get_highlight_fields($highlight = '', array $grep_fields = null, SearchEngineInterface $searchEngine = null, $includeBusiness = false, SearchEngineOptions $options = null)
 {
     $fields = [];
     foreach ($this->get_fields($grep_fields, $includeBusiness) as $meta_struct_id => $field) {
         $values = [];
         foreach ($field->get_values() as $metaId => $v) {
             $values[$metaId] = ['value' => $v->getValue(), 'from_thesaurus' => $highlight ? $v->isThesaurusValue() : false, 'qjs' => $v->getQjs()];
         }
         $fields[$field->get_name()] = ['values' => $values, 'name' => $field->get_name(), 'label_name' => $field->get_databox_field()->get_label($this->app['locale']), 'separator' => $field->get_databox_field()->get_separator(), 'sbas_id' => $field->get_databox_field()->get_databox()->get_sbas_id()];
     }
     if ($searchEngine instanceof SearchEngineInterface) {
         $ret = $searchEngine->excerpt($highlight, $fields, $this->record, $options);
         // sets highlighted value from search engine, highlighted values will now
         // be surrounded by [[em]][[/em]] tags
         if ($ret) {
             foreach ($fields as $key => $value) {
                 if (!isset($ret[$key])) {
                     continue;
                 }
                 foreach ($ret[$key] as $metaId => $newValue) {
                     $fields[$key]['values'][$metaId]['value'] = $newValue;
                 }
             }
         }
     }
     return $fields;
 }
예제 #6
0
 public function __construct(Application $app, $env, $pos, $contId, SearchEngineInterface $search_engine = null, $query = '', SearchEngineOptions $options = null)
 {
     $number = null;
     $this->env = $env;
     $this->app = $app;
     $this->pos = $pos;
     $this->searchEngine = $search_engine;
     $this->query = $query;
     $this->options = $options;
     switch ($env) {
         case "RESULT":
             if (null === $search_engine) {
                 throw new \LogicException('Search Engine should be provided');
             }
             $results = $search_engine->query($query, (int) $pos, 1, $options);
             if ($results->getResults()->isEmpty()) {
                 throw new Exception('Record introuvable');
             }
             foreach ($results->getResults() as $record) {
                 $number = $pos;
                 $this->original_item = $record;
                 $sbas_id = $record->getDataboxId();
                 $record_id = $record->getRecordId();
                 break;
             }
             break;
         case "REG":
             $contId = explode('_', $contId);
             $sbas_id = $contId[0];
             $record_id = $contId[1];
             $this->container = new record_adapter($app, $sbas_id, $record_id);
             $this->original_item = $this->container;
             if ($pos == 0) {
                 $number = 0;
             } else {
                 $children = $this->container->get_children();
                 foreach ($children as $child) {
                     $sbas_id = $child->get_sbas_id();
                     $this->original_item = $child;
                     $record_id = $child->get_record_id();
                     if ($child->getNumber() == $pos) {
                         break;
                     }
                 }
                 $number = $pos;
                 $this->total = $children->get_count();
             }
             break;
         case "BASK":
             $Basket = $app['converter.basket']->convert($contId);
             $app['acl.basket']->hasAccess($Basket, $app->getAuthenticatedUser());
             /* @var $Basket Basket */
             $this->container = $Basket;
             $this->total = $Basket->getElements()->count();
             $i = 0;
             $first = true;
             foreach ($Basket->getElements() as $element) {
                 /* @var $element BasketElement */
                 $i++;
                 if ($first) {
                     $this->original_item = $element;
                     $sbas_id = $element->getRecord($this->app)->get_sbas_id();
                     $record_id = $element->getRecord($this->app)->get_record_id();
                     $this->name = $Basket->getName();
                     $number = $element->getOrd();
                 }
                 $first = false;
                 if ($element->getOrd() == $pos) {
                     $this->original_item = $element;
                     $sbas_id = $element->getRecord($this->app)->get_sbas_id();
                     $record_id = $element->getRecord($this->app)->get_record_id();
                     $this->name = $Basket->getName();
                     $number = $element->getOrd();
                 }
             }
             break;
         case "FEED":
             $entry = $app['repo.feed-entries']->find($contId);
             $this->container = $entry;
             $this->total = count($entry->getItems());
             $i = 0;
             $first = true;
             foreach ($entry->getItems() as $element) {
                 $i++;
                 if ($first) {
                     $sbas_id = $element->getRecord($this->app)->get_sbas_id();
                     $record_id = $element->getRecord($this->app)->get_record_id();
                     $this->name = $entry->getTitle();
                     $this->original_item = $element;
                     $number = $element->getOrd();
                 }
                 $first = false;
                 if ($element->getOrd() == $pos) {
                     $sbas_id = $element->getRecord($this->app)->get_sbas_id();
                     $record_id = $element->getRecord($this->app)->get_record_id();
                     $this->name = $entry->getTitle();
                     $this->original_item = $element;
                     $number = $element->getOrd();
                 }
             }
             break;
     }
     parent::__construct($app, $sbas_id, $record_id, $number);
 }