/** * @since 2.5 * * @param SQLStore $store * * @return SearchTable */ public function newSearchTable(SQLStore $store) { $settings = ApplicationFactory::getInstance()->getSettings(); $searchTable = new SearchTable($store); $searchTable->setEnabled($settings->get('smwgEnabledFulltextSearch')); $searchTable->setPropertyExemptionList($settings->get('smwgFulltextSearchPropertyExemptionList')); $searchTable->setMinTokenSize($settings->get('smwgFulltextSearchMinTokenSize')); return $searchTable; }
public function testIsExemptedProperty() { $instance = new SearchTable($this->store); $instance->setPropertyExemptionList(array('_TEXT')); $property = $this->dataItemFactory->newDIProperty('_TEXT'); $this->assertTrue($instance->isExemptedProperty($property)); $property = $this->dataItemFactory->newDIProperty('Foo'); $property->setPropertyTypeId('_uri'); $this->assertFalse($instance->isExemptedProperty($property)); }
/** * @since 2.5 * * @param ValueDescription $description * @param string $temporaryTable * * @return string */ public function getWhereCondition(ValueDescription $description, $temporaryTable = '') { $affix = ''; $matchableText = $this->getMatchableTextFromDescription($description); // Any query modifier? Take care of it before any tokenizer or ngrams // distort the marker if (($pos = strrpos($matchableText, '&BOL')) !== false || ($pos = strrpos($matchableText, '&INL')) !== false || ($pos = strrpos($matchableText, '&QEX')) !== false) { $affix = mb_strcut($matchableText, $pos); $matchableText = str_replace($affix, '', $matchableText); } $value = $this->textSanitizer->sanitize($matchableText, true); $value .= $affix; // A leading or trailing minus sign indicates that this word must not // be present in any of the rows that are returned. // InnoDB only supports leading minus signs. if ($description->getComparator() === SMW_CMP_NLKE) { $value = '-' . $value; } $temporaryTable = $temporaryTable !== '' ? $temporaryTable . '.' : ''; $column = $temporaryTable . $this->searchTable->getIndexField(); $property = $description->getProperty(); $propertyCondition = ''; // Full text is collected in a single table therefore limit the match // process by adding the PID as an additional condition if ($property !== null) { $propertyCondition = 'AND ' . $temporaryTable . 'p_id=' . $this->searchTable->getPropertyIdBy($property); } $querySearchModifier = $this->getQuerySearchModifier($value); return "MATCH({$column}) AGAINST (" . $this->searchTable->addQuotes($value) . " {$querySearchModifier}) {$propertyCondition}"; }
/** * @since 2.5 * * @param ValueDescription $description * @param string $temporaryTable * * @return string */ public function getWhereCondition(ValueDescription $description, $temporaryTable = '') { $matchableText = $this->getMatchableTextFromDescription($description); $value = $this->textSanitizer->sanitize($matchableText, true); // A leading or trailing minus sign indicates that this word must not // be present in any of the rows that are returned. // InnoDB only supports leading minus signs. if ($description->getComparator() === SMW_CMP_NLKE) { $value = '-' . $value; } // Something like [[Has text::!~database]] will cause a // "malformed MATCH expression" due to "An FTS query may not consist // entirely of terms or term-prefix queries with unary "-" operators // attached to them." and doing "NOT database" will result in an empty // result set $temporaryTable = $temporaryTable !== '' ? $temporaryTable . '.' : ''; $column = $temporaryTable . $this->searchTable->getIndexField(); $property = $description->getProperty(); $propertyCondition = ''; // Full text is collected in a single table therefore limit the match // process by adding the PID as an additional condition if ($property !== null) { $propertyCondition = ' AND ' . $temporaryTable . 'p_id=' . $this->searchTable->addQuotes($this->searchTable->getPropertyIdBy($property)); } return $column . " MATCH " . $this->searchTable->addQuotes($value) . "{$propertyCondition}"; }
/** * @since 2.5 */ public function flushTable() { $this->connection->delete($this->searchTable->getTableName(), '*', __METHOD__); }