-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSearch.js
88 lines (68 loc) · 2.63 KB
/
Search.js
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
86
87
88
let aService = rootRequire('src/aService');
class Search extends aService {
constructor(params) {
super(params);
this.EARTH_RADIUS = 6378.388;
this._params.latitude = this._params.latitude || undefined;
this._params.longitude = this._params.longitude || undefined;
}
_execute(callback) {
let self = this;
self._params.db.connect();
let query = 'SELECT * FROM v_beergarden_list';
self._params.db.query('SELECT * FROM v_beergarden_list', (data, error) => {
if (!error) {
// calculate distance
if (self._params.latitude && self._params.longitude) {
for (var row in data) {
data[row].distance = self._getDistance(data[row].latitude, data[row].longitude);
}
};
// filter data
if (self._params.filter) {
data = data.filter(self._filterRadius.bind(self));
if (self._params.filter.limit && self._params.filter.limit > 0) {
data = data.slice(0, parseInt(self._params.filter.limit));
}
}
// sort data
if (self._params.sort) {
// sort the hell here
}
else {
if (self._params.latitude && self._params.longitude) {
data.sort(function (a, b) {
return a.distance - b.distance;
});
}
}
callback(data);
}
else {
self._lastError = error;
callback(false);
}
});
self._params.db.disconnect();
}
_getDistance (lat, lng, accuracy) {
let self = this;
let lat1 = (2*Math.PI / 360) * self._params.latitude;
let lng1 = (2*Math.PI / 360) * self._params.longitude;
let lat2 = (2*Math.PI / 360) * lat;
let lng2 = (2*Math.PI / 360) * lng;
let latProd = Math.sin(lat1) * Math.sin(lat2);
let lngProd = Math.cos(lat1) * Math.cos(lat2) * Math.cos(lng1 - lng2);
let acc = accuracy ? Math.pow(10, accuracy) : 10;
let distance = self.EARTH_RADIUS * Math.acos(latProd + lngProd);
return Math.round(distance * acc) / acc;
}
_filterRadius (item) {
var self = this;
if (self._params.filter.radius && item.distance) {
return self._params.filter.radius > item.distance;
}
return true;
}
};
module.exports = exports = Search;