1<?php
2
3/*
4 * This file is part of the TYPO3 CMS project.
5 *
6 * It is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License, either version 2
8 * of the License, or any later version.
9 *
10 * For the full copyright and license information, please read the
11 * LICENSE.txt file that was distributed with this source code.
12 *
13 * The TYPO3 project - inspiring people to share!
14 */
15
16namespace TYPO3\CMS\Extbase\Persistence\Generic\Qom;
17
18use TYPO3\CMS\Core\SingletonInterface;
19use TYPO3\CMS\Core\Utility\GeneralUtility;
20use TYPO3\CMS\Extbase\Persistence\QueryInterface;
21
22/**
23 * The Query Object Model Factory
24 * @internal only to be used within Extbase, not part of TYPO3 Core API.
25 */
26class QueryObjectModelFactory implements SingletonInterface
27{
28    /**
29     * Selects a subset of the nodes in the repository based on node type.
30     *
31     * @param string $nodeTypeName the name of the required node type; non-null
32     * @param string $selectorName the selector name; optional
33     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\SelectorInterface the selector
34     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
35     */
36    public function selector($nodeTypeName, $selectorName = '')
37    {
38        if ($selectorName === '') {
39            $selectorName = $nodeTypeName;
40        }
41        return GeneralUtility::makeInstance(Selector::class, $selectorName, $nodeTypeName);
42    }
43
44    /**
45     * Sets a statement as constraint. This is not part of the JCR 2.0 Specification!
46     *
47     * @param string $statement The statement
48     * @param array $boundVariables An array of variables to bind to the statement
49     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\Statement
50     */
51    public function statement($statement, array $boundVariables = [])
52    {
53        return GeneralUtility::makeInstance(Statement::class, $statement, $boundVariables);
54    }
55
56    /**
57     * Performs a join between two node-tuple sources.
58     *
59     * @param SourceInterface $left the left node-tuple source; non-null
60     * @param SourceInterface $right the right node-tuple source; non-null
61     * @param string $joinType one of QueryObjectModelConstants.JCR_JOIN_TYPE_*
62     * @param JoinConditionInterface $joinCondition
63     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\JoinInterface the join; non-null
64     */
65    public function join(SourceInterface $left, SourceInterface $right, $joinType, JoinConditionInterface $joinCondition)
66    {
67        return GeneralUtility::makeInstance(Join::class, $left, $right, $joinType, $joinCondition);
68    }
69
70    /**
71     * Tests whether the value of a property in a first selector is equal to the value of a property in a second selector.
72     *
73     * @param string $selector1Name the name of the first selector; non-null
74     * @param string $property1Name the property name in the first selector; non-null
75     * @param string $selector2Name the name of the second selector; non-null
76     * @param string $property2Name the property name in the second selector; non-null
77     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\EquiJoinConditionInterface the constraint; non-null
78     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
79     */
80    public function equiJoinCondition($selector1Name, $property1Name, $selector2Name, $property2Name)
81    {
82        return GeneralUtility::makeInstance(EquiJoinCondition::class, $selector1Name, $property1Name, $selector2Name, $property2Name);
83    }
84
85    /**
86     * Performs a logical conjunction of two other constraints.
87     *
88     * @param ConstraintInterface $constraint1 the first constraint; non-null
89     * @param ConstraintInterface $constraint2 the second constraint; non-null
90     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\AndInterface the And constraint; non-null
91     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
92     */
93    public function _and(ConstraintInterface $constraint1, ConstraintInterface $constraint2)
94    {
95        return GeneralUtility::makeInstance(LogicalAnd::class, $constraint1, $constraint2);
96    }
97
98    /**
99     * Performs a logical disjunction of two other constraints.
100     *
101     * @param ConstraintInterface $constraint1 the first constraint; non-null
102     * @param ConstraintInterface $constraint2 the second constraint; non-null
103     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\OrInterface the Or constraint; non-null
104     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
105     */
106    public function _or(ConstraintInterface $constraint1, ConstraintInterface $constraint2)
107    {
108        return GeneralUtility::makeInstance(LogicalOr::class, $constraint1, $constraint2);
109    }
110
111    /**
112     * Performs a logical negation of another constraint.
113     *
114     * @param ConstraintInterface $constraint the constraint to be negated; non-null
115     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\NotInterface the Not constraint; non-null
116     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
117     */
118    public function not(ConstraintInterface $constraint)
119    {
120        return GeneralUtility::makeInstance(LogicalNot::class, $constraint);
121    }
122
123    /**
124     * Filters node-tuples based on the outcome of a binary operation.
125     *
126     * @param PropertyValueInterface $operand1 the first operand; non-null
127     * @param string $operator the operator; one of QueryObjectModelConstants.JCR_OPERATOR_*
128     * @param \TYPO3\CMS\Extbase\Persistence\Generic\Qom\StaticOperandInterface $operand2 the second operand; non-null
129     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ComparisonInterface the constraint; non-null
130     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
131     */
132    public function comparison(PropertyValueInterface $operand1, $operator, $operand2)
133    {
134        return GeneralUtility::makeInstance(Comparison::class, $operand1, $operator, $operand2);
135    }
136
137    /**
138     * Evaluates to the value (or values, if multi-valued) of a property in the specified or default selector.
139     *
140     * @param string $propertyName the property name; non-null
141     * @param string $selectorName the selector name; non-null
142     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\PropertyValueInterface the operand; non-null
143     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
144     */
145    public function propertyValue($propertyName, $selectorName = '')
146    {
147        return GeneralUtility::makeInstance(PropertyValue::class, $propertyName, $selectorName);
148    }
149
150    /**
151     * Evaluates to the lower-case string value (or values, if multi-valued) of an operand.
152     *
153     * @param PropertyValueInterface $operand the operand whose value is converted to a lower-case string; non-null
154     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\LowerCaseInterface the operand; non-null
155     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
156     */
157    public function lowerCase(PropertyValueInterface $operand)
158    {
159        return GeneralUtility::makeInstance(LowerCase::class, $operand);
160    }
161
162    /**
163     * Evaluates to the upper-case string value (or values, if multi-valued) of an operand.
164     *
165     * @param PropertyValueInterface $operand the operand whose value is converted to an upper-case string; non-null
166     * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\UpperCaseInterface the operand; non-null
167     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
168     */
169    public function upperCase(PropertyValueInterface $operand)
170    {
171        return GeneralUtility::makeInstance(UpperCase::class, $operand);
172    }
173
174    /**
175     * Orders by the value of the specified operand, in ascending order.
176     *
177     * The query is invalid if $operand does not evaluate to a scalar value.
178     *
179     * @param DynamicOperandInterface $operand the operand by which to order; non-null
180     * @return OrderingInterface the ordering
181     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
182     */
183    public function ascending(DynamicOperandInterface $operand)
184    {
185        return GeneralUtility::makeInstance(Ordering::class, $operand, QueryInterface::ORDER_ASCENDING);
186    }
187
188    /**
189     * Orders by the value of the specified operand, in descending order.
190     *
191     * The query is invalid if $operand does not evaluate to a scalar value.
192     *
193     * @param DynamicOperandInterface $operand the operand by which to order; non-null
194     * @return OrderingInterface the ordering
195     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
196     */
197    public function descending(DynamicOperandInterface $operand)
198    {
199        return GeneralUtility::makeInstance(Ordering::class, $operand, QueryInterface::ORDER_DESCENDING);
200    }
201
202    /**
203     * Evaluates to the value of a bind variable.
204     *
205     * @param string $bindVariableName the bind variable name; non-null
206     * @return BindVariableValueInterface the operand; non-null
207     * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Exception\RepositoryException if the operation otherwise fails
208     */
209    public function bindVariable($bindVariableName)
210    {
211        return GeneralUtility::makeInstance(BindVariableValue::class, $bindVariableName);
212    }
213}
214