Popular downloads stuff.
[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)->null('pack_id');
26
27 $result = $this->_dataMapper->map('Simfile', $queryBuilder);
28 return reset($result);
29 }
30
31 public function findAll()
32 {
33 $queryBuilder = $this->_queryBuilderFactory->createInstance();
34 $queryBuilder->where('id', '>', 0)->null('pack_id');
35 $result = $this->_dataMapper->map('Simfile', $queryBuilder);
36 return $result;
37 }
38
39 public function findByFileId($id)
40 {
41 $queryBuilder = $this->_queryBuilderFactory->createInstance();
42 $queryBuilder->where('simfile_file_id', '=', $id);
43 return $this->_dataMapper->map('Simfile', $queryBuilder);
44 }
45
46 public function findRange($id, $limit)
47 {
48 $queryBuilder = $this->_queryBuilderFactory->createInstance();
49 $queryBuilder->where('id', '>=', $id)->null('pack_id')->limit(abs($limit));
50 if($limit < 0) $queryBuilder->orderBy('id', 'DESC');
51
52 return $this->_dataMapper->map('Simfile', $queryBuilder);
53 }
54
55 public function save(ISimfile $entity) {
56 return $this->_dataMapper->save($entity);
57 }
58
59 //TODO: Implement
60 public function remove(ISimfile $entity) {
61 ;
62 }
63
64 private function applyConstraintsAndReturn(ISimfileQueryConstraints $constraints = NULL, IQueryBuilder $queryBuilder)
65 {
66 if($constraints)
67 {
68 $constraints->applyTo($queryBuilder);
69 }
70
71 $queryBuilder->null('pack_id');
72
73 return $this->_dataMapper->map('Simfile', $queryBuilder);
74 }
75
76 public function findByTitle($title, ISimfileQueryConstraints $constraints = NULL)
77 {
78 $queryBuilder = $this->_queryBuilderFactory->createInstance();
79 $queryBuilder->where('title', 'LIKE', "%%$title%%");
80
81 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
82 }
83
84 public function findByArtist($artist, ISimfileQueryConstraints $constraints = NULL)
85 {
86 $queryBuilder = $this->_queryBuilderFactory->createInstance();
87 $queryBuilder->where('artist', 'LIKE', "%%$artist%%");
88
89 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
90 }
91
92 public function findByBpm($high, $low = null, ISimfileQueryConstraints $constraints = NULL)
93 {
94 $queryBuilder = $this->_queryBuilderFactory->createInstance();
95 $queryBuilder->where('bpm_high', '=', $high);
96
97 if($low)
98 {
99 $queryBuilder->where('bpm_low', '=', $low);
100 }
101
102 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
103 }
104
105 public function findByStepArtist($artistName, ISimfileQueryConstraints $constraints = null)
106 {
107 $queryBuilder = $this->_queryBuilderFactory->createInstance();
108 $queryBuilder->join('inner', 'simfiles', 'id', 'steps', 'simfile_id')
109 ->join('inner', 'steps', 'step_artist_id', 'step_artists', 'id')
110 ->where('tag', 'LIKE', "%%$artistName%%");
111
112 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
113 }
114
115 private function findByDifficultyAndRating($difficulty, $rating, ISimfileQueryConstraints $constraints = null)
116 {
117 $queryBuilder = $this->_queryBuilderFactory->createInstance();
118 $queryBuilder->join('inner', 'simfiles', 'id', 'steps', 'simfile_id')
119 ->where('difficulty', '=', $difficulty)
120 ->where('rating', '=', $rating);
121
122 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
123 }
124
125 public function findByLightMeter($feet, ISimfileQueryConstraints $constraints = null)
126 {
127 return $this->findByDifficultyAndRating('light', $feet, $constraints);
128 }
129
130 public function findByBeginnerMeter($feet, ISimfileQueryConstraints $constraints = null)
131 {
132 return $this->findByDifficultyAndRating('beginner', $feet, $constraints);
133 }
134
135 public function findByMediumMeter($feet, ISimfileQueryConstraints $constraints = null)
136 {
137 return $this->findByDifficultyAndRating('medium', $feet, $constraints);
138 }
139
140 public function findByHardMeter($feet, ISimfileQueryConstraints $constraints = null)
141 {
142 return $this->findByDifficultyAndRating('challenge', $feet, $constraints);
143 }
144
145 public function findByExpertMeter($feet, ISimfileQueryConstraints $constraints = null)
146 {
147 return $this->findByDifficultyAndRating('expert', $feet, $constraints);
148 }
149 }