/** * Generate query expression for a Criterion this handler accepts * * accept() must be called before calling this method. * * @param \eZ\Publish\Core\Search\Legacy\Content\Common\Gateway\CriteriaConverter $converter * @param \eZ\Publish\Core\Persistence\Database\SelectQuery $query * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion * @param array $fieldFilters * * @return \eZ\Publish\Core\Persistence\Database\Expression */ public function handle(CriteriaConverter $converter, SelectQuery $query, Criterion $criterion, array $fieldFilters) { $languages = array_flip($criterion->value); /** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LanguageCode */ $languages['always-available'] = $criterion->matchAlwaysAvailable; return $query->expr->gt($query->expr->bitAnd($this->dbHandler->quoteColumn('language_mask', 'ezcontentobject'), $this->maskGenerator->generateLanguageMask($languages)), 0); }
/** * Extracts a Tag object from $row. * * @param array $rows * * @return \Netgen\TagsBundle\SPI\Persistence\Tags\Tag[] */ public function extractTagListFromRows(array $rows) { $tagList = array(); foreach ($rows as $row) { $tagId = (int) $row['eztags_id']; if (!isset($tagList[$tagId])) { $tag = new Tag(); $tag->id = (int) $row['eztags_id']; $tag->parentTagId = (int) $row['eztags_parent_id']; $tag->mainTagId = (int) $row['eztags_main_tag_id']; $tag->keywords = array(); $tag->depth = (int) $row['eztags_depth']; $tag->pathString = $row['eztags_path_string']; $tag->modificationDate = (int) $row['eztags_modified']; $tag->remoteId = $row['eztags_remote_id']; $tag->alwaysAvailable = (int) $row['eztags_language_mask'] & 1 ? true : false; $tag->mainLanguageCode = $this->languageHandler->load($row['eztags_main_language_id'])->languageCode; $tag->languageIds = $this->languageMaskGenerator->extractLanguageIdsFromMask((int) $row['eztags_language_mask']); $tagList[$tagId] = $tag; } if (!isset($tagList[$tagId]->keywords[$row['eztags_keyword_locale']])) { $tagList[$tagId]->keywords[$row['eztags_keyword_locale']] = $row['eztags_keyword_keyword']; } } return array_values($tagList); }
/** * Generates language mask from provided language codes * Also sets always available bit * * @param array $languageCodes * * @return int */ protected function generateLanguageMask(array $languageCodes) { $maskLanguageCodes = array(); foreach ($languageCodes as $languageCode) { $maskLanguageCodes[$languageCode] = 1; } $maskLanguageCodes['always-available'] = 1; return $this->maskGenerator->generateLanguageMask($maskLanguageCodes); }
/** * Generates a language mask for provided keywords. * * @param string[] $keywords * @param bool $alwaysAvailable * * @return int */ protected function generateLanguageMask(array $keywords, $alwaysAvailable = true) { $languages = array(); foreach ($keywords as $languageCode => $keyword) { $languages[$languageCode] = true; } if ($alwaysAvailable) { $languages['always-available'] = true; } return $this->languageMaskGenerator->generateLanguageMask($languages); }
/** * Loads paged list of global aliases. * * @param string|null $languageCode * @param int $offset * @param int $limit * * @return array */ public function listGlobalEntries($languageCode = null, $offset = 0, $limit = -1) { $limit = $limit === -1 ? self::MAX_LIMIT : $limit; /** @var $query \eZ\Publish\Core\Persistence\Database\SelectQuery */ $query = $this->dbHandler->createSelectQuery(); $query->select($this->dbHandler->quoteColumn("action"), $this->dbHandler->quoteColumn("id"), $this->dbHandler->quoteColumn("link"), $this->dbHandler->quoteColumn("is_alias"), $this->dbHandler->quoteColumn("alias_redirects"), $this->dbHandler->quoteColumn("lang_mask"), $this->dbHandler->quoteColumn("is_original"), $this->dbHandler->quoteColumn("parent"), $this->dbHandler->quoteColumn("text_md5"))->from($this->dbHandler->quoteTable("ezurlalias_ml"))->where($query->expr->lAnd($query->expr->eq($this->dbHandler->quoteColumn("action_type"), $query->bindValue("module", null, \PDO::PARAM_STR)), $query->expr->eq($this->dbHandler->quoteColumn("is_original"), $query->bindValue(1, null, \PDO::PARAM_INT)), $query->expr->eq($this->dbHandler->quoteColumn("is_alias"), $query->bindValue(1, null, \PDO::PARAM_INT))))->limit($limit, $offset); if (isset($languageCode)) { $query->where($query->expr->gt($query->expr->bitAnd($this->dbHandler->quoteColumn("lang_mask"), $query->bindValue($this->languageMaskGenerator->generateLanguageIndicator($languageCode, false), null, \PDO::PARAM_INT)), 0)); } $statement = $query->prepare(); $statement->execute(); return $statement->fetchAll(\PDO::FETCH_ASSOC); }
/** * @param array $pathElementData * @param array $row */ protected function normalizePathDataRow(array &$pathElementData, array $row) { $languageCodes = $this->languageMaskGenerator->extractLanguageCodesFromMask($row['lang_mask']); $pathElementData['always-available'] = $this->languageMaskGenerator->isAlwaysAvailable($row['lang_mask']); if (!empty($languageCodes)) { foreach ($languageCodes as $languageCode) { $pathElementData['translations'][$languageCode] = $row['text']; } } elseif ($pathElementData['always-available']) { // NOP entry, lang_mask == 1 $pathElementData['translations']['always-available'] = $row['text']; } }
/** * Loads the actual content based on the provided IDs * * @param array $contentIds * @param mixed $translations * * @return mixed[] */ protected function loadContent(array $contentIds, $translations) { $loadQuery = $this->queryBuilder->createFindQuery($translations); $loadQuery->where($loadQuery->expr->eq('ezcontentobject_version.status', VersionInfo::STATUS_PUBLISHED), $loadQuery->expr->in($this->handler->quoteColumn('id', 'ezcontentobject'), $contentIds)); $statement = $loadQuery->prepare(); $statement->execute(); $rows = $statement->fetchAll(\PDO::FETCH_ASSOC); // Sort array, as defined in the $contentIds array $contentIdOrder = array_flip($contentIds); usort($rows, function ($current, $next) use($contentIdOrder) { return $contentIdOrder[$current['ezcontentobject_id']] - $contentIdOrder[$next['ezcontentobject_id']]; }); foreach ($rows as &$row) { $row['ezcontentobject_always_available'] = $this->languageMaskGenerator->isAlwaysAvailable($row['ezcontentobject_language_mask']); $row['ezcontentobject_main_language_code'] = $this->languageHandler->load($row['ezcontentobject_initial_language_id'])->languageCode; $row['ezcontentobject_version_languages'] = $this->languageMaskGenerator->extractLanguageIdsFromMask($row['ezcontentobject_version_language_mask']); $row['ezcontentobject_version_initial_language_code'] = $this->languageHandler->load($row['ezcontentobject_version_initial_language_id'])->languageCode; } return $rows; }
/** * Set common columns for insert/update of a Type. * * @param \eZ\Publish\Core\Persistence\Database\InsertQuery|\eZ\Publish\Core\Persistence\Database\UpdateQuery $q * @param \eZ\Publish\SPI\Persistence\ValueObject|\eZ\Publish\SPI\Persistence\Content\Type|\eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct $type * * @return void */ protected function setCommonTypeColumns(Query $q, ValueObject $type) { $q->set($this->dbHandler->quoteColumn('serialized_name_list'), $q->bindValue(serialize($type->name)))->set($this->dbHandler->quoteColumn('serialized_description_list'), $q->bindValue(serialize($type->description)))->set($this->dbHandler->quoteColumn('identifier'), $q->bindValue($type->identifier))->set($this->dbHandler->quoteColumn('modified'), $q->bindValue($type->modified, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('modifier_id'), $q->bindValue($type->modifierId, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('remote_id'), $q->bindValue($type->remoteId))->set($this->dbHandler->quoteColumn('url_alias_name'), $q->bindValue($type->urlAliasSchema))->set($this->dbHandler->quoteColumn('contentobject_name'), $q->bindValue($type->nameSchema))->set($this->dbHandler->quoteColumn('is_container'), $q->bindValue($type->isContainer ? 1 : 0, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('language_mask'), $q->bindValue($this->languageMaskGenerator->generateLanguageMask($type->name), null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('initial_language_id'), $q->bindValue($type->initialLanguageId, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('sort_field'), $q->bindValue($type->sortField, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('sort_order'), $q->bindValue($type->sortOrder, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('always_available'), $q->bindValue((int) $type->defaultAlwaysAvailable, null, \PDO::PARAM_INT)); }
/** * Sets field (ezcontentobject_attribute) values to the given query. * * @param \eZ\Publish\Core\Persistence\Database\InsertQuery $q * @param Content $content * @param Field $field * @param StorageFieldValue $value */ protected function setInsertFieldValues(InsertQuery $q, Content $content, Field $field, StorageFieldValue $value) { $q->insertInto($this->dbHandler->quoteTable('ezcontentobject_attribute'))->set($this->dbHandler->quoteColumn('contentobject_id'), $q->bindValue($content->versionInfo->contentInfo->id, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('contentclassattribute_id'), $q->bindValue($field->fieldDefinitionId, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('data_type_string'), $q->bindValue($field->type))->set($this->dbHandler->quoteColumn('language_code'), $q->bindValue($field->languageCode))->set($this->dbHandler->quoteColumn('version'), $q->bindValue($field->versionNo, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('data_float'), $q->bindValue($value->dataFloat))->set($this->dbHandler->quoteColumn('data_int'), $q->bindValue($value->dataInt, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('data_text'), $q->bindValue($value->dataText))->set($this->dbHandler->quoteColumn('sort_key_int'), $q->bindValue($value->sortKeyInt, null, \PDO::PARAM_INT))->set($this->dbHandler->quoteColumn('sort_key_string'), $q->bindValue(mb_substr($value->sortKeyString, 0, 255)))->set($this->dbHandler->quoteColumn('language_id'), $q->bindValue($this->languageMaskGenerator->generateLanguageIndicator($field->languageCode, $this->isLanguageAlwaysAvailable($content, $field->languageCode)), null, \PDO::PARAM_INT)); }
/** * Generate query expression for a Criterion this handler accepts * * accept() must be called before calling this method. * * @param \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriteriaConverter $converter * @param \ezcQuerySelect $query * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion * * @return \ezcQueryExpression */ public function handle(CriteriaConverter $converter, ezcQuerySelect $query, Criterion $criterion) { $languages = array_flip($criterion->value); $languages['always-available'] = 0; return $query->expr->gt($query->expr->bitAnd($this->dbHandler->quoteColumn('language_mask', 'ezcontentobject'), $this->maskGenerator->generateLanguageMask($languages)), 0); }