Skip to content

Commit 005eb68

Browse files
committed
Add method to return list of objects.
1 parent fe065e3 commit 005eb68

File tree

1 file changed

+124
-16
lines changed

1 file changed

+124
-16
lines changed

app/RestService.php

+124-16
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,7 @@ public static function sequence_count_from_cache($rest_service_id, $sample_id_li
713713

714714
public static function object_count_from_cache($type, $rest_service_id, $sample_id_list = [])
715715
{
716+
// Search the appropriate cache based on type.
716717
if ($type == 'sequence') {
717718
$l = SequenceCount::where('rest_service_id', $rest_service_id)->orderBy('updated_at', 'desc')->take(1)->get();
718719
} elseif ($type == 'clone') {
@@ -721,21 +722,27 @@ public static function object_count_from_cache($type, $rest_service_id, $sample_
721722
$l = CellCount::where('rest_service_id', $rest_service_id)->orderBy('updated_at', 'desc')->take(1)->get();
722723
}
723724

725+
// If we got no data, return
724726
if (count($l) == 0) {
725727
return;
726728
}
727729

730+
// Get all of the object counts base on the type.
728731
if ($type == 'sequence') {
729732
$all_object_counts = $l[0]->sequence_counts;
730733
} elseif ($type == 'clone') {
731734
$all_object_counts = $l[0]->clone_counts;
732735
} elseif ($type == 'cell') {
733736
$all_object_counts = $l[0]->cell_counts;
734737
}
735-
//if (count($sample_id_list) == 0) {
736-
// return $all_sequence_counts;
737-
//}
738+
// If our sample ID list is of 0 length, we are not filtering on any
739+
// sample IDs and we therefore return the full list.
740+
if (count($sample_id_list) == 0) {
741+
return $all_object_counts;
742+
}
738743

744+
// If we get here, we need to could up the objects for only the
745+
// samples in the cache that are provided in the sample_id_list.
739746
$object_counts = [];
740747
foreach ($sample_id_list as $sample_id) {
741748
if (isset($all_object_counts[$sample_id])) {
@@ -754,7 +761,7 @@ public static function object_count($type, $sample_id_list_by_rs, $filters = [],
754761
// clean filters
755762
$filters = self::clean_filters($filters);
756763

757-
// hack: use cached total counts if there are no sequence filters
764+
// use cached total counts if there are no sequence filters
758765
if (count($filters) == 0 && $use_cache_if_possible) {
759766
$counts_by_rs = [];
760767
foreach ($sample_id_list_by_rs as $rs_id => $sample_id_list) {
@@ -779,24 +786,27 @@ public static function object_count($type, $sample_id_list_by_rs, $filters = [],
779786
// generate JSON query
780787
$service_filters['repertoire_id'] = $sample_id_list;
781788

789+
// set up the facet query on repertoire_id
782790
$query_parameters = [];
783791
$query_parameters['facets'] = 'repertoire_id';
784792

785793
// prepare parameters for each service
786794
$t = [];
787795

796+
// Get the service info for the given service ID
788797
$rs = self::find($rs_id);
789798
$t['rs'] = $rs;
790799

800+
// Assign the query service endpoint based on the query type.
791801
if ($type == 'sequence') {
792802
$t['url'] = $rs->url . 'rearrangement';
793803
} elseif ($type == 'clone') {
794804
$t['url'] = $rs->url . 'clone';
795805
} elseif ($type == 'cell') {
796806
$t['url'] = $rs->url . 'cell';
797807
}
798-
//$t['url'] = $rs->url . 'rearrangement';
799808

809+
// Generate the JSON query based on the filters and parameters.
800810
$t['params'] = self::generate_json_query($service_filters, $query_parameters, $rs->api_version);
801811
$t['timeout'] = config('ireceptor.service_request_timeout');
802812

@@ -811,14 +821,18 @@ public static function object_count($type, $sample_id_list_by_rs, $filters = [],
811821
foreach ($response_list as $response) {
812822
$rest_service_id = $response['rs']->id;
813823

824+
// if it is an error make a note of it.
814825
if ($response['status'] == 'error') {
815826
$counts_by_rs[$rest_service_id]['samples'] = null;
816827
$counts_by_rs[$rest_service_id]['error_type'] = $response['error_type'];
817828
continue;
818829
}
819830

831+
// Get the facet count list for the response.
820832
$facet_list = data_get($response, 'data.Facet', []);
821833
$object_count = [];
834+
// Iterate over the list and get a count for each repertoire, keyed
835+
// on repertoire_id
822836
foreach ($facet_list as $facet) {
823837
$object_count[$facet->repertoire_id] = $facet->count;
824838
}
@@ -831,12 +845,101 @@ public static function object_count($type, $sample_id_list_by_rs, $filters = [],
831845
}
832846
}
833847

848+
// Add the count list for this service to this services data.
834849
$counts_by_rs[$rest_service_id]['samples'] = $object_count;
835850
}
836851

837852
return $counts_by_rs;
838853
}
839854

855+
// $sample_id_list_by_rs: array of rest_service_id => [list of samples ids]
856+
public static function object_list($type, $sample_id_list_by_rs, $filters = [], $field='')
857+
{
858+
// Set up info that depends on the query type
859+
if ($type == 'sequence') {
860+
$endpoint = 'rearrangement';
861+
$airr_object = 'Rearrangement';
862+
} elseif ($type == 'clone') {
863+
$endpoint = 'clone';
864+
$airr_object = 'Clone';
865+
} elseif ($type == 'cell') {
866+
$endpoint = 'cell';
867+
$airr_object = 'Cell';
868+
} elseif ($type == 'expression') {
869+
$endpoint = 'expression';
870+
$airr_object = 'CellExpression';
871+
} elseif ($type == 'reactivity') {
872+
$endpoint = 'reactivity';
873+
$airr_object = 'Reactivity';
874+
} else {
875+
Log::error('RestService::object_list - Unexpected query type ' . $type);
876+
throw new \Exception('Unexpected query type ' . $type);
877+
}
878+
879+
// clean filters
880+
$filters = self::clean_filters($filters);
881+
882+
// prepare request parameters for each service
883+
$request_params = [];
884+
885+
foreach ($sample_id_list_by_rs as $rs_id => $sample_id_list) {
886+
$service_filters = $filters;
887+
888+
// force all sample ids to string
889+
foreach ($sample_id_list as $k => $v) {
890+
$sample_id_list[$k] = (string) $v;
891+
}
892+
893+
// generate JSON query
894+
$service_filters['repertoire_id'] = $sample_id_list;
895+
896+
$query_parameters = [];
897+
$query_parameters['facets'] = $field;
898+
899+
// prepare parameters for each service
900+
$t = [];
901+
902+
// Get the service information
903+
$rs = self::find($rs_id);
904+
$t['rs'] = $rs;
905+
906+
// Get the query URL based on the endpoint
907+
$t['url'] = $rs->url . $endpoint;
908+
909+
$t['params'] = self::generate_json_query($service_filters, $query_parameters, $rs->api_version);
910+
$t['timeout'] = config('ireceptor.service_request_timeout');
911+
912+
$request_params[] = $t;
913+
}
914+
915+
// do requests
916+
$response_list = self::doRequests($request_params);
917+
918+
// build list of sequence count for each sample grouped by repository id
919+
$objects_by_rs = [];
920+
foreach ($response_list as $response) {
921+
$rest_service_id = $response['rs']->id;
922+
923+
if ($response['status'] == 'error') {
924+
$objects_by_rs[$rest_service_id]['samples'] = null;
925+
$objects_by_rs[$rest_service_id]['error_type'] = $response['error_type'];
926+
continue;
927+
}
928+
929+
$object_response = data_get($response, 'data.Facet', []);
930+
$object_list = [];
931+
foreach ($object_response as $object_data) {
932+
if ($object_data->count > 0) {
933+
$object_list[] = $object_data->$field;
934+
}
935+
}
936+
937+
$objects_by_rs[$rest_service_id] = $object_list;
938+
}
939+
940+
return $objects_by_rs;
941+
}
942+
840943
// $sample_id_list_by_rs: array of rest_service_id => [list of samples ids]
841944
/*
842945
public static function sequence_count($sample_id_list_by_rs, $filters = [], $use_cache_if_possible = true)
@@ -1161,9 +1264,6 @@ public static function data_summary($filters, $username = '', $group_by_rest_ser
11611264
{
11621265
Log::debug('RestService::data_summary()');
11631266

1164-
//Log::debug($filters);
1165-
//blah;
1166-
11671267
// Build list of repository ids to query. For each enabled repository
11681268
// generate the internal key (ir_project_sample_id_list_). If that key
11691269
// is in the filters from the gateway, then we add it to the list of
@@ -1213,7 +1313,7 @@ public static function data_summary($filters, $username = '', $group_by_rest_ser
12131313
}
12141314

12151315
Log::debug('Filtered to requested samples only:');
1216-
Log::debug($response_list_requested);
1316+
//Log::debug($response_list_requested);
12171317

12181318
// Build list of data filters only (remove sample id filters)
12191319
$data_filters = $filters;
@@ -1234,18 +1334,22 @@ public static function data_summary($filters, $username = '', $group_by_rest_ser
12341334

12351335
$sample_id_list_by_rs[$response['rs']->id] = $sample_id_list_requested;
12361336
}
1337+
//var_dump('<br/>');
12371338
//var_dump($sample_id_list_by_rs);
1339+
//var_dump('<br/>');
12381340
//var_dump($data_filters);
1239-
//blah;
1341+
//var_dump('<br/>');
12401342

12411343
// count objects for each requested sample
12421344
if ($type == 'sequence' || $type == 'clone' || $type == 'cell') {
12431345
$counts_by_rs = self::object_count($type, $sample_id_list_by_rs, $data_filters);
1346+
//$stuff = self::object_list($type, $sample_id_list_by_rs, $data_filters, 'cell_id');
1347+
//var_dump($stuff);
12441348
} else {
12451349
Log::error('Unexpected query type ' . $type);
12461350
throw new \Exception('Unexpected query type ' . $type);
12471351
}
1248-
var_dump($counts_by_rs);
1352+
//var_dump($counts_by_rs);
12491353

12501354
/*
12511355
if ($type == 'sequence') {
@@ -1389,11 +1493,15 @@ public static function data_subset($filters, $response_list_data_summary, $n = 1
13891493
} elseif ($type == 'clone') {
13901494
$base_uri = 'clone';
13911495
} else {
1392-
$query_type = 'cell';
1393-
if (isset($filters['property_expression'])) {
1394-
$query_type = 'expression';
1395-
}
1396-
$base_uri = $query_type;
1496+
//$query_type = 'cell';
1497+
//if (isset($filters['property_expression'])) {
1498+
// $query_type = 'expression';
1499+
//} elseif (isset($filters['peptide_sequence_aa_reactivity'])) {
1500+
// $query_type = 'reactivity';
1501+
//}
1502+
1503+
//$base_uri = $query_type;
1504+
$base_uri = 'cell';
13971505
}
13981506

13991507
Log::debug('We have reponses for repos with id:');

0 commit comments

Comments
 (0)