1: <?php
2:
3: namespace PHPixie\ORM\Mappers;
4:
5: class Conditions
6: {
7: protected $mappers;
8: protected $planners;
9: protected $relationships;
10: protected $relationshipMap;
11:
12: public function __construct($mappers, $planners, $relationships, $relationshipMap)
13: {
14: $this->mappers = $mappers;
15: $this->planners = $planners;
16: $this->relationships = $relationships;
17: $this->relationshipMap = $relationshipMap;
18: }
19:
20: protected function mapOperatorCondition($builder, $condition)
21: {
22: $builder->addOperatorCondition(
23: $condition->logic(),
24: $condition->isNegated(),
25: $condition->field(),
26: $condition->operator(),
27: $condition->values()
28: );
29: }
30:
31: protected function mapConditionCollection($builder, $modelName, $collection, $plan)
32: {
33: $builder->startConditionGroup($collection->logic(), $collection->isNegated());
34: $this->mapConditions($builder, $modelName, $collection->conditions(), $plan);
35: $builder->endGroup();
36: }
37:
38: protected function mapRelatedToCollection($builder, $modelName, $collection, $plan)
39: {
40: $side = $this->relationshipMap->get($modelName, $collection->relationship());
41: $type = $side->relationshipType();
42: $handler = $this->relationships->get($type)->handler();
43:
44: if($builder instanceof \PHPixie\Database\Query) {
45: $handler->mapDatabaseQuery($builder, $side, $collection, $plan);
46: }else{
47: $handler->mapEmbeddedContainer($builder, $side, $collection, $plan);
48: }
49: }
50:
51: protected function mapInCondition($builder, $modelName, $inCondition, $plan)
52: {
53: $collectionCondition = $this->mappers->conditionsNormalizer()->normalizeIn($inCondition);
54: $this->mapConditionCollection($builder, $modelName, $collectionCondition, $plan);
55: }
56:
57: protected function mapSubqueryCondition($builder, $modelName, $condition, $plan)
58: {
59: $this->planners->in()->databaseModelQuery(
60: $builder,
61: $condition->field(),
62: $condition->subquery(),
63: $condition->subqueryField(),
64: $plan,
65: $condition->logic(),
66: $condition->isNegated()
67: );
68: }
69:
70: protected function mapConditions($builder, $modelName, $conditions, $plan)
71: {
72: foreach ($conditions as $condition) {
73:
74: if ($condition instanceof \PHPixie\ORM\Conditions\Condition\Field\Operator) {
75: $this->mapOperatorCondition($builder, $condition);
76:
77: }elseif ($condition instanceof \PHPixie\ORM\Conditions\Condition\In) {
78: $this->mapInCondition($builder, $modelName, $condition, $plan);
79:
80: }elseif ($condition instanceof \PHPixie\ORM\Conditions\Condition\Collection\RelatedTo) {
81: $this->mapRelatedToCollection($builder, $modelName, $condition, $plan);
82:
83: }elseif ($condition instanceof \PHPixie\ORM\Conditions\Condition\Collection) {
84: $this->mapConditionCollection($builder, $modelName, $condition, $plan);
85:
86: }elseif ($condition instanceof \PHPixie\ORM\Conditions\Condition\Field\Subquery) {
87: $this->mapSubqueryCondition($builder, $modelName, $condition, $plan);
88:
89: }else {
90: throw new \PHPixie\ORM\Exception\Mapper("Unexpected condition encountered");
91: }
92: }
93: }
94:
95: public function map($builder, $modelName, $conditions, $plan)
96: {
97: $conditions = $this->mappers->conditionsOptimizer()->optimize($conditions);
98: $this->mapConditions($builder, $modelName, $conditions, $plan);
99: }
100: }
101: