Mariadb-Developer-Examples/bookings/src/routes/flightsRoutes.js

129 wiersze
4.5 KiB
JavaScript

"use strict";
let express = require("express"),
router = express.Router(),
pool = require('../db');
router.get("/", async (req, res, next) => {
let date = new Date(req.query.dt);
let origin = req.query.o;
let dest = req.query.d;
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
// ignore time offsets
let formattedDate = formatDate(year,month,day);
//let formattedDate = date;
let conn;
try {
conn = await pool.getConnection();
var query = "select \
a.airline, \
t.carrier airline_code, \
t.origin, \
t.dest, \
t.price, \
a.`airline`, \
f.dep_time, \
f.arr_time, \
fh.avg_delay, \
(select avg(arr_time - dep_time) from columnstore_schema.flights \
where month = ? and day = ? and origin = ? and dest = ? and carrier = t.carrier and year >= 2014) avg_duration, \
fh.delayed_pct, \
fh.cancelled_pct \
from \
innodb_schema.tickets t, \
(select * from innodb_schema.flights where year = ? and month = ? and day = ?) f, \
(select \
a.avg_delay, \
round(100 * (a.`delayed` / a.volume), 2) delayed_pct, \
round(100 * (a.cancelled / a.volume), 2) cancelled_pct, \
a.carrier \
from \
(select \
count(*) volume, \
sum(case when dep_delay > 0 then 1 else 0 end) `delayed`, \
sum(cancelled) cancelled, \
avg(dep_delay) avg_delay, \
carrier \
from \
columnstore_schema.flights \
where \
year >= 2014 and \
month = ? and day = ? and origin = ? and dest = ? group by carrier) a) fh, \
innodb_schema.airlines a \
where \
t.carrier = f.carrier and \
t.fl_date = f.fl_date and \
t.fl_num = f.fl_num and \
t.carrier = fh.carrier and \
f.carrier = a.iata_code and \
t.fl_date = ? and \
t.origin = ? and \
t.dest = ?";
var results = await conn.query(query, [month,day,origin,dest,year,month,day,month,day,origin,dest,formattedDate,origin,dest]);
if (results.length > 0) {
var analyzedResults = analyzeResults(results);
res.send(analyzedResults);
}
else {
res.send(results);
}
} catch (err) {
console.log(err);
throw err;
} finally {
if (conn) return conn.release();
}
});
function formatDate(year,month,day) {
if (month.length < 2)
month = '0' + month;
if (day.length < 2)
day = '0' + day;
return [year, month, day].join('-');
}
// secret (scoring) sauce
function analyzeResults(items) {
let prices = items.map(item => item.price)
let average_price = getAverage(prices);
items.forEach(item => {
let price_score = round(3.5 * (average_price / item.price), 1);
let delay_score = round(5 * ((100 - item.delayed_pct)/100), 1);
let cancel_score = round(5 * ((100 - item.cancelled_pct)/100), 1);
let overall_score = round((price_score + delay_score + cancel_score) / 3, 1);
item.assessment = {
overall_score: overall_score,
price_score: price_score,
delay_score: delay_score,
delay_percentage: item.delayed_pct,
cancel_score: cancel_score,
cancel_percentage: item.cancelled_pct
};
});
return items;
}
function getAverage(arr) {
let reducer = (total, currentValue) => total + currentValue;
let sum = arr.reduce(reducer)
return sum / arr.length;
}
function round(value, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(value * multiplier) / multiplier;
}
module.exports = router;