3 namespace DataAccess\StepMania
;
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
;
12 //TODO: Implement some sort of caching. Probably OK for now not to worry.
13 class SimfileRepository
implements ISimfileRepository
16 private $_queryBuilderFactory;
18 public function __construct(IDataMapper
$dataMapper, IQueryBuilderFactory
$queryBuilderFactory) {
19 $this->_dataMapper
= $dataMapper;
20 $this->_queryBuilderFactory
= $queryBuilderFactory;
23 public function findById($id) {
24 return $this->_dataMapper
->map(
26 'SELECT * FROM %s WHERE id=' . $id
30 public function findRange($id, $limit)
32 return $this->_dataMapper
->findRange(
34 'SELECT * FROM %s WHERE id>=' . $id . ' LIMIT ' . $limit
38 public function save(ISimfile
$entity) {
39 $this->_dataMapper
->save($entity);
43 public function remove(ISimfile
$entity) {
47 private function applyConstraintsAndReturn(ISimfileQueryConstraints
$constraints = NULL
, IQueryBuilder
$queryBuilder)
51 $constraints->applyTo($queryBuilder);
54 return $this->_dataMapper
->map('Simfile', $queryBuilder);
57 public function findByTitle($title, ISimfileQueryConstraints
$constraints = NULL
)
59 $queryBuilder = $this->_queryBuilderFactory
->createInstance();
60 $queryBuilder->where('title', 'LIKE', "%%$title%%");
62 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
65 public function findByArtist($artist, ISimfileQueryConstraints
$constraints = NULL
)
67 $queryBuilder = $this->_queryBuilderFactory
->createInstance();
68 $queryBuilder->where('artist', 'LIKE', "%%$artist%%");
70 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
73 public function findByBpm($high, $low = null
, ISimfileQueryConstraints
$constraints = NULL
)
75 $queryBuilder = $this->_queryBuilderFactory
->createInstance();
76 $queryBuilder->where('bpm_high', '=', $high);
80 $queryBuilder->where('bpm_low', '=', $low);
83 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
86 public function findByStepArtist($artistName, ISimfileQueryConstraints
$constraints = null
)
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%%");
93 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
96 private function findByDifficultyAndRating($difficulty, $rating, ISimfileQueryConstraints
$constraints = null
)
98 $queryBuilder = $this->_queryBuilderFactory
->createInstance();
99 $queryBuilder->join('inner', 'simfiles', 'id', 'steps', 'simfile_id')
100 ->where('difficulty', '=', $difficulty)
101 ->where('rating', '=', $rating);
103 return $this->applyConstraintsAndReturn($constraints, $queryBuilder);
106 public function findByLightMeter($feet, ISimfileQueryConstraints
$constraints = null
)
108 return $this->findByDifficultyAndRating('light', $feet, $constraints);
111 public function findByBeginnerMeter($feet, ISimfileQueryConstraints
$constraints = null
)
113 return $this->findByDifficultyAndRating('beginner', $feet, $constraints);
116 public function findByMediumMeter($feet, ISimfileQueryConstraints
$constraints = null
)
118 return $this->findByDifficultyAndRating('medium', $feet, $constraints);
121 public function findByHardMeter($feet, ISimfileQueryConstraints
$constraints = null
)
123 return $this->findByDifficultyAndRating('challenge', $feet, $constraints);
126 public function findByExpertMeter($feet, ISimfileQueryConstraints
$constraints = null
)
128 return $this->findByDifficultyAndRating('expert', $feet, $constraints);