/**
  * 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);
 }
示例#2
0
 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;
 }
示例#3
0
 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})";
 }
示例#5
0
 /**
  * @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}]");
         }
     }
 }
示例#7
0
 /**
  * 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);
 }
示例#8
0
 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;
 }
示例#13
0
 /**
  * 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);
 }
示例#16
0
 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;
     }
 }
示例#17
0
 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);
     }
 }