/** * Adds conditions, matches and where clauses to the query * @param IKalturaIndexQuery $query */ public function applyCondition(IKalturaDbQuery $query) { switch ($this->getComparison()) { case KalturaSearchConditionComparison::EQUAL: $comparison = ' = '; break; case KalturaSearchConditionComparison::GREATER_THAN: $comparison = ' > '; break; case KalturaSearchConditionComparison::GREATER_THAN_OR_EQUAL: $comparison = ' >= '; break; case KalturaSearchConditionComparison::LESS_THAN: $comparison = " < "; break; case KalturaSearchConditionComparison::LESS_THAN_OR_EQUAL: $comparison = " <= "; break; case KalturaSearchConditionComparison::NOT_EQUAL: $comparison = " <> "; break; default: KalturaLog::ERR("Missing comparison type"); return; } $field = $this->getField(); $value = $this->getValue(); $fieldValue = null; switch ($field) { case Criteria::CURRENT_DATE: $d = getdate(); $fieldValue = mktime(0, 0, 0, $d['mon'], $d['mday'], $d['year']); break; case Criteria::CURRENT_TIME: case Criteria::CURRENT_TIMESTAMP: $fieldValue = time(); break; default: KalturaLog::err('Unknown field [' . $field . ']'); return; } $newCondition = $fieldValue . $comparison . SphinxUtils::escapeString($value); $query->addCondition($newCondition); }
public function getFreeTextConditions($freeTexts) { $additionalConditions = array(); if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; // $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") $freeText"; $additionalConditions[] = '@plugins_data ' . MetadataPlugin::PLUGIN_NAME . "_text << {$freeTexts}"; return $additionalConditions; } if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($freeTextsArr[$valIndex]); } } foreach ($freeTextsArr as $freeText) { // $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") $freeText"; $additionalConditions[] = '@plugins_data ' . MetadataPlugin::PLUGIN_NAME . "_text << {$freeText}"; } return $additionalConditions; } $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($freeTextsArr[$valIndex]); } } $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); // $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") $freeTextExpr"; $additionalConditions[] = '@plugins_data ' . MetadataPlugin::PLUGIN_NAME . "_text << {$freeTextExpr}"; return $additionalConditions; }
protected function getStringMatchClause($sphinxField, $comparison, $value) { $obejctClass = $this->criteria->getIndexObjectName(); $fieldsEscapeType = $obejctClass::getSearchFieldsEscapeType($sphinxField); $partnerId = kCurrentContext::getCurrentPartnerId(); $notEmpty = kSphinxSearchManager::HAS_VALUE . $partnerId; switch ($comparison) { case Criteria::EQUAL: $value = SphinxUtils::escapeString($value, $fieldsEscapeType); if ($obejctClass::isNullableField($sphinxField)) { return "@{$sphinxField} \\\"^{$value} {$notEmpty}\$\\\""; } else { return "@{$sphinxField} \\\"^{$value}\$\\\""; } case Criteria::ISNULL: $isEmpty = kSphinxSearchManager::HAS_NO_VALUE . $partnerId; return "@{$sphinxField} {$isEmpty}"; case Criteria::ISNOTNULL: return "@{$sphinxField} {$notEmpty}"; case Criteria::NOT_IN: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = $this->criteria->getFieldPrefix($sphinxField) . ' !' . implode(' !', $vals); return "@{$sphinxField} {$val}"; } break; case Criteria::IN: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $vals = array_filter($vals, 'trim'); if ($obejctClass::isNullableField($sphinxField)) { $val = "((\\\"^" . implode(" {$notEmpty}\$\\\") | (\\\"^", $vals) . " {$notEmpty}\$\\\"))"; } else { $val = "((\\\"^" . implode("\$\\\") | (\\\"^", $vals) . "\$\\\"))"; } return "@{$sphinxField} {$val}"; } break; case KalturaCriteria::IN_LIKE: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '(("' . implode('") | ("', $vals) . '"))'; return "@{$sphinxField} {$val}"; } break; case KalturaCriteria::IN_LIKE_ORDER: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $valValue = explode(',', $valValue); $valValue = implode(' << ', $valValue); $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '((' . implode(') | (', $vals) . '))'; return "@{$sphinxField} {$val}"; } break; case baseObjectFilter::MULTI_LIKE_AND: case baseObjectFilter::MATCH_AND: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!strlen($valValue)) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { //if there are spaces or tabs - should add "<VALUE>" $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue, $fieldsEscapeType) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $val = implode(' ', $vals); return "(@{$sphinxField} {$val})"; } break; case baseObjectFilter::MULTI_LIKE_OR: case baseObjectFilter::MATCH_OR: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!strlen($valValue)) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue, $fieldsEscapeType) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $val = implode(' | ', $vals); return "(@{$sphinxField} {$val})"; } break; default: $value = SphinxUtils::escapeString($value, $fieldsEscapeType); return "@{$sphinxField} {$value}"; } return null; }
/** * @param IIndexable $object * @param bool $isInsert * @param bool $force * @return string|bool */ public function getSphinxSaveSql(IIndexable $object, $isInsert = false, $force = false) { $id = $object->getIntId(); if (!$id) { KalturaLog::err("Object [" . get_class($object) . "] id [" . $object->getId() . "] could not be saved to sphinx, int_id is empty"); return false; } // if(!$force && !$isInsert && !$this->saveToSphinxRequired($object)) // return false; $data = array('id' => $id); // NOTE: the order matters $dataStrings = array(); $dataInts = array(); $dataTimes = array(); $fields = $object->getIndexFieldsMap(); foreach ($fields as $field => $getterName) { $fieldType = $object->getIndexFieldType($field); $getter = "get{$getterName}"; switch ($fieldType) { case IIndexable::FIELD_TYPE_STRING: $dataStrings[$field] = $object->{$getter}(); break; case IIndexable::FIELD_TYPE_INTEGER: $dataInts[$field] = $object->{$getter}(); break; case IIndexable::FIELD_TYPE_DATETIME: $dataTimes[$field] = $object->{$getter}(null); break; } } // TODO - remove after solving the replace bug that removes all fields $pluginInstances = KalturaPluginManager::getPluginInstances('IKalturaSearchDataContributor'); $sphinxPluginsData = array(); foreach ($pluginInstances as $pluginName => $pluginInstance) { KalturaLog::debug("Loading {$pluginName} sphinx texts"); $sphinxPluginData = null; try { $sphinxPluginData = $pluginInstance->getSearchData($object); } catch (Exception $e) { KalturaLog::err($e->getMessage()); continue; } if ($sphinxPluginData) { KalturaLog::debug("Sphinx data for {$pluginName} [" . print_r($sphinxPluginData, true) . "]"); foreach ($sphinxPluginData as $fieldName => $fieldValue) { if (isset($sphinxPluginsData[$fieldName])) { $sphinxPluginsData[$fieldName] .= ' ' . $fieldValue; } else { $sphinxPluginsData[$fieldName] = $fieldValue; } } } } foreach ($sphinxPluginsData as $key => $value) { if (!is_numeric($value)) { $value = SphinxUtils::escapeString($value, SearchIndexFieldEscapeType::DEFAULT_ESCAPE, 1); $search = array("", "\n", "\r", ""); $replace = array("\\0", "\\n", "\\r", "\\Z"); $value = str_replace($search, $replace, $value); $data[$key] = "'{$value}'"; } else { // $value = (int)$value; $data[$key] = is_numeric($value) ? $value : 0; } } foreach ($dataStrings as $key => $value) { $escapeType = $object->getSearchIndexFieldsEscapeType($key); $value = SphinxUtils::escapeString($value, $escapeType, 1); $search = array("", "\n", "\r", ""); $replace = array("\\0", "\\n", "\\r", "\\Z"); $value = str_replace($search, $replace, $value); $data[$key] = "'{$value}'"; } foreach ($dataInts as $key => $value) { if (is_bool($value)) { $value = intval($value); } $data[$key] = is_numeric($value) ? $value : 0; } foreach ($dataTimes as $key => $value) { // $value = (int)$value; $data[$key] = is_numeric($value) ? $value : 0; } $values = implode(',', $data); $fields = implode(',', array_keys($data)); $index = kSphinxSearchManager::getSphinxIndexName($object->getObjectIndexName()); return "replace into {$index} ({$fields}) values({$values})"; }
/** * @param IIndexable $object * @param bool $isInsert * @param bool $force * @param array $options - an array of additional options * e.g. array("format" => "xmlPipe2", "placeHolders" => array("plays" => "__PLAYS__", "views" => "__VIEWS__")) * format = xmlPipe2 : produce an xml document for indexing using the Sphinx indexer tool * placeHolders : replace given fields values with place holders instead of the actual field value * used for caching entry sphinx sql when changing plays and views count * @return string|bool */ public function getSphinxSaveSql(IIndexable $object, $isInsert = false, $force = false, $options = null) { $id = $object->getIntId(); if (!$id) { KalturaLog::err("Object [" . get_class($object) . "] id [" . $object->getId() . "] could not be saved to sphinx, int_id is empty"); return false; } // if(!$force && !$isInsert && !$this->saveToSphinxRequired($object)) // return false; $data = array('id' => $id); // NOTE: the order matters $dataStrings = array(); $dataInts = array(); $dataTimes = array(); $dataJson = array(); $objectIndexClass = $object->getIndexObjectName(); $fields = $objectIndexClass::getIndexFieldsMap(); foreach ($fields as $field => $getterName) { $getter = "get" . $getterName; $fieldType = $objectIndexClass::getFieldType($field); $nullable = $objectIndexClass::isNullableField($field); switch ($fieldType) { case IIndexable::FIELD_TYPE_STRING: $value = $object->{$getter}(); if ($nullable) { if (is_null($value) || $value === '') { $value = self::HAS_NO_VALUE . $object->getPartnerId(); } else { $value .= ' ' . self::HAS_VALUE . $object->getPartnerId(); } } $dataStrings[$field] = $value; break; case IIndexable::FIELD_TYPE_INTEGER: $dataInts[$field] = $object->{$getter}(); break; case IIndexable::FIELD_TYPE_DATETIME: $dataTimes[$field] = $object->{$getter}(null); break; case IIndexable::FIELD_TYPE_JSON: $dataJson[$field] = $object->{$getter}(); break; } } // TODO - remove after solving the replace bug that removes all fields $pluginInstances = KalturaPluginManager::getPluginInstances('IKalturaSearchDataContributor'); $sphinxPluginsData = array(); foreach ($pluginInstances as $pluginName => $pluginInstance) { KalturaLog::debug("Loading {$pluginName} sphinx texts"); $sphinxPluginData = null; try { $sphinxPluginData = $pluginInstance->getSearchData($object); } catch (Exception $e) { KalturaLog::err($e->getMessage()); continue; } if ($sphinxPluginData) { KalturaLog::debug("Sphinx data for {$pluginName} [" . print_r($sphinxPluginData, true) . "]"); foreach ($sphinxPluginData as $fieldName => $fieldValue) { if (isset($sphinxPluginsData[$fieldName])) { $sphinxPluginsData[$fieldName] .= ' ' . $fieldValue; } else { $sphinxPluginsData[$fieldName] = $fieldValue; } } } } $xmlPipe2 = isset($options["format"]) ? $options["format"] == "xmlPipe2" : false; foreach ($sphinxPluginsData as $key => $value) { if (is_array($value)) { if (isset($dataJson[$key])) { $value = array_merge($value, $dataJson[$key]); } $dataJson[$key] = $value; } else { if (is_numeric($value)) { $data[$key] = $value; } else { $value = $xmlPipe2 ? $value : SphinxUtils::escapeString($value, SearchIndexFieldEscapeType::DEFAULT_ESCAPE, 1); $search = array("", "\n", "\r", ""); $replace = array("\\0", "\\n", "\\r", "\\Z"); $value = str_replace($search, $replace, $value); $data[$key] = "'{$value}'"; } } } foreach ($dataStrings as $key => $value) { $escapeType = $objectIndexClass::getIndexFieldsEscapeType($key); $value = $xmlPipe2 ? $value : SphinxUtils::escapeString($value, $escapeType, 1); $search = array("", "\n", "\r", ""); $replace = array("\\0", "\\n", "\\r", "\\Z"); $value = str_replace($search, $replace, $value); $data[$key] = "'{$value}'"; } foreach ($dataInts as $key => $value) { if (is_bool($value)) { $value = intval($value); } $data[$key] = is_numeric($value) ? $value : 0; } foreach ($dataTimes as $key => $value) { $data[$key] = is_numeric($value) ? $value : 0; } foreach ($dataJson as $key => $value) { foreach ($value as $jsonKey => $jsonValue) { if (is_string($jsonValue)) { $value[$jsonKey] = SphinxUtils::escapeString($jsonValue, SearchIndexFieldEscapeType::DEFAULT_ESCAPE, 1); } } $valueStr = json_encode($value); $data[$key] = "'" . $valueStr . "'"; } $index = kSphinxSearchManager::getSphinxIndexName($objectIndexClass::getObjectIndexName()); $placeHolders = isset($options["placeHolders"]) ? $options["placeHolders"] : false; if (is_array($placeHolders)) { foreach ($placeHolders as $placeHolderField => $placeHolderValue) { if (isset($data[$placeHolderField])) { $data[$placeHolderField] = $placeHolderValue; } } } if ($xmlPipe2) { $dom = new DomDocument('1.0'); $node = $dom->createElement('sphinx:document'); $node->setAttribute('id', $data["id"]); unset($data["id"]); foreach ($data as $field => $value) { $tmp = $dom->createElement($field); $tmp->appendChild($dom->createTextNode(utf8_encode(trim($value, "'")))); $node->appendChild($tmp); } //$dom->appendChild($node); return $dom->saveXML($node); $str = "<sphinx:document id=\"" . $data["id"] . "\">"; unset($data["id"]); foreach ($data as $field => $value) { $str .= "<{$field}><![CDATA[{$value}]]></{$field}>\n"; } $str .= "</sphinx:document>"; return $str; } $values = implode(',', $data); $fields = implode(',', array_keys($data)); return "replace into {$index} ({$fields}) values({$values})"; }
/** * Applies all filter fields and unset the handled fields * * @param baseObjectFilter $filter */ protected function applyFilterFields(baseObjectFilter $filter) { foreach ($filter->fields as $field => $val) { if (is_null($val) || !strlen($val) || $field == '_order_by') { continue; } $fieldParts = explode(baseObjectFilter::FILTER_PREFIX, $field, 3); if (count($fieldParts) != 3) { KalturaLog::debug("Skip field[{$field}] has [" . count($fieldParts) . "] parts"); continue; } list($prefix, $operator, $fieldName) = $fieldParts; $fieldNamesArr = explode(baseObjectFilter::OR_SEPARATOR, $fieldName); if (count($fieldNamesArr) > 1) { $sphinxFieldNames = array(); foreach ($fieldNamesArr as $fieldName) { $sphinxField = $this->getSphinxFieldName($fieldName); $type = $this->getSphinxFieldType($sphinxField); $sphinxFieldNames[] = $sphinxField; } $sphinxField = '(' . implode(',', $sphinxFieldNames) . ')'; $vals = is_array($val) ? $val : array_unique(explode(baseObjectFilter::OR_SEPARATOR, $val)); $val = implode(' ', $vals); } elseif (!$this->hasMatchableField($fieldName)) { KalturaLog::debug("Skip field[{$field}] has no matchable for name[{$fieldName}]"); continue; } else { $sphinxField = $this->getSphinxFieldName($fieldName); $type = $this->getSphinxFieldType($sphinxField); } $valStr = print_r($val, true); $fieldsEscapeType = $this->getSearchIndexFieldsEscapeType($fieldName); KalturaLog::debug("Attach field[{$fieldName}] as sphinx field[{$sphinxField}] of type [{$type}] and comparison[{$operator}] for value[{$valStr}]"); switch ($operator) { case baseObjectFilter::MULTI_LIKE_OR: case baseObjectFilter::MATCH_OR: $vals = is_array($val) ? $val : explode(',', $val); foreach ($vals as $valIndex => $valValue) { if (!$valValue) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue, $fieldsEscapeType) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $val = implode(' | ', $vals); $this->addMatch("@{$sphinxField} {$val}"); $filter->unsetByName($field); } break; case baseObjectFilter::NOT_IN: $vals = is_array($val) ? $val : explode(',', $val); foreach ($vals as $valIndex => $valValue) { if (!$valValue) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue, $fieldsEscapeType) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = $this->getPositiveMatch($sphinxField) . ' !' . implode(' !', $vals); $this->addMatch("@{$sphinxField} {$val}"); $filter->unsetByName($field); } break; case baseObjectFilter::IN: $vals = is_array($val) ? $val : explode(',', $val); foreach ($vals as $valIndex => $valValue) { if (!$valValue) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '((^' . implode('$) | (^', $vals) . '$))'; $this->addMatch("@{$sphinxField} {$val}"); $filter->unsetByName($field); } break; case baseObjectFilter::EQ: if (is_numeric($val) || strlen($val) > 0) { $val = SphinxUtils::escapeString($val, $fieldsEscapeType); $this->addMatch("@{$sphinxField} ^{$val}\$"); $filter->unsetByName($field); } break; case baseObjectFilter::MULTI_LIKE_AND: case baseObjectFilter::MATCH_AND: $vals = is_array($val) ? $val : explode(',', $val); foreach ($vals as $valIndex => $valValue) { if (!$valValue) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { //if there are spaces or tabs - should add "<VALUE>" $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue, $fieldsEscapeType) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $val = implode(' ', $vals); $this->addMatch("@{$sphinxField} {$val}"); $filter->unsetByName($field); } break; case baseObjectFilter::LIKE: if (strlen($val)) { if (preg_match('/[\\s\\t]/', $val)) { //if there are spaces or tabs - should add "<VALUE>" $val = '"' . SphinxUtils::escapeString($val, $fieldsEscapeType) . '"'; } else { $val = SphinxUtils::escapeString($val, $fieldsEscapeType); } $this->addMatch("@{$sphinxField} {$val}"); $filter->unsetByName($field); } break; case baseObjectFilter::LIKEX: if (strlen($val)) { $val = SphinxUtils::escapeString($val, $fieldsEscapeType); if ($fieldsEscapeType != SearchIndexFieldEscapeType::MD5_LOWER_CASE) { $this->addMatch('@' . $sphinxField . ' "' . $val . '\\\\*"'); } else { $this->addMatch('@' . $sphinxField . ' "' . $val . '"'); } $filter->unsetByName($field); } break; case baseObjectFilter::NOT_CONTAINS: $val = is_array($val) ? $val : explode(",", $val); foreach ($val as &$singleVal) { $singleVal = SphinxUtils::escapeString($singleVal, $fieldsEscapeType); } if ($this->getFieldPrefix($sphinxField)) { $this->addMatch('@' . $sphinxField . ' ' . $this->getFieldPrefix($sphinxField) . ' -(' . implode(' | ', $val) . ')'); } $filter->unsetByName($field); break; default: KalturaLog::debug("Skip field[{$field}] has no opertaor[{$operator}]"); } } }
/** * Applies all filter fields and unset the handled fields * * @param baseObjectFilter $filter */ protected function applyFilterFields(baseObjectFilter $filter) { if ($filter->get("_matchand_categories") !== null) { $filter->set("_matchand_categories_ids", $filter->categoryNamesToIds($filter->get("_matchand_categories"))); $filter->unsetByName('_matchand_categories'); } if ($filter->get("_matchor_categories") !== null) { $filter->set("_matchor_categories_ids", $filter->categoryNamesToIds($filter->get("_matchor_categories"))); $filter->unsetByName('_matchor_categories'); } // if ($filter->get("_matchor_duration_type") !== null) // $filter->set("_matchor_duration_type", $filter->durationTypesToIndexedStrings($filter->get("_matchor_duration_type"))); if ($filter->get(baseObjectFilter::ORDER) === "recent") { $filter->set("_lte_available_from", time()); $filter->set("_gteornull_end_date", time()); // schedule not finished $filter->set(baseObjectFilter::ORDER, "-available_from"); } if ($filter->get('_free_text')) { $freeTexts = $filter->get('_free_text'); KalturaLog::debug("Attach free text [{$freeTexts}]"); $additionalConditions = array(); $advancedSearch = $filter->getAdvancedSearch(); if ($advancedSearch) { $additionalConditions = $advancedSearch->getFreeTextConditions($freeTexts); } if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") {$freeText}"; } else { if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } foreach ($freeTextsArr as $freeText) { $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") {$freeText}"; } } else { $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") {$freeTextExpr}"; } } if (count($additionalConditions)) { $matches = reset($additionalConditions); if (count($additionalConditions) > 1) { $matches = '(' . implode(') | (', $additionalConditions) . ')'; } $this->matchClause[] = $matches; } } $filter->unsetByName('_free_text'); return parent::applyFilterFields($filter); }
public function apply(array &$whereClause, array &$matchClause) { $field = $this->getTable() . '.' . $this->getColumn(); if ($this->hasOr) { KalturaLog::debug("Can't apply criterion [{$field}] has OR"); return false; } KalturaLog::debug("Applies criterion [{$field}]"); $clauses = $this->getClauses(); if (count($clauses)) { foreach ($clauses as $clause) { if (!$clause instanceof SphinxCriterion) { KalturaLog::debug("Clause [" . $clause->getColumn() . "] is not Kaltura criteria"); return false; } if (!$clause->apply($whereClause, $matchClause)) { KalturaLog::debug("Failed to apply clause [" . $clause->getColumn() . "]"); return false; } } } $comparison = $this->getComparison(); if ($comparison == Criteria::CUSTOM || $comparison == Criteria::CUSTOM_EQUAL || $comparison == Criteria::ISNOTNULL) { KalturaLog::debug("Skip criterion[{$field}] unhandled comparison [{$comparison}]"); return false; } if (!$this->criteria->hasSphinxFieldName($field)) { KalturaLog::debug("Skip criterion[{$field}] has no sphinx field"); return false; } $value = $this->getValue(); $sphinxField = $this->criteria->getSphinxFieldName($field); $type = $this->criteria->getSphinxFieldType($sphinxField); if ($field == entryPeer::ID) { if ($comparison == Criteria::EQUAL) { $comparison = Criteria::IN; } if ($comparison == Criteria::NOT_EQUAL) { $comparison = Criteria::NOT_IN; } if (!is_array($value)) { $value = explode(',', $value); } $entryIds = array(); foreach ($value as $val) { $entryIds[$val] = crc32($val); } $value = $entryIds; $this->criteria->setEntryIds($comparison, $entryIds); } $valStr = print_r($value, true); KalturaLog::debug("Attach criterion[{$field}] as sphinx field[{$sphinxField}] of type [{$type}] and comparison[{$comparison}] for value[{$valStr}]"); if (is_string($value)) { // needed since otherwise the switch statement doesn't work as expected otherwise switch ($value) { case Criteria::CURRENT_DATE: $d = getdate(); $value = mktime(0, 0, 0, $d['mon'], $d['mday'], $d['year']); break; case Criteria::CURRENT_TIME: case Criteria::CURRENT_TIMESTAMP: $value = time(); break; } } if ($type == 'string') { switch ($comparison) { case Criteria::EQUAL: $value = SphinxUtils::escapeString($value); $matchClause[] = "@{$sphinxField} ^{$value}\$"; break; case Criteria::NOT_IN: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '!' . implode(' & !', $vals); $matchClause[] = "@{$sphinxField} {$val}"; } break; case Criteria::IN: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '(^' . implode('$ | ^', $vals) . '$)'; $matchClause[] = "@{$sphinxField} {$val}"; } break; default: $value = SphinxUtils::escapeString($value); $matchClause[] = "@{$sphinxField} {$value}"; break; } return true; } switch ($comparison) { case Criteria::IN: $value = is_array($value) ? $value : explode(',', $value); sort($value); // importent, solves sphinx IN bug foreach ($value as $valIndex => $valValue) { if (is_null($valValue) || !strlen(trim($valValue))) { unset($value[$valIndex]); } } $value = array_slice($value, 0, SphinxCriterion::MAX_IN_VALUES); $values = implode(',', $value); $whereClause[] = "{$sphinxField} in({$values})"; break; case Criteria::NOT_IN: $value = is_array($value) ? $value : explode(',', $value); $value = array_slice($value, 0, SphinxCriterion::MAX_IN_VALUES); foreach ($value as $val) { $whereClause[] = "{$sphinxField} != {$val}"; } break; case Criteria::ISNULL: $whereClause[] = "{$sphinxField} = 0"; break; case Criteria::LESS_THAN: case Criteria::LESS_EQUAL: if ($value > 0) { $whereClause[] = "{$sphinxField} != 0"; } default: $whereClause[] = "{$sphinxField} {$comparison} {$value}"; break; } return true; }
protected function applyFilterFields(baseObjectFilter $filter) { $categories = $filter->get("_matchor_likex_full_name"); if ($categories !== null) { $categories = explode(',', $categories); $parsedCategories = array(); foreach ($categories as $category) { if (trim($category) == '') { continue; } $parsedCategories[] = $category . '\\*'; } $fullNameMatchOr = ''; if (count($parsedCategories)) { $fullNameMatchOr = implode(',', $parsedCategories); } if ($fullNameMatchOr != '') { $filter->set("_matchor_full_name", $fullNameMatchOr); } } $filter->unsetByName('_matchor_likex_full_name'); if ($filter->get('_free_text')) { $freeTexts = $filter->get('_free_text'); KalturaLog::debug("Attach free text [{$freeTexts}]"); $additionalConditions = array(); $advancedSearch = $filter->getAdvancedSearch(); if ($advancedSearch) { $additionalConditions = $advancedSearch->getFreeTextConditions($freeTexts); } if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $additionalConditions[] = "@(" . categoryFilter::FREE_TEXT_FIELDS . ") {$freeText}"; } else { if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } foreach ($freeTextsArr as $freeText) { $additionalConditions[] = "@(" . categoryFilter::FREE_TEXT_FIELDS . ") {$freeText}"; } } else { $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $additionalConditions[] = "@(" . categoryFilter::FREE_TEXT_FIELDS . ") {$freeTextExpr}"; } } if (count($additionalConditions)) { $additionalConditions = array_unique($additionalConditions); $matches = reset($additionalConditions); if (count($additionalConditions) > 1) { $matches = '( ' . implode(' ) | ( ', $additionalConditions) . ' )'; } $this->matchClause[] = $matches; } } $filter->unsetByName('_free_text'); if ($filter->get('_eq_privacy_context') && $filter->get('_eq_privacy_context') == '*') { $filter->set('_matchor_privacy_context', kEntitlementUtils::NOT_DEFAULT_CONTEXT); $filter->unsetByName('_eq_privacy_context'); } if ($filter->get('_eq_manager')) { $partnerId = kCurrentContext::$partner_id ? kCurrentContext::$partner_id : kCurrentContext::$ks_partner_id; $puserId = $filter->get('_eq_manager'); $kuser = kuserPeer::getKuserByPartnerAndUid($partnerId, $puserId); if ($kuser) { $manager = category::getPermissionLevelName(CategoryKuserPermissionLevel::MANAGER); $this->matchClause[] = '(@(' . categoryFilter::MEMBERS . ') ' . $manager . '_' . $kuser->getid() . ')'; } } $filter->unsetByName('_eq_manager'); if ($filter->get('_eq_member')) { //memeber but not a menager $partnerId = kCurrentContext::$partner_id ? kCurrentContext::$partner_id : kCurrentContext::$ks_partner_id; $puserId = $filter->get('_eq_member'); $kuser = kuserPeer::getKuserByPartnerAndUid($partnerId, $puserId); if ($kuser) { $manager = category::getPermissionLevelName(CategoryKuserPermissionLevel::MANAGER); $member = category::getPermissionLevelName(CategoryKuserPermissionLevel::MEMBER); $moderator = category::getPermissionLevelName(CategoryKuserPermissionLevel::MODERATOR); $contributor = category::getPermissionLevelName(CategoryKuserPermissionLevel::CONTRIBUTOR); $kuserId = $kuser->getid(); $this->matchClause[] = '(@(' . categoryFilter::MEMBERS . ') ' . "({$member}_{$kuserId} | {$moderator}_{$kuserId} | {$contributor}_{$kuserId} ) !({$manager}_{$kuserId}))"; } } $filter->unsetByName('_eq_member'); if ($filter->get('_eq_full_name')) { $filter->set('_matchor_full_name', $filter->get('_eq_full_name') . category::FULL_NAME_EQUAL_MATCH_STRING); } $filter->unsetByName('_eq_full_name'); if ($filter->get('_in_full_name')) { $fullnames = explode(',', $filter->get('_in_full_name')); $fullnameIn = ''; foreach ($fullnames as $fullname) { $fullnameIn .= $fullname . category::FULL_NAME_EQUAL_MATCH_STRING . ','; } $filter->set('_matchor_full_name', $fullnameIn); $filter->unsetByName('_in_full_name'); } $categories = $filter->get("_in_ancestor_id"); if ($categories !== null) { //if the category exist or the category name is an empty string $categoriesParsed = $filter->categoryIdsToAllSubCategoriesIdsParsed($categories); if ($categoriesParsed !== '' || $categories == '') { $filter->set("_likex_full_ids", $categoriesParsed); } else { $filter->set("_likex_full_ids", category::CATEGORY_ID_THAT_DOES_NOT_EXIST); } } $filter->unsetByName('_in_ancestor_id'); if ($filter->get('_likex_full_ids')) { $fullids = explode(',', $filter->get('_likex_full_ids')); $fullIdsIn = ''; foreach ($fullids as $fullid) { $fullIdsIn .= $fullid . '\\*,'; } $filter->set('_matchor_full_ids', $fullIdsIn); $filter->unsetByName('_likex_full_ids'); } if ($filter->get('_eq_full_ids')) { $filter->set('_matchor_full_ids', $filter->get('_eq_full_ids') . category::FULL_IDS_EQUAL_MATCH_STRING); } $filter->unsetByName('_eq_full_ids'); if ($filter->get('_likex_name_or_reference_id')) { $names = $filter->get('_likex_name_or_reference_id'); KalturaLog::debug("Attach free text [{$names}]"); $additionalConditions = array(); if (preg_match('/^"[^"]+"$/', $names)) { $name = str_replace('"', '', $names); $name = SphinxUtils::escapeString($name); $name = "^{$name}\$"; $additionalConditions[] = "@(" . categoryFilter::NAME_REFERNCE_ID . ") {$name}\\\\*"; } else { if (strpos($names, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $names); $namesArr = explode(baseObjectFilter::IN_SEPARATOR, $names); foreach ($namesArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($namesArr[$valIndex]); } else { $namesArr[$valIndex] = SphinxUtils::escapeString($valValue); } } foreach ($namesArr as $name) { $additionalConditions[] = "@(" . categoryFilter::NAME_REFERNCE_ID . ") {$name}\\\\*"; } } else { $namesArr = explode(baseObjectFilter::AND_SEPARATOR, $names); foreach ($namesArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($namesArr[$valIndex]); } else { $namesArr[$valIndex] = SphinxUtils::escapeString($valValue); } } $namesArr = array_unique($namesArr); $nameExpr = implode(baseObjectFilter::AND_SEPARATOR, $namesArr); $additionalConditions[] = "@(" . categoryFilter::NAME_REFERNCE_ID . ") {$nameExpr}\\\\*"; } } if (count($additionalConditions)) { $additionalConditions = array_unique($additionalConditions); $matches = reset($additionalConditions); if (count($additionalConditions) > 1) { $matches = '( ' . implode(' ) | ( ', $additionalConditions) . ' )'; } $this->matchClause[] = $matches; } } $filter->unsetByName('_likex_name_or_reference_id'); return parent::applyFilterFields($filter); }
protected function applyFilterFields(baseObjectFilter $filter) { $categoriesAncestorParsed = null; $categories = $filter->get("_in_category_ancestor_id"); if ($categories !== null) { //if the category exist or the category name is an empty string $categoriesAncestorParsed = $filter->categoryIdsToAllSubCategoriesIdsParsed($categories); if (!($categoriesAncestorParsed !== '' || $categories == '')) { $categoriesAncestorParsed = category::CATEGORY_ID_THAT_DOES_NOT_EXIST; } } $filter->unsetByName('_in_category_ancestor_id'); $categories = $filter->get("_matchor_categories_ids"); if ($categories !== null) { //if the category exist or the category name is an empty string if (is_null($categoriesAncestorParsed)) { $categoriesParsed = $filter->categoryIdsToIdsParsed($categories); } else { $categoriesParsed = $categoriesAncestorParsed; } if ($categoriesParsed !== '' || $categories == '') { $filter->set("_matchor_categories_ids", $categoriesParsed); } else { $filter->set("_matchor_categories_ids", category::CATEGORY_ID_THAT_DOES_NOT_EXIST); } } else { $filter->set("_matchor_categories_ids", $categoriesAncestorParsed); } $categories = $filter->get("_matchand_categories_ids"); if ($categories !== null) { //if the category exist or the category name is an empty string $categoriesParsed = $filter->categoryIdsToIdsParsed($categories); if ($categoriesParsed !== '' || $categories == '') { $filter->set("_matchand_categories_ids", $categoriesParsed); } else { $filter->set("_matchand_categories_ids", category::CATEGORY_ID_THAT_DOES_NOT_EXIST); } } $matchAndCats = $filter->get("_matchand_categories"); if ($matchAndCats !== null) { //if the category exist or the category name is an empty string $categoriesParsed = $filter->categoryFullNamesToIdsParsed($matchAndCats); if ($categoriesParsed !== '' || $matchAndCats == '') { $filter->set("_matchand_categories_ids", $categoriesParsed); } else { $filter->set("_matchand_categories_ids", category::CATEGORY_ID_THAT_DOES_NOT_EXIST); } $filter->unsetByName('_matchand_categories'); } $matchOrCats = $filter->get("_matchor_categories"); if ($matchOrCats !== null) { //if the category exist or the category name is an empty string $categoriesParsed = $filter->categoryFullNamesToIdsParsed($matchOrCats); if ($categoriesParsed !== '' || $matchOrCats == '') { $filter->set("_matchor_categories_ids", $categoriesParsed); } else { $filter->set("_matchor_categories_ids", category::CATEGORY_ID_THAT_DOES_NOT_EXIST); } $filter->unsetByName('_matchor_categories'); } // match categories by full name $CatFullNameIn = $filter->get("_in_categories_full_name"); if ($CatFullNameIn !== null) { //if the category exist or the category name is an empty string $categoriesParsed = $filter->categoryFullNamesToIdsParsed($CatFullNameIn); if ($categoriesParsed !== '' || $CatFullNameIn == '') { $filter->set("_matchor_categories_ids", $categoriesParsed); } else { $filter->set("_matchor_categories_ids", category::CATEGORY_ID_THAT_DOES_NOT_EXIST); } $filter->unsetByName('_in_categories_full_name'); } $matchOrRoots = array(); if ($filter->is_set('_eq_root_entry_id')) { $matchOrRoots[] = entry::ROOTS_FIELD_ENTRY_PREFIX . ' ' . $filter->get('_eq_root_entry_id'); $filter->unsetByName('_eq_root_entry_id'); } if ($filter->is_set('_in_root_entry_id')) { $roots = explode(baseObjectFilter::IN_SEPARATOR, $filter->get('_in_root_entry_id')); foreach ($roots as $root) { $matchOrRoots[] = entry::ROOTS_FIELD_ENTRY_PREFIX . " {$root}"; } $filter->unsetByName('_in_root_entry_id'); } if ($filter->is_set('_is_root')) { if ($filter->get('_is_root')) { $filter->set('_notin_roots', entry::ROOTS_FIELD_ENTRY_PREFIX); } else { $matchOrRoots[] = entry::ROOTS_FIELD_ENTRY_PREFIX; } $filter->unsetByName('_is_root'); } if (count($matchOrRoots)) { $filter->set('_matchand_roots', $matchOrRoots); } // if ($filter->get("_matchor_duration_type") !== null) // $filter->set("_matchor_duration_type", $filter->durationTypesToIndexedStrings($filter->get("_matchor_duration_type"))); if ($filter->get(baseObjectFilter::ORDER) === "recent" || $filter->get(baseObjectFilter::ORDER) === "-recent") { $filter->set("_lte_available_from", time()); //$filter->set("_gteornull_end_date", time()); // schedule not finished $filter->set(baseObjectFilter::ORDER, "-available_from"); } if ($filter->get(baseObjectFilter::ORDER) === "+recent") { $filter->set(baseObjectFilter::ORDER, "+available_from"); } if ($filter->get('_free_text')) { $freeTexts = $filter->get('_free_text'); KalturaLog::debug("Attach free text [{$freeTexts}]"); $additionalConditions = array(); $advancedSearch = $filter->getAdvancedSearch(); if ($advancedSearch) { $additionalConditions = $advancedSearch->getFreeTextConditions($freeTexts); } if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") {$freeText}"; } else { if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } foreach ($freeTextsArr as $freeText) { $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") {$freeText}"; } } else { $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $additionalConditions[] = "@(" . entryFilter::FREE_TEXT_FIELDS . ") {$freeTextExpr}"; } } if (count($additionalConditions)) { $additionalConditions = array_unique($additionalConditions); $matches = reset($additionalConditions); if (count($additionalConditions) > 1) { $matches = '( ' . implode(' ) | ( ', $additionalConditions) . ' )'; } $this->matchClause[] = $matches; } } $filter->unsetByName('_free_text'); return parent::applyFilterFields($filter); }
public function getFreeTextConditions($partnerScope, $freeTexts) { $additionalConditions = array(); if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!strlen($valValue)) { unset($freeTextsArr[$valIndex]); } } foreach ($freeTextsArr as $freeText) { $freeText = SphinxUtils::escapeString($freeText); $additionalConditions[] = $this->createSphinxMatchPhrase($freeText); } return $additionalConditions; } $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!strlen($valValue)) { unset($freeTextsArr[$valIndex]); } } $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $freeTextExpr = SphinxUtils::escapeString($freeTextExpr); $additionalConditions[] = $this->createSphinxMatchPhrase($freeTextExpr); return $additionalConditions; }
public function getFreeTextConditions($freeTexts) { KalturaLog::debug("freeText [{$freeTexts}]"); $additionalConditions = array(); if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $additionalConditions[] = '@' . MetadataPlugin::getSphinxFieldName(MetadataPlugin::SPHINX_EXPANDER_FIELD_DATA) . ' ' . MetadataPlugin::PLUGIN_NAME . "_text << ( {$freeTexts} ) << " . kMetadataManager::SEARCH_TEXT_SUFFIX . '_text'; return $additionalConditions; } if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } } foreach ($freeTextsArr as $freeText) { $freeText = SphinxUtils::escapeString($freeText); $additionalConditions[] = '@' . MetadataPlugin::getSphinxFieldName(MetadataPlugin::SPHINX_EXPANDER_FIELD_DATA) . ' ' . MetadataPlugin::PLUGIN_NAME . "_text << ( {$freeText} ) << " . kMetadataManager::SEARCH_TEXT_SUFFIX . '_text'; } return $additionalConditions; } $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } } $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $freeTextExpr = SphinxUtils::escapeString($freeTextExpr); $additionalConditions[] = '@' . MetadataPlugin::getSphinxFieldName(MetadataPlugin::SPHINX_EXPANDER_FIELD_DATA) . ' ' . MetadataPlugin::PLUGIN_NAME . "_text << ( {$freeTextExpr} ) << " . kMetadataManager::SEARCH_TEXT_SUFFIX . '_text'; return $additionalConditions; }
/** * Applies all filter fields and unset the handled fields * * @param baseObjectFilter $filter */ protected function applyFilterFields(baseObjectFilter $filter) { foreach ($filter->fields as $field => $val) { if (is_null($val) || !strlen($val)) { // KalturaLog::debug("Skip field[$field] value is null"); continue; } $fieldParts = explode(baseObjectFilter::FILTER_PREFIX, $field, 3); if (count($fieldParts) != 3) { KalturaLog::debug("Skip field[{$field}] has [" . count($fieldParts) . "] parts"); continue; } list($prefix, $operator, $fieldName) = $fieldParts; $fieldNamesArr = explode(baseObjectFilter::OR_SEPARATOR, $fieldName); if (count($fieldNamesArr) > 1) { $sphinxFieldNames = array(); foreach ($fieldNamesArr as $fieldName) { $sphinxField = $this->getSphinxFieldName($fieldName); $type = $this->getSphinxFieldType($sphinxField); $sphinxFieldNames[] = $sphinxField; } $sphinxField = '(' . implode(',', $sphinxFieldNames) . ')'; $vals = is_array($val) ? $val : array_unique(explode(baseObjectFilter::OR_SEPARATOR, $val)); $val = implode(' ', $vals); } elseif (!$this->hasMatchableField($fieldName)) { KalturaLog::debug("Skip field[{$field}] has no matchable for name[{$fieldName}]"); continue; } else { $sphinxField = $this->getSphinxFieldName($fieldName); $type = $this->getSphinxFieldType($sphinxField); } $valStr = print_r($val, true); KalturaLog::debug("Attach field[{$fieldName}] as sphinx field[{$sphinxField}] of type [{$type}] and comparison[{$operator}] for value[{$valStr}]"); switch ($operator) { case baseObjectFilter::MULTI_LIKE_OR: case baseObjectFilter::MATCH_OR: $vals = is_array($val) ? $val : explode(',', $val); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue); } } if (count($vals)) { $val = implode(' | ', $vals); $this->matchClause[] = "@{$sphinxField} {$val}"; $filter->unsetByName($field); } break; case baseObjectFilter::NOT_IN: $vals = is_array($val) ? $val : explode(',', $val); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue); } } if (count($vals)) { $vals = array_slice($vals, 0, self::MAX_IN_VALUES); $val = '!' . implode(' & !', $vals); $this->matchClause[] = "@{$sphinxField} {$val}"; $filter->unsetByName($field); } break; case baseObjectFilter::IN: $vals = is_array($val) ? $val : explode(',', $val); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue); } } if (count($vals)) { $vals = array_slice($vals, 0, self::MAX_IN_VALUES); $val = '(^' . implode('$ | ^', $vals) . '$)'; $this->matchClause[] = "@{$sphinxField} {$val}"; $filter->unsetByName($field); } break; case baseObjectFilter::EQ: if (is_numeric($val) || strlen($val) > 1) { $val = SphinxUtils::escapeString($val); $this->matchClause[] = "@{$sphinxField} ^{$val}\$"; $filter->unsetByName($field); } break; case baseObjectFilter::MULTI_LIKE_AND: case baseObjectFilter::MATCH_AND: case baseObjectFilter::LIKE: $vals = is_array($val) ? $val : explode(' ', $val); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue); } } if (count($vals)) { $val = implode(' & ', $vals); $this->matchClause[] = "@{$sphinxField} {$val}"; $filter->unsetByName($field); } break; default: KalturaLog::debug("Skip field[{$field}] has no opertaor[{$operator}]"); } } }
private function formatCondition($conditionString, $explodeDelimiter, $implodeDelimiter) { if (!strlen($conditionString)) { return null; } $res = null; if ($explodeDelimiter) { $vals = explode($explodeDelimiter, $conditionString); foreach ($vals as $valIndex => $valValue) { if (!$valValue) { unset($vals[$valIndex]); } elseif (preg_match('/[\\s\\t]/', $valValue)) { $vals[$valIndex] = '"' . SphinxUtils::escapeString($valValue) . '"'; } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue); } } if (count($vals)) { $res = implode($implodeDelimiter, $vals); } } else { if (preg_match('/[\\s\\t]/', $conditionString)) { $res = '"' . SphinxUtils::escapeString($conditionString) . '"'; } else { $res = SphinxUtils::escapeString($conditionString); } } return $res; }
protected function applyFilterFields(baseObjectFilter $filter) { //Role ids and kuser permission names are indexed with the partner ID $partnerId = kCurrentContext::$partner_id ? kCurrentContext::$partner_id : kCurrentContext::$ks_partner_id; if ($filter->get('_eq_role_ids')) { $filter->set('_eq_role_ids', kuser::getIndexedFieldValue('kuserPeer::ROLE_IDS', $filter->get('_eq_role_ids'), $partnerId)); } if ($filter->get('_in_role_ids')) { $filter->set('_eq_role_ids', kuser::getIndexedFieldValue('kuserPeer::ROLE_IDS', $filter->get('_eq_role_ids'), $partnerId)); } if ($filter->get('_mlikeand_permission_names')) { $permissionNames = kuser::getIndexedFieldValue('kuserPeer::PERMISSION_NAMES', $filter->get('_mlikeand_permission_names'), $partnerId); $permissionNames = implode(' ', explode(',', $permissionNames)); $universalPermissionName = kuser::getIndexedFieldValue('kuserPeer::PERMISSION_NAMES', kuser::UNIVERSAL_PERMISSION, $partnerId); $value = "({$universalPermissionName} | ({$permissionNames}))"; $this->addMatch("@permission_names {$value}"); $filter->unsetByName('_mlikeand_permission_names'); } if ($filter->get('_mlikeor_permission_names')) { $filter->set('_mlikeor_permission_names', kuser::getIndexedFieldValue('kuserPeer::PERMISSION_NAMES', $filter->get('_mlikeor_permission_names') . ',' . kuser::UNIVERSAL_PERMISSION, $partnerId)); } if ($filter->get('_likex_puser_id_or_screen_name')) { $freeTexts = $filter->get('_likex_puser_id_or_screen_name'); KalturaLog::debug("Attach free text [{$freeTexts}]"); $additionalConditions = array(); $advancedSearch = $filter->getAdvancedSearch(); if ($advancedSearch) { $additionalConditions = $advancedSearch->getFreeTextConditions($freeTexts); } if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $additionalConditions[] = "@(" . kuserFilter::PUSER_ID_OR_SCREEN_NAME . ") {$freeText}\\\\*"; } else { if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } foreach ($freeTextsArr as $freeText) { $additionalConditions[] = "@(" . kuserFilter::PUSER_ID_OR_SCREEN_NAME . ") {$freeText}\\\\*"; } } else { $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $additionalConditions[] = "@(" . kuserFilter::PUSER_ID_OR_SCREEN_NAME . ") {$freeTextExpr}\\\\*"; } } if (count($additionalConditions)) { $additionalConditions = array_unique($additionalConditions); $matches = reset($additionalConditions); if (count($additionalConditions) > 1) { $matches = '( ' . implode(' ) | ( ', $additionalConditions) . ' )'; } $this->matchClause[] = $matches; } } $filter->unsetByName('_likex_puser_id_or_screen_name'); if ($filter->get('_likex_first_name_or_last_name')) { $names = $filter->get('_likex_first_name_or_last_name'); KalturaLog::debug("Attach free text [{$names}]"); $additionalConditions = array(); if (preg_match('/^"[^"]+"$/', $names)) { $name = str_replace('"', '', $names); $name = SphinxUtils::escapeString($name); $name = "^{$name}\$"; $additionalConditions[] = "@(" . kuserFilter::FIRST_NAME_OR_LAST_NAME . ") {$name}\\\\*"; } else { if (strpos($names, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $names); $namesArr = explode(baseObjectFilter::IN_SEPARATOR, $names); foreach ($namesArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($namesArr[$valIndex]); } else { $namesArr[$valIndex] = SphinxUtils::escapeString($valValue); } } foreach ($namesArr as $name) { $additionalConditions[] = "@(" . kuserFilter::FIRST_NAME_OR_LAST_NAME . ") {$name}\\\\*"; } } else { $namesArr = explode(baseObjectFilter::AND_SEPARATOR, $names); foreach ($namesArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($namesArr[$valIndex]); } else { $namesArr[$valIndex] = SphinxUtils::escapeString($valValue); } } $namesArr = array_unique($namesArr); $nameExpr = implode(baseObjectFilter::AND_SEPARATOR, $namesArr); $additionalConditions[] = "@(" . kuserFilter::FIRST_NAME_OR_LAST_NAME . ") {$nameExpr}\\\\*"; } } if (count($additionalConditions)) { $additionalConditions = array_unique($additionalConditions); $matches = reset($additionalConditions); if (count($additionalConditions) > 1) { $matches = '( ' . implode(' ) | ( ', $additionalConditions) . ' )'; } $this->matchClause[] = $matches; } } $filter->unsetByName('_likex_first_name_or_last_name'); return parent::applyFilterFields($filter); }
public function addFreeTextToMatchClauseByMatchFields($freeTexts, $matchFields, $additionalConditions = null, $isLikeExpr = false) { if (!$additionalConditions) { $additionalConditions = array(); } if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $condition = "@(" . $matchFields . ") {$freeText}"; if ($isLikeExpr) { $condition .= " | {$freeText}\\\\*"; } $additionalConditions[] = $condition; } else { $useInSeperator = true; if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); } else { $useInSeperator = false; $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); } foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } else { $freeTextsArr[$valIndex] = SphinxUtils::escapeString($valValue); } } if ($useInSeperator) { foreach ($freeTextsArr as $freeText) { $condition = "@(" . $matchFields . ") {$freeText}"; if ($isLikeExpr) { $condition .= " | {$freeText}\\\\*"; } $additionalConditions[] = $condition; } } else { $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $condition = "@(" . $matchFields . ") {$freeTextExpr}"; if ($isLikeExpr) { $condition .= " | {$freeTextExpr}\\\\*"; } $additionalConditions[] = $condition; } } if (count($additionalConditions)) { $additionalConditions = array_unique($additionalConditions); $matches = reset($additionalConditions); if (count($additionalConditions) > 1) { $matches = '( ' . implode(' ) | ( ', $additionalConditions) . ' )'; } $this->matchClause[] = $matches; } }
public function getFreeTextConditions($partnerScope, $freeTexts) { $metadataProfileFieldIds = array(); $metadataProfileId = $this->getMetadataProfileId(); if ($metadataProfileId) { $metadataProfileFields = MetadataProfileFieldPeer::retrieveActiveByMetadataProfileId($metadataProfileId); foreach ($metadataProfileFields as $metadataProfileField) { $metadataProfileFieldIds[] = $metadataProfileField->getId(); } } KalturaLog::debug("freeText [{$freeTexts}]"); $additionalConditions = array(); if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $additionalConditions[] = $this->createSphinxSearchPhrase($partnerScope, $freeTexts); return $additionalConditions; } if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } } foreach ($freeTextsArr as $freeText) { $freeText = SphinxUtils::escapeString($freeText); $additionalConditions[] = $this->createSphinxSearchPhrase($partnerScope, $freeText); foreach ($metadataProfileFieldIds as $metadataProfileFieldId) { $additionalConditions[] = $this->createSphinxSearchPhrase($partnerScope, $freeText, $metadataProfileFieldId); } } return $additionalConditions; } $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } } $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $freeTextExpr = SphinxUtils::escapeString($freeTextExpr); $additionalConditions[] = $this->createSphinxSearchPhrase($partnerScope, $freeTextExpr); foreach ($metadataProfileFieldIds as $metadataProfileFieldId) { $additionalConditions[] = $this->createSphinxSearchPhrase($partnerScope, $freeTextExpr, $metadataProfileFieldId); } return $additionalConditions; }
public function getFreeTextConditions($partnerScope, $freeTexts) { $additionalConditions = array(); if ($this->getCuePointsFreeText()) { return; } if (preg_match('/^"[^"]+"$/', $freeTexts)) { $freeText = str_replace('"', '', $freeTexts); $freeText = SphinxUtils::escapeString($freeText); $freeText = "^{$freeText}\$"; $additionalConditions[] = $this->createSphinxMatchPhrase($freeText); return $additionalConditions; } if (strpos($freeTexts, baseObjectFilter::IN_SEPARATOR) > 0) { str_replace(baseObjectFilter::AND_SEPARATOR, baseObjectFilter::IN_SEPARATOR, $freeTexts); $freeTextsArr = explode(baseObjectFilter::IN_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } } foreach ($freeTextsArr as $freeText) { $freeText = SphinxUtils::escapeString($freeText); $additionalConditions[] = $this->createSphinxMatchPhrase($freeText); } return $additionalConditions; } $freeTextsArr = explode(baseObjectFilter::AND_SEPARATOR, $freeTexts); foreach ($freeTextsArr as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 0) { unset($freeTextsArr[$valIndex]); } } $freeTextsArr = array_unique($freeTextsArr); $freeTextExpr = implode(baseObjectFilter::AND_SEPARATOR, $freeTextsArr); $freeTextExpr = SphinxUtils::escapeString($freeTextExpr); $additionalConditions[] = $this->createSphinxMatchPhrase($freeTextExpr); return $additionalConditions; }
protected function getStringMatchClause($sphinxField, $comparison, $value) { $fieldsEscapeType = $this->criteria->getSearchIndexFieldsEscapeType($sphinxField); switch ($comparison) { case Criteria::EQUAL: $value = SphinxUtils::escapeString($value, $fieldsEscapeType); return "@{$sphinxField} ^{$value}\$"; case Criteria::NOT_IN: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = $this->criteria->getPositiveMatch($sphinxField) . ' !' . implode(' !', $vals); return "@{$sphinxField} {$val}"; } break; case Criteria::IN: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '((^' . implode('$) | (^', $vals) . '$))'; return "@{$sphinxField} {$val}"; } break; case KalturaCriteria::IN_LIKE: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '(("' . implode('") | ("', $vals) . '"))'; return "@{$sphinxField} {$val}"; } break; case KalturaCriteria::IN_LIKE_ORDER: $vals = is_array($value) ? $value : explode(',', $value); foreach ($vals as $valIndex => $valValue) { if (!is_numeric($valValue) && strlen($valValue) <= 1) { unset($vals[$valIndex]); } else { $valValue = explode(',', $valValue); $valValue = implode(' << ', $valValue); $vals[$valIndex] = SphinxUtils::escapeString($valValue, $fieldsEscapeType); } } if (count($vals)) { $vals = array_slice($vals, 0, SphinxCriterion::MAX_IN_VALUES); $val = '((' . implode(') | (', $vals) . '))'; return "@{$sphinxField} {$val}"; } break; default: $value = SphinxUtils::escapeString($value, $fieldsEscapeType); return "@{$sphinxField} {$value}"; } return null; }
public function applyCondition(IKalturaDbQuery $query, $xPaths = null) { if (!$query instanceof IKalturaIndexQuery) { return; } $this->parentQuery = $query; if ($this->parentQuery instanceof MetadataSearchFilter || $this->parentQuery instanceof DynamicObjectSearchFilter) { $this->metadataProfileId = $this->parentQuery->getMetadataProfileId(); } if (!$this->metadataProfileId) { KalturaLog::err('Metadata profile id was not found on parent query, or parent query is not instance of MetadataSearchFilter/DynamicObjectSearchFilter'); return; } $field = $this->getField(); if (!isset($xPaths[$field])) { $this->addCondition('1 <> 1'); KalturaLog::ERR("Missing field: {$field} in xpath array: " . print_r($xPaths, true)); return; } /** @var MetadataProfileField $metadataProfileField */ $metadataProfileField = $xPaths[$field]; if ($metadataProfileField->getType() !== MetadataSearchFilter::KMC_FIELD_TYPE_METADATA_OBJECT) { KalturaLog::ERR("Field {$field} is not set as a dynamic object type"); return; } $pluginName = MetadataPlugin::PLUGIN_NAME; $fieldId = $metadataProfileField->getId(); $relatedMetadataProfileId = $metadataProfileField->getRelatedMetadataProfileId(); $innerXPaths = $this->loadFields($relatedMetadataProfileId); $prefix = "{$pluginName}_{$fieldId}"; $suffix = kMetadataManager::SEARCH_TEXT_SUFFIX . "_{$fieldId}"; $dataConditions = array(); foreach ($this->items as $item) { if ($item instanceof DynamicObjectSearchFilter) { $item->applyCondition($this, $innerXPaths); $dataConditions = $item->matchClause; } elseif ($item instanceof AdvancedSearchFilterCondition) { $innerField = $item->getField(); if (!isset($innerXPaths[$innerField])) { $this->addCondition('1 <> 1'); KalturaLog::ERR("Missing field: {$innerField} in inner xpath array: " . print_r($innerXPaths, true)); continue; } $innerValue = SphinxUtils::escapeString($item->getValue()); $innerFieldType = $innerXPaths[$innerField]->getType(); $innerFieldId = $innerXPaths[$innerField]->getId(); $innerPrefix = $pluginName . '_' . $innerFieldId; $innerSuffix = kMetadataManager::SEARCH_TEXT_SUFFIX . '_' . $innerFieldId; $dataCondition = "\"{$innerPrefix} {$innerValue} {$innerSuffix}\""; KalturaLog::debug("Inner condition: {$dataCondition}"); $dataConditions[] = $dataCondition; } } if (count($dataConditions)) { foreach ($dataConditions as &$dataCondition) { $dataCondition = "( {$prefix} ( {$dataCondition} ) {$suffix} )"; KalturaLog::debug("Wrapped condition: {$dataCondition}"); } $glue = $this->type == MetadataSearchFilter::SEARCH_AND ? ' ' : ' | '; $dataConditions = array_unique($dataConditions); $value = implode($glue, $dataConditions); KalturaLog::debug("Current {$value}"); $this->addMatch($value); } }