-
Notifications
You must be signed in to change notification settings - Fork 7
/
HotelController.php
85 lines (72 loc) · 2.89 KB
/
HotelController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use \CouchbaseSearchQuery as SearchQuery;
class HotelController extends CouchbaseController
{
public function find(Request $request)
{
return response()->json(["data" => $this->findHotels()]);
}
public function findByDescription(Request $request, $description)
{
return response()->json(["data" => $this->findHotels($description)]);
}
public function findByDescriptionLocation(Request $request, $description, $location)
{
return response()->json(["data" => $this->findHotels($description, $location)]);
}
/**
* Performs full-text search for given criteria.
*
* If neither of criteria specified (or set to "*"), this function lists all hotels in the search index.
* Note that in any case the number of results is limited to 100 entries.
*
* @param string $description text to match in 'description' and 'name' fields of the hotel
* @param string $location text to match in 'country', 'city', 'state' and 'address' fields of the hotel
*
* @return array list of the arrays, with 'address', 'name' and 'description' fields filled in
*/
protected function findHotels($description = "", $location = "") {
$queryBody = SearchQuery::conjuncts(SearchQuery::term("hotel")->field("type"));
if (!empty($location) && $location != "*") {
$queryBody->every(SearchQuery::disjuncts(
SearchQuery::match($location)->field("country"),
SearchQuery::match($location)->field("city"),
SearchQuery::match($location)->field("state"),
SearchQuery::match($location)->field("address")
));
}
if (!empty($description) && $description != "*") {
$queryBody->every(SearchQuery::disjuncts(
SearchQuery::match($description)->field("description"),
SearchQuery::match($description)->field("name")
));
}
$query = new SearchQuery("hotels", $queryBody);
$query->limit(100);
$result = $this->db->query($query);
$response = array();
foreach($result->hits as $hit) {
$info = $this->db->lookupIn($hit->id)
->get("country")
->get("city")
->get("state")
->get("address")
->get("name")
->get("description")
->execute();
$response[] = [
"address" => join(',', [
$info->value[3]["value"],
$info->value[2]["value"],
$info->value[1]["value"],
$info->value[0]["value"]
]),
"name" => $info->value[4]["value"],
"description" => $info->value[5]["value"]
];
}
return $response;
}
}