marcojetson/freckle

View on GitHub
lib/Operator/Operator.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Freckle\Operator;

use Freckle\Query;

abstract class Operator
{
    /** @var array */
    protected static $operatorMap = [
        'eq' => Equals::class,
        'equals' => Equals::class,
        '=' => Equals::class,
        'not' => Not::class,
        '!=' => Not::class,
        'gt' => GreaterThan::class,
        'greaterThan' => GreaterThan::class,
        '>' => GreaterThan::class,
        'gte' => GreaterThanOrEquals::class,
        'greaterThanOrEquals' => GreaterThanOrEquals::class,
        '>=' => GreaterThanOrEquals::class,
        'lt' => LessThan::class,
        'lessThan' => LessThan::class,
        '<' => LessThan::class,
        'lte' => LessThanOrEquals::class,
        'lessThanOrEquals' => LessThanOrEquals::class,
        '<=' => LessThanOrEquals::class,
        'like' => Like::class,
    ];

    /** @var   */
    protected static $operators;

    /**
     * @param string $name
     * @return Operator
     */
    public static function get($name)
    {
        if (!isset(static::$operatorMap[$name])) {
            return null;
        }

        $operatorClass = static::$operatorMap[$name];
        if (!isset(static::$operators[$operatorClass])) {
            static::$operators[$operatorClass] = new $operatorClass();
        }

        return static::$operators[$operatorClass];
    }

    /**
     * @param string $name
     * @param string $operatorClass
     */
    public static function add($name, $operatorClass)
    {
        if (!is_subclass_of($operatorClass, self::class)) {
            throw new \InvalidArgumentException('$operatorClass must be a subclass off ' . self::class);
        }
        
        static::$operatorMap[$name] = $operatorClass;
    }

    /**
     * @param Query $query
     * @param string $column
     * @param string $value
     * @return string
     */
    abstract public function __invoke(Query $query, $column, $value = null);
}