1 | <?php |
||
17 | class ScopeEvaluator extends Segments\SegmentVisitor |
||
18 | { |
||
19 | /** |
||
20 | * @var ITraversable |
||
21 | */ |
||
22 | protected $traversable; |
||
23 | |||
24 | /** |
||
25 | * @var Queries\IResolvedParameterRegistry |
||
26 | */ |
||
27 | protected $resolvedParameters; |
||
28 | |||
29 | private function __construct( |
||
30 | ITraversable $traversable, |
||
31 | Queries\IResolvedParameterRegistry $resolvedParameters |
||
32 | ) { |
||
33 | $this->traversable = $traversable; |
||
34 | $this->resolvedParameters = $resolvedParameters; |
||
35 | } |
||
36 | |||
37 | public function visitFilter(Segments\Filter $query) |
||
43 | |||
44 | public function visitRange(Segments\Range $query) |
||
52 | |||
53 | public function visitSelect(Segments\Select $query) |
||
59 | |||
60 | public function visitSelectMany(Segments\SelectMany $query) |
||
66 | |||
67 | public function visitUnique(Segments\Unique $query) |
||
71 | |||
72 | public function visitOrderBy(Segments\OrderBy $query) |
||
94 | |||
95 | public function visitGroupBy(Segments\GroupBy $query) |
||
101 | |||
102 | public function visitJoin(Segments\Join $query) |
||
111 | |||
112 | /** |
||
113 | * Evaluates the join segment values and filter upon the supplied traversable. |
||
114 | * |
||
115 | * @param ITraversable $traversable |
||
116 | * @param Common\Join\Options $join |
||
117 | * @param Queries\IResolvedParameterRegistry $resolvedParameters |
||
118 | * |
||
119 | * @return \Pinq\Interfaces\IJoiningToTraversable |
||
120 | */ |
||
121 | public static function evaluateJoinOptions( |
||
122 | ITraversable $traversable, |
||
123 | Common\Join\Options $join, |
||
124 | Queries\IResolvedParameterRegistry $resolvedParameters |
||
125 | ) { |
||
126 | $values = self::evaluateSource($join->getSource(), $resolvedParameters); |
||
127 | $joiningTraversable = $join->isGroupJoin() ? $traversable->groupJoin($values) : $traversable->join($values); |
||
128 | |||
129 | if ($join->hasFilter()) { |
||
130 | $filter = $join->getFilter(); |
||
131 | |||
132 | if ($filter instanceof Common\Join\Filter\Custom) { |
||
133 | $joiningTraversable = $joiningTraversable->on( |
||
134 | $resolvedParameters[$filter->getOnFunction()->getCallableId()] |
||
135 | ); |
||
136 | } elseif ($filter instanceof Common\Join\Filter\Equality) { |
||
137 | $joiningTraversable = $joiningTraversable->onEquality( |
||
138 | $resolvedParameters[$filter->getOuterKeyFunction()->getCallableId()], |
||
139 | $resolvedParameters[$filter->getInnerKeyFunction()->getCallableId()] |
||
140 | ); |
||
141 | } |
||
142 | } |
||
143 | |||
144 | if ($join->hasDefault()) { |
||
145 | $joiningTraversable = $joiningTraversable->withDefault( |
||
146 | $resolvedParameters[$join->getDefaultValueId()], |
||
147 | $resolvedParameters[$join->getDefaultKeyId()] |
||
148 | ); |
||
149 | } |
||
150 | |||
151 | return $joiningTraversable; |
||
152 | } |
||
153 | |||
154 | public static function evaluateSource( |
||
155 | Common\ISource $source, |
||
156 | Queries\IResolvedParameterRegistry $resolvedParameters |
||
157 | ) { |
||
158 | if ($source instanceof Common\Source\ArrayOrIterator) { |
||
159 | return $resolvedParameters[$source->getId()]; |
||
160 | } elseif ($source instanceof Common\Source\SingleValue) { |
||
161 | return [$resolvedParameters[$source->getId()]]; |
||
162 | } elseif ($source instanceof Common\Source\QueryScope) { |
||
163 | return self::evaluate($source->getScope(), $resolvedParameters); |
||
164 | } |
||
165 | } |
||
166 | |||
167 | public static function evaluate( |
||
184 | |||
185 | public function visitIndexBy(Segments\IndexBy $query) |
||
191 | |||
192 | public function visitKeys(Segments\Keys $query) |
||
196 | |||
197 | public function visitReindex(Segments\Reindex $query) |
||
201 | |||
202 | public function visitOperation(Segments\Operation $query) |
||
232 | } |
||
233 |