11<?php namespace Locker \Repository \Query ;
22use \Locker \Helpers \Helpers as Helpers ;
3+ use \Locker \Repository \Statement \EloquentRepository as StatementsRepo ;
34
45class EloquentQueryRepository implements QueryRepository {
56
@@ -24,25 +25,25 @@ public function where($lrsId, array $filters) {
2425 case 'in ' : $ statements ->whereIn ($ filter [0 ], $ filter [2 ]); break ;
2526 case 'between ' : $ statements ->whereBetween ($ filter [0 ], [$ filter [2 ], $ filter [3 ]]); break ;
2627 case 'or ' :
27- if (!empty ($ filter [2 ]) && is_array ($ filter [2 ])) {
28- $ statements ->where (function ($ query ) use ($ filter ) {
29- foreach ($ filter [2 ] as $ value ) {
30- foreach ($ value [1 ] as $ subVal ) {
31- if (is_object ($ subVal )) {
32- $ subVal_array = get_object_vars ($ subVal );
33- $ query ->orWhere (function ($ query ) use ($ subVal_array , $ value ) {
34- foreach ($ subVal_array as $ key => $ val ) {
35- $ query ->where ($ value [0 ] . '. ' . $ key , '= ' , $ val );
36- }
37- });
38- } else {
39- $ query ->orWhere ($ value [0 ], '= ' , $ subVal );
40- }
41- }
42- }
28+ if (!empty ($ filter [2 ]) && is_array ($ filter [2 ])) {
29+ $ statements ->where (function ($ query ) use ($ filter ) {
30+ foreach ($ filter [2 ] as $ value ) {
31+ foreach ($ value [1 ] as $ subVal ) {
32+ if (is_object ($ subVal )) {
33+ $ subVal_array = get_object_vars ($ subVal );
34+ $ query ->orWhere (function ($ query ) use ($ subVal_array , $ value ) {
35+ foreach ($ subVal_array as $ key => $ val ) {
36+ $ query ->where ($ value [0 ] . '. ' . $ key , '= ' , $ val );
37+ }
4338 });
39+ } else {
40+ $ query ->orWhere ($ value [0 ], '= ' , $ subVal );
41+ }
4442 }
45- break ;
43+ }
44+ });
45+ }
46+ break ;
4647 default : $ statements ->where ($ filter [0 ], $ filter [1 ], $ filter [2 ]);
4748 }
4849 }
@@ -61,9 +62,12 @@ public function aggregate($lrsId, array $pipeline) {
6162 return ;
6263 }
6364
64- $ pipeline [0 ] = array_merge_recursive ([
65- '$match ' => [self ::LRS_ID_KEY => $ lrsId ]
66- ], $ pipeline [0 ]);
65+ $ pipeline [0 ]['$match ' ] = [
66+ '$and ' => [(object ) $ pipeline [0 ]['$match ' ], [
67+ self ::LRS_ID_KEY => $ lrsId ,
68+ 'active ' => true
69+ ]]
70+ ];
6771
6872 return Helpers::replaceHtmlEntity ($ this ->db ->statements ->aggregate ($ pipeline ), true );
6973 }
@@ -120,6 +124,49 @@ public function aggregateObject($lrsId, array $match) {
120124 ]]);
121125 }
122126
127+ public function void (array $ match , array $ opts ) {
128+ $ void_id = 'http://adlnet.gov/expapi/verbs/voided ' ;
129+ $ match = [
130+ '$and ' => [$ match , [
131+ 'statement.verb.id ' => ['$ne ' => $ void_id ],
132+ 'voided ' => false
133+ ]]
134+ ];
135+
136+ $ data = $ this ->aggregate ($ opts ['lrs_id ' ], [[
137+ '$match ' => $ match
138+ ], [
139+ '$project ' => [
140+ '_id ' => 0 ,
141+ 'statement.id ' => 1 ,
142+ ]
143+ ]]);
144+
145+ $ statements = array_map (function ($ result ) use ($ opts , $ void_id ) {
146+ return [
147+ 'actor ' => $ opts ['client ' ]['authority ' ],
148+ 'verb ' => [
149+ 'id ' => $ void_id ,
150+ 'display ' => [
151+ 'en ' => 'voided '
152+ ]
153+ ],
154+ 'object ' => [
155+ 'objectType ' => 'StatementRef ' ,
156+ 'id ' => $ result ['statement ' ]['id ' ]
157+ ]
158+ ];
159+ }, $ data ['result ' ]);
160+
161+ $ opts ['authority ' ] = json_decode (json_encode ($ opts ['client ' ]['authority ' ]));
162+
163+ if ( count ($ statements ) > 0 ){
164+ return (new StatementsRepo ())->store (json_decode (json_encode ($ statements )), [], $ opts );
165+ } else {
166+ return [];
167+ }
168+ }
169+
123170 /**
124171 * Query to grab the required data based on type
125172 *
@@ -144,19 +191,19 @@ public function selectDistinctField( $lrs='', $table='', $field='', $value='', $
144191
145192 /**
146193 * Gets statement documents based on a filter.
147- *
194+ *
148195 * @param $lrs id The Lrs to search in (required)
149196 * @param $filter array The filter array
150197 * @param $raw boolean Pagination or raw statements?
151198 * @param $sections array Sections of the statement to return, default = all
152- *
199+ *
153200 * @return Statement query
154201 */
155202 public function selectStatementDocs ( $ lrs ='' , $ filter , $ raw =false , $ sections =[] ){
156203 $ statements = \Statement::where ('lrs._id ' , $ lrs );
157204
158205 if ( !empty ($ filter ) ){
159-
206+
160207 foreach ($ filter as $ key => $ value ){
161208 if ( is_array ($ value ) ){
162209 //does the array contain between values? e.g. <> 3, 6
@@ -182,7 +229,7 @@ public function selectStatementDocs( $lrs='', $filter, $raw=false, $sections=[]
182229 * @param $filter array The filter array
183230 * @param $raw boolean Pagination or raw statements?
184231 * @param $sections array Sections of the statement to return, default = all
185- *
232+ *
186233 * @return array results
187234 *
188235 **/
@@ -229,16 +276,16 @@ public function timedGrouping( $lrs, $filters, $interval, $type='time' ){
229276 $ set_id = [ $ interval => '$timestamp ' ];
230277 }else {
231278 switch ($ type ){
232- case 'user ' :
233- $ set_id = ['actor ' => '$statement.actor ' ];
234- $ project = ['$addToSet ' => '$statement.actor ' ];
279+ case 'user ' :
280+ $ set_id = ['actor ' => '$statement.actor ' ];
281+ $ project = ['$addToSet ' => '$statement.actor ' ];
235282 break ;
236- case 'verb ' :
237- $ set_id = ['verb ' => '$statement.verb ' ];
238- $ project = ['$addToSet ' => '$statement.verb ' ];
283+ case 'verb ' :
284+ $ set_id = ['verb ' => '$statement.verb ' ];
285+ $ project = ['$addToSet ' => '$statement.verb ' ];
239286 break ;
240- case 'activity ' :
241- $ set_id = ['activity ' => '$statement.object ' ];
287+ case 'activity ' :
288+ $ set_id = ['activity ' => '$statement.object ' ];
242289 $ project = ['$addToSet ' => '$statement.object ' ];
243290 break ;
244291 }
@@ -290,8 +337,8 @@ public function timedGrouping( $lrs, $filters, $interval, $type='time' ){
290337 * Return grouped object based on criteria passed.
291338 *
292339 * @param $lrs
293- * @param $section
294- * @param $filters
340+ * @param $section
341+ * @param $filters
295342 * @param $returnFields
296343 *
297344 * @return $results
0 commit comments