/**
  * Get the matching request for the given request id.
  *
  * @param  int  $id
  * @return Response
  */
 public function show($id)
 {
     //Unique namespace for request PMRequest.
     $request = PMRequest::find($id);
     //Not a valid request
     if (empty($request)) {
         return parent::InvalidRequestResponseHandler();
         exit;
     }
     $request_pickup_times = $request->requestPickupTimes->toArray();
     $request_pickup_times_array = array();
     foreach ($request_pickup_times as $index => $vArray) {
         $request_pickup_times_array[] = $vArray['pickup_timestamp'];
     }
     $request_pickup_times_hash = array_flip($request_pickup_times_array);
     $time_filtered_requests = RequestPickupTimes::getRequestWithMatchingPickup($request_pickup_times_array, $id, $request->requester_id);
     //No requests matched, you want to suggest somthing to the user here
     if (empty($time_filtered_requests)) {
         return parent::NoRequestMatchResponseHandler();
         exit;
     }
     $result = array();
     foreach ($time_filtered_requests as $index => $request_info) {
         if (!isset($result[$request_info->request_id])) {
             $result[$request_info->request_id] = array();
         }
         $result[$request_info->request_id]['pickup_time'][] = $request_info->pickup_timestamp;
     }
     $time_filtered_requests_ids = array_keys($result);
     //get source address for my request
     $source_address = $request->sourceAddress;
     //get destination address for my request.
     $destination_address = $request->destinationAddress;
     //Get spatial distance from MySQL for source address
     $requests_by_source_distance = EntityAddress::getDistanceAmongRequestsByTimeFilteredIds($time_filtered_requests_ids, $source_address->lat, $source_address->lng, "source_address_id", $request_pickup_times_hash);
     $requests_by_destination_distance = EntityAddress::getDistanceAmongRequestsByTimeFilteredIds($time_filtered_requests_ids, $destination_address->lat, $destination_address->lng, "destination_address_id", $request_pickup_times_hash);
     $gdm_request_source = EntityAddress::getCSVForLatLong($source_address);
     $gdm_request_destination = EntityAddress::getCSVForLatLong($destination_address);
     $gdm_request_potential_source_matches = EntityAddress::getCSVForLatLong($requests_by_source_distance);
     $gdm_request_potential_destination_matches = EntityAddress::getCSVForLatLong($requests_by_destination_distance);
     $gdm_request_potential_source_matches = GoogleDistanceMatrixManager::get_distance_matrix($gdm_request_source, $gdm_request_potential_source_matches, Config::get('pm_constants.formats.array'));
     $gdm_request_potential_destination_matches = GoogleDistanceMatrixManager::get_distance_matrix($gdm_request_destination, $gdm_request_potential_destination_matches, Config::get('pm_constants.formats.array'));
     $api_response = PMRequest::formatAPIResponse($request, $source_address, $destination_address, $requests_by_source_distance, $requests_by_destination_distance, $gdm_request_potential_source_matches, $gdm_request_potential_destination_matches);
     return parent::ValidResponseHandler($api_response);
 }
Exemplo n.º 2
0
 /**
  *
  * @param Request $request User Request
  * @param $source_address User Request source address
  * @param $destination_address User Request destination address
  * @param array $source_spatial_data Estimates returned by MySQL spatial query for source matches
  * @param array $destination_spatial_data Estimates returned by MySQL spatial query for destination matches
  * @param $gdm_request_potential_source_matches array Estimates returned by Google Distance Matrix API Request for source matches
  * @param $gdm_request_potential_destination_matches array Estimates returned by Google Distance Matrix API Request for destination matches
  * @return array
  */
 public static function formatAPIResponse($request, $source_address, $destination_address, array $source_spatial_data, array $destination_spatial_data, $gdm_request_potential_source_matches, $gdm_request_potential_destination_matches)
 {
     $api_response = array();
     $source_address_matched_request_ids_map = array_flip(array_keys($source_spatial_data));
     $destination_address_matched_request_ids_map = array_flip(array_keys($destination_spatial_data));
     $ideal_matches = array();
     $api_response['request_id'] = $request->id;
     $api_response['pickup_time'] = RequestPickupTimes::formatPickUpTimesForAPI($request->requestPickupTimes->toArray());
     $api_response['request_source_address'] = $source_address->full_address_text;
     $api_response['request_destination_address'] = $destination_address->full_address_text;
     $source_matches = self::formatAddressForAPIResponse($source_spatial_data, $gdm_request_potential_source_matches, $ideal_matches);
     $destination_matches = self::formatAddressForAPIResponse($destination_spatial_data, $gdm_request_potential_destination_matches, $ideal_matches, $source_address_matched_request_ids_map);
     foreach ($ideal_matches as $index => $match_request_id) {
         $api_response['best_matches'][$index]['request_id'] = $match_request_id;
         $api_response['best_matches'][$index]['pickup_times'] = $source_spatial_data[$match_request_id]['request_pickup_times'];
         //This is really bad, need to change this
         $api_response['best_matches'][$index]['matched_source'] = $source_matches[$source_address_matched_request_ids_map[$match_request_id]];
         $api_response['best_matches'][$index]['matched_destination'] = $destination_matches[$destination_address_matched_request_ids_map[$match_request_id]];
     }
     return $api_response;
 }
Exemplo n.º 3
0
 /**
  * Store a newly created resource in storage.
  *
  * @param  Request  $request
  * @return Response
  */
 public function store(Request $request)
 {
     sleep(3);
     //id of the user who is making the request
     $requester_id = Auth::user()->id;
     //Validate the request.
     $this->validate($request, array('pick-up-location' => 'required', 'drop-off-location' => 'required', 'pick-up-time' => 'required', 'sourceAddressComponents.lat' => 'required|max:90|min:-90', 'destinationAddressComponents.lat' => 'required|max:90|min:-90', 'sourceAddressComponents.lng' => 'required|max:180|min:-180', 'destinationAddressComponents.lng' => 'required|max:180|min:-180', 'destinationAddressComponents.country' => 'required|max:180|min:-180'));
     $source_lat = $request->input('sourceAddressComponents.lat', 0);
     $source_lng = $request->input('sourceAddressComponents.lng', 0);
     $destination_lat = $request->input('destinationAddressComponents.lat', 0);
     $destination_lng = $request->input('destinationAddressComponents.lng', 0);
     //Store mapping of address get the id
     $source_address = EntityAddress::firstOrCreate(array('full_address_text' => $request->input('pick-up-location', ''), 'street_name' => $request->input('sourceAddressComponents.street_number', ''), 'route' => $request->input('sourceAddressComponents.route', ''), 'locality' => $request->input('sourceAddressComponents.locality', ''), 'neighborhood' => $request->input('sourceAddressComponents.neighborhood', ''), 'administrative_area_level_2' => $request->input('sourceAddressComponents.administrative_area_level_2', ''), 'administrative_area_level_1' => $request->input('sourceAddressComponents.administrative_area_level_1', ''), 'country' => $request->input('sourceAddressComponents.country', ''), 'postal_zip' => $request->input('sourceAddressComponents.postal_code', ''), 'geo_location' => DB::raw("(GeomFromText('POINT({$source_lat} {$source_lng})'))")));
     //Store mapping of destination address
     //if it already exists use that address id.
     $destination_address = EntityAddress::firstOrCreate(array('full_address_text' => $request->input('drop-off-location', ''), 'street_name' => $request->input('destinationAddressComponents.street_number', ''), 'route' => $request->input('destinationAddressComponents.route', ''), 'locality' => $request->input('destinationAddressComponents.locality', ''), 'neighborhood' => $request->input('destinationAddressComponents.neighborhood', ''), 'administrative_area_level_2' => $request->input('destinationAddressComponents.administrative_area_level_2', ''), 'administrative_area_level_1' => $request->input('destinationAddressComponents.administrative_area_level_1', ''), 'country' => $request->input('destinationAddressComponents.country', ''), 'postal_zip' => $request->input('destinationAddressComponents.postal_code', ''), 'geo_location' => DB::raw("(GeomFromText('POINT({$destination_lat} {$destination_lng})'))")));
     //get default status when request is created.
     $request_status_id = RequestStatuses::getDefaultRequestStatus();
     //Store the request.
     $pool_request = Requests::create(array('requester_id' => $requester_id, 'source_address_id' => $source_address->id, 'destination_address_id' => $destination_address->id, 'request_status_id' => $request_status_id));
     //get all values from pickup times table
     $pickup_times = PickupTimes::all()->toArray();
     $lookup_hash = array();
     foreach ($pickup_times as $index => $arr) {
         $lookup_hash[$arr['id']] = $arr['time_value'];
     }
     //Store the mapping of times
     $pickup_times = $request->input('pick-up-time');
     $request_pickup_time_array = array();
     foreach ($pickup_times as $index => $time) {
         $timestamp = time();
         if (isset($lookup_hash[$time + 1])) {
             $today_date = date('Y-m-d');
             $timestamp = $today_date . ' ' . $lookup_hash[$time + 1];
         }
         $request_pickup_time_array[] = array('request_id' => $pool_request->id, 'pickup_timestamp' => $timestamp);
     }
     RequestPickupTimes::insert($request_pickup_time_array);
 }