Fix issues with simfile controller.
[rock.divinelegy.git] / DataAccess / StepMania / SimfileRepository.php
1 <?php
2
3 namespace DataAccess\StepMania;
4
5 use DataAccess\StepMania\ISimfileRepository;
6 use DataAccess\DataMapper\IDataMapper;
7 use DataAccess\Queries\IQueryBuilderFactory;
8 use DataAccess\Queries\IQueryBuilder;
9 use DataAccess\Queries\StepMania\ISimfileQueryConstraints;
10 use Domain\Entities\StepMania\ISimfile;
11
12 //TODO: Implement some sort of caching. Probably OK for now not to worry.
13 class SimfileRepository implements ISimfileRepository
14 {
15 private $_dataMapper;
16 private $_queryBuilderFactory;
17
18 public function __construct(IDataMapper $dataMapper, IQueryBuilderFactory $queryBuilderFactory) {
19 $this->_dataMapper = $dataMapper;
20 $this->_queryBuilderFactory = $queryBuilderFactory;
21 }
22
23 public function findById($id) {
24 $queryBuilder = $this->_queryBuilderFactory->createInstance();
25 $queryBuilder->where('id', '=', $id);
26
27 return $this->_dataMapper->map('Simfile', $queryBuilder);
28 }
29
30 public function findRange($id, $limit)
31 {
32 $queryBuilder = $this->_queryBuilderFactory->createInstance();
33 $queryBuilder->where('id', '>=', $id)->limit($limit);
34
35 return $this->_dataMapper->map('Simfile', $queryBuilder);
36 }
37
38 public function save(ISimfile $entity) {
39 $this->_dataMapper->save($entity);
40 }
41
42 //TODO: Implement
43 public function remove(ISimfile $entity) {
44 ;
45 }
46
47 private function applyConstraintsAndReturn(ISimfileQueryConstraints $constraints = NULL, IQueryBuilder $queryBuilder)
48 {
49 if($constraints)
50 {
51 $constraints->applyTo($queryBuilder);
52 }
53
54 return $this->_dataMapper->map('Simfile', $queryBuilder);
55 }
56
57 public function findByTitle($title, ISimfileQueryConstraints $constraints = NULL)
58 {
59 $queryBuilder = $this->_queryBuilderFactory->createInstance();
60 $queryBuilder->where('title', 'LIKE', "%%$title%%");
61
62 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
63 }
64
65 public function findByArtist($artist, ISimfileQueryConstraints $constraints = NULL)
66 {
67 $queryBuilder = $this->_queryBuilderFactory->createInstance();
68 $queryBuilder->where('artist', 'LIKE', "%%$artist%%");
69
70 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
71 }
72
73 public function findByBpm($high, $low = null, ISimfileQueryConstraints $constraints = NULL)
74 {
75 $queryBuilder = $this->_queryBuilderFactory->createInstance();
76 $queryBuilder->where('bpm_high', '=', $high);
77
78 if($low)
79 {
80 $queryBuilder->where('bpm_low', '=', $low);
81 }
82
83 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
84 }
85
86 public function findByStepArtist($artistName, ISimfileQueryConstraints $constraints = null)
87 {
88 $queryBuilder = $this->_queryBuilderFactory->createInstance();
89 $queryBuilder->join('inner', 'simfiles', 'id', 'steps', 'simfile_id')
90 ->join('inner', 'steps', 'step_artist_id', 'step_artists', 'id')
91 ->where('tag', 'LIKE', "%%$artistName%%");
92
93 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
94 }
95
96 private function findByDifficultyAndRating($difficulty, $rating, ISimfileQueryConstraints $constraints = null)
97 {
98 $queryBuilder = $this->_queryBuilderFactory->createInstance();
99 $queryBuilder->join('inner', 'simfiles', 'id', 'steps', 'simfile_id')
100 ->where('difficulty', '=', $difficulty)
101 ->where('rating', '=', $rating);
102
103 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
104 }
105
106 public function findByLightMeter($feet, ISimfileQueryConstraints $constraints = null)
107 {
108 return $this->findByDifficultyAndRating('light', $feet, $constraints);
109 }
110
111 public function findByBeginnerMeter($feet, ISimfileQueryConstraints $constraints = null)
112 {
113 return $this->findByDifficultyAndRating('beginner', $feet, $constraints);
114 }
115
116 public function findByMediumMeter($feet, ISimfileQueryConstraints $constraints = null)
117 {
118 return $this->findByDifficultyAndRating('medium', $feet, $constraints);
119 }
120
121 public function findByHardMeter($feet, ISimfileQueryConstraints $constraints = null)
122 {
123 return $this->findByDifficultyAndRating('challenge', $feet, $constraints);
124 }
125
126 public function findByExpertMeter($feet, ISimfileQueryConstraints $constraints = null)
127 {
128 return $this->findByDifficultyAndRating('expert', $feet, $constraints);
129 }
130 }