open-orchestra/open-orchestra-model-bundle

View on GitHub
ModelBundle/Repository/RepositoryTrait/KeywordableTrait.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace OpenOrchestra\ModelBundle\Repository\RepositoryTrait;

use OpenOrchestra\ModelInterface\Repository\RepositoryTrait\KeywordableTraitInterface;

/**
 * Trait KeywordableTrait
 */
trait KeywordableTrait
{
    /**
     * @param string $condition
     * @param int    $count
     * @param array  $aliases
     * @param string $delimiter
     *
     * @return array|null
     */
    public function transformConditionToMongoCondition($condition, $count = 0, array $aliases = array(), $delimiter = '##')
    {
        if (!is_null($condition)) {
            $encapsuledElements = array();
            preg_match_all(KeywordableTraitInterface::GET_BALANCED_BRACKETS, $condition, $encapsuledElements);
            foreach ($encapsuledElements[0] as $key => $encapsuledElement) {
                $alias = $delimiter.$count.$delimiter;
                $condition = preg_replace('/'.preg_quote($encapsuledElement).'/', $alias, $condition, 1);
                $aliases[$alias] = $this->transformSubConditionToMongoCondition($encapsuledElements[1][$key], $aliases);
                $count++;
            }
            if (count($encapsuledElements[0]) > 0) {
                $result = $this->transformConditionToMongoCondition($condition, $count, $aliases, $delimiter);
            } else {
                $result = $this->transformSubConditionToMongoCondition($condition, $aliases);
            }
        } else {
            $result = null;
        }

        return $result;
    }

    /**
     * @param string $condition
     * @param array  $aliases
     *
     * @return array|null
     */
    public function transformSubConditionToMongoCondition($condition, array &$aliases)
    {
        $elements = array();
        $subElements = array();
        $operator = '$and';
        if (preg_match_all(KeywordableTraitInterface::IS_AND_BOOLEAN, $condition, $elements)) {
            preg_match_all(KeywordableTraitInterface::GET_AND_SUB_BOOLEAN, $condition, $subElements);
        } elseif  (preg_match_all(KeywordableTraitInterface::IS_OR_BOOLEAN, $condition, $elements)) {
            $operator = '$or';
            preg_match_all(KeywordableTraitInterface::GET_OR_SUB_BOOLEAN, $condition, $subElements);
        }
        if (count($elements) > 0) {
            foreach ($elements as $key => $element) {
                $elements[$key] = array_merge($element, $subElements[$key]);
            }
            $result = array();
            foreach ($elements[2] as $key => $element) {
                if (array_key_exists($element, $aliases)) {
                    if ($elements[1][$key] != '') {
                        array_push($result, array('$not' => $aliases[$element]));
                    } else {
                        array_push($result, $aliases[$element]);
                    }
                    unset($aliases[$element]);
                } else {
                    $comparison = ($elements[1][$key] == '') ? '$eq' : '$ne';
                    array_push($result, array('keywords.$id' => array($comparison => new \MongoId($element))));
                }
            }

            return (array($operator => $result));
        }

        return null;
    }
}