<?phpnamespace Jackalope\Query\QOM;use InvalidArgumentException;use PHPCR\Query\QOM\QueryObjectModelInterface;use PHPCR\Query\QOM\SourceInterface;use PHPCR\Query\QOM\ConstraintInterface;use PHPCR\Query\QOM\OrderingInterface;use PHPCR\Query\QOM\ColumnInterface;use PHPCR\Util\QOM\Sql2Generator;use PHPCR\Util\QOM\QomToSql2QueryConverter;use Jackalope\ObjectManager;use Jackalope\Query\SqlQuery;use Jackalope\FactoryInterface;use Jackalope\NotImplementedException;use PHPCR\Util\ValueConverter;/** * {@inheritDoc} * * We extend SqlQuery to have features like limit and offset. * * @license http://www.apache.org/licenses Apache License Version 2.0, January 2004 * @license http://opensource.org/licenses/MIT MIT License * * @api */class QueryObjectModel extends SqlQuery implements QueryObjectModelInterface{    /**     * @var SourceInterface     */    protected $source;    /**     * @var ConstraintInterface     */    protected $constraint;    /**     * @var array     */    protected $orderings;    /**     * @var array     */    protected $columns;    /**     * Constructor     *     * @param FactoryInterface $factory the object factory     * @param ObjectManager $objectManager (can be omitted if you do not want     *      to execute the query but just use it with a parser)     * @param SourceInterface $source     * @param ConstraintInterface $constraint     * @param array $orderings     * @param array $columns     *     * @throws InvalidArgumentException     */    public function __construct(        FactoryInterface $factory,        ObjectManager $objectManager = null,        SourceInterface $source,        ConstraintInterface $constraint = null,        array $orderings,        array $columns    ) {        foreach ($orderings as $o) {            if (! $o instanceof OrderingInterface) {                throw new InvalidArgumentException("Not a valid ordering: $o");            }        }        foreach ($columns as $c) {            if (! $c instanceof ColumnInterface) {                throw new InvalidArgumentException("Not a valid column: $c");            }        }        parent::__construct($factory, '', $objectManager);        $this->source = $source;        $this->constraint = $constraint;        $this->orderings = $orderings;        $this->columns = $columns;    }    /**     * {@inheritDoc}     *     * @api     */    public function getSource()    {        return $this->source;    }    /**     * {@inheritDoc}     *     * @api     */    public function getConstraint()    {        return $this->constraint;    }    /**     * {@inheritDoc}     *     * @api     */    public function getOrderings()    {        return $this->orderings;    }    /**     * {@inheritDoc}     *     * @api     */    public function getColumns()    {        return $this->columns;    }    /**     * {@inheritDoc}     *     * @api     */    public function getBindVariableNames()    {        // TODO: can we inherit from SqlQuery?        throw new NotImplementedException();    }    /**     * {@inheritDoc}     *     * @api     */    public function getStatement()    {        $valueConverter = $this->factory->get(ValueConverter::class);        $converter = new QomToSql2QueryConverter(new Sql2Generator($valueConverter));        return $converter->convert($this);    }    /**     * {@inheritDoc}     *     * @api     */    public function getLanguage()    {        return self::JCR_SQL2;    }}