implemented search for tags feature backend
This commit is contained in:
parent
e0f8f5490e
commit
bbe74b83bb
@ -1,5 +1,4 @@
|
|||||||
const arrayFormatting = require("../util/databaseArrayFormatting.js");
|
const arrayFormatting = require("../util/databaseArrayFormatting.js");
|
||||||
const { takeRightWhile } = require("lodash");
|
|
||||||
const { allTagsWithValues } = require("./getTags.js");
|
const { allTagsWithValues } = require("./getTags.js");
|
||||||
|
|
||||||
module.exports = async (dbConn) => {
|
module.exports = async (dbConn) => {
|
||||||
|
|||||||
@ -152,6 +152,7 @@ function prepareQueries(queries) {
|
|||||||
|
|
||||||
// others
|
// others
|
||||||
if (queries.avg_price_relative) q.others.avg_price_relative = queries.avg_price_relative
|
if (queries.avg_price_relative) q.others.avg_price_relative = queries.avg_price_relative
|
||||||
|
if (queries.tags) q.others.tags = queries.tags
|
||||||
|
|
||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,7 +17,18 @@ module.exports = function (queries) {
|
|||||||
if (queries.local_transportation_costs) res.local_transportation_costs = [Number(queries.local_transportation_costs.split(',')[0]), Number(queries.local_transportation_costs.split(',')[1])]
|
if (queries.local_transportation_costs) res.local_transportation_costs = [Number(queries.local_transportation_costs.split(',')[0]), Number(queries.local_transportation_costs.split(',')[1])]
|
||||||
if (queries.entertainment_costs) res.entertainment_costs = [Number(queries.entertainment_costs.split(',')[0]), Number(queries.entertainment_costs.split(',')[1])]
|
if (queries.entertainment_costs) res.entertainment_costs = [Number(queries.entertainment_costs.split(',')[0]), Number(queries.entertainment_costs.split(',')[1])]
|
||||||
if (queries.average_per_day_costs) res.average_per_day_costs = [Number(queries.average_per_day_costs.split(',')[0]), Number(queries.average_per_day_costs.split(',')[1])]
|
if (queries.average_per_day_costs) res.average_per_day_costs = [Number(queries.average_per_day_costs.split(',')[0]), Number(queries.average_per_day_costs.split(',')[1])]
|
||||||
|
|
||||||
if (queries.avg_price_relative) res.avg_price_relative = [Number(queries.avg_price_relative.split(',')[0]), Number(queries.avg_price_relative.split(',')[1])]
|
if (queries.avg_price_relative) res.avg_price_relative = [Number(queries.avg_price_relative.split(',')[0]), Number(queries.avg_price_relative.split(',')[1])]
|
||||||
|
if (queries.tags) {
|
||||||
|
res.tags = []
|
||||||
|
if (queries.tags.includes(',')) {
|
||||||
|
res.tags.push(...queries.tags.split(',').map(el => el.trim()))
|
||||||
|
} else {
|
||||||
|
res.tags.push(queries.tags)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// console.log(res);
|
||||||
|
|
||||||
// console.log('queries successfully transformed');
|
// console.log('queries successfully transformed');
|
||||||
// } catch (error) {
|
// } catch (error) {
|
||||||
// console.log('oldToNewQuerySyntax error');
|
// console.log('oldToNewQuerySyntax error');
|
||||||
|
|||||||
@ -24,6 +24,7 @@ const SETTINGS = {
|
|||||||
|
|
||||||
module.exports = async function (data, from, to, q) {
|
module.exports = async function (data, from, to, q) {
|
||||||
console.log('search')
|
console.log('search')
|
||||||
|
console.log(q)
|
||||||
if ((_.isNil(to) || _.isNil(from)) && !(_.isEmpty(q.climate) || _.isEmpty(q.costs) || _.isEmpty(q.others))) {
|
if ((_.isNil(to) || _.isNil(from)) && !(_.isEmpty(q.climate) || _.isEmpty(q.costs) || _.isEmpty(q.others))) {
|
||||||
throw new Error('invalid query')
|
throw new Error('invalid query')
|
||||||
}
|
}
|
||||||
@ -73,7 +74,7 @@ module.exports = async function (data, from, to, q) {
|
|||||||
|
|
||||||
// CALCULATE SCORES FOR PRICE PROPS
|
// CALCULATE SCORES FOR PRICE PROPS
|
||||||
Object.entries(q.costs).forEach(([key, value]) => {
|
Object.entries(q.costs).forEach(([key, value]) => {
|
||||||
let finalScoreObj = calculateSimpleScore(key, reg, value[0], value[1], boundaryStatic)
|
let finalScoreObj = scoreFromSimpleRegionProperty(key, reg, value[0], value[1], boundaryStatic)
|
||||||
|
|
||||||
reg.scores.push(finalScoreObj)
|
reg.scores.push(finalScoreObj)
|
||||||
});
|
});
|
||||||
@ -84,12 +85,17 @@ module.exports = async function (data, from, to, q) {
|
|||||||
reg.scores.push(offSeasonScoreObj)
|
reg.scores.push(offSeasonScoreObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CALCULATE SCORE FOR TAGS
|
||||||
|
if (_.has(q, 'others.tags')) {
|
||||||
|
reg.scores.push(...scoresFromTags(reg.tags, q.others.tags))
|
||||||
|
}
|
||||||
|
|
||||||
// CALCULATE PRICE TENDENCY FOR TIMEFRAME
|
// CALCULATE PRICE TENDENCY FOR TIMEFRAME
|
||||||
reg.price_tendency_relative = getAverageFromTrivago(travelPeriods, reg)
|
reg.price_tendency_relative = getAverageFromTrivago(travelPeriods, reg)
|
||||||
|
|
||||||
// CALCULATE SUM FOR ACCOMODATION FROM AVERAGE PRICES
|
// CALCULATE SUM FOR ACCOMODATION FROM AVERAGE PRICES AND APPROX LIFESTYLE COSTS
|
||||||
reg.total_accommodation_costs = _.round(sumForRangeAvg(dates.from, dates.to, reg.accommodation_costs), 2)
|
reg.total_accommodation_costs = _.round(sumForRangeAvg(dates.from, dates.to, reg.accommodation_costs), 2)
|
||||||
//reg.total_avg_lifestyle = _.round(sumForRangeAvg(dates.from, dates.to, reg.average_per_day_costs - reg.accommodation_costs), 2)
|
reg.total_avg_lifestyle = _.round(sumForRangeAvg(dates.from, dates.to, reg.average_per_day_costs - reg.accommodation_costs), 2)
|
||||||
//reg.name = `${reg.name} ca. ${_.round(sumForRangeAvg(dates.from, dates.to, reg.accommodation_costs), 2)}€`
|
//reg.name = `${reg.name} ca. ${_.round(sumForRangeAvg(dates.from, dates.to, reg.accommodation_costs), 2)}€`
|
||||||
|
|
||||||
// CALCULATE TOTAL PRICE WITH TRANSPORTATION
|
// CALCULATE TOTAL PRICE WITH TRANSPORTATION
|
||||||
@ -100,11 +106,12 @@ module.exports = async function (data, from, to, q) {
|
|||||||
let scoreSubGroups = []
|
let scoreSubGroups = []
|
||||||
if (!_.isEmpty(q.climate)) scoreSubGroups.push(calculateAverage(reg.scores.filter(el => _.some(Object.keys(q.climate), entry => entry === el.type ) )) )
|
if (!_.isEmpty(q.climate)) scoreSubGroups.push(calculateAverage(reg.scores.filter(el => _.some(Object.keys(q.climate), entry => entry === el.type ) )) )
|
||||||
if (!_.isEmpty(q.costs)) scoreSubGroups.push(calculateAverage(reg.scores.filter(el => _.some(Object.keys(q.costs), entry => entry === el.type ))) )
|
if (!_.isEmpty(q.costs)) scoreSubGroups.push(calculateAverage(reg.scores.filter(el => _.some(Object.keys(q.costs), entry => entry === el.type ))) )
|
||||||
if (!_.isEmpty(q.others)) scoreSubGroups.push(calculateAverage(reg.scores.filter(el => _.some(Object.keys(q.others), entry => entry === el.type ) )) )
|
if (!_.isEmpty(q.others.avg_price_relative)) scoreSubGroups.push(calculateAverage(reg.scores.filter(el => 'avg_price_relative' === el.type ) ))
|
||||||
|
if (!_.isEmpty(q.others.tags)) scoreSubGroups.push(calculateAverage(reg.scores.filter(el => _.some(q.others.tags, entry => entry === el.type ))) )
|
||||||
|
|
||||||
// CALCULATE AVERAGE SCORE Stage 2
|
// CALCULATE AVERAGE SCORE Stage 2
|
||||||
// reg.score = calculateAverage(reg.scores)
|
// reg.score = calculateAverage(reg.scores)
|
||||||
reg.score = _.sum(scoreSubGroups) / scoreSubGroups.length
|
reg.score = _.round(_.sum(scoreSubGroups) / scoreSubGroups.length, 3)
|
||||||
|
|
||||||
})
|
})
|
||||||
return _.orderBy(regionsArr, ({ score }) => score || 0, 'desc') //.filter(el => !_.isNaN(el.score))
|
return _.orderBy(regionsArr, ({ score }) => score || 0, 'desc') //.filter(el => !_.isNaN(el.score))
|
||||||
@ -250,7 +257,24 @@ function calculateScoreForPeriod(type, travelPeriods, region, searchLowParam, se
|
|||||||
return averagedScore
|
return averagedScore
|
||||||
}
|
}
|
||||||
|
|
||||||
function calculateSimpleScore(type, region, searchLowParam, searchMaxParam, minMax) {
|
function scoresFromTags(regionTags, tagStringsFromQueries) {
|
||||||
|
return tagStringsFromQueries.map(tagQuery => {
|
||||||
|
const tag = regionTags.find(tag => tagQuery === tag.name)
|
||||||
|
let retVal = {
|
||||||
|
type: tagQuery,
|
||||||
|
value: null,
|
||||||
|
score: null,
|
||||||
|
}
|
||||||
|
if (_.isNil(tag)) return retVal
|
||||||
|
retVal.value = tag.value
|
||||||
|
retVal.score = /* tag.value <= 0 ? 0 : */ _.round(scorer.calculateScoreRange(40, 100, 1, tag.value, 100, 100), 3)
|
||||||
|
console.log(retVal);
|
||||||
|
|
||||||
|
return retVal
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function scoreFromSimpleRegionProperty(type, region, searchLowParam, searchMaxParam, minMax) {
|
||||||
// console.log('getScoreFromCosts for', region.name, type)
|
// console.log('getScoreFromCosts for', region.name, type)
|
||||||
const sc = _.round(scorer.calculateScoreRange(minMax.min[type], minMax.max[type], SETTINGS[type][0], region[type], searchLowParam, searchMaxParam), 3)
|
const sc = _.round(scorer.calculateScoreRange(minMax.min[type], minMax.max[type], SETTINGS[type][0], region[type], searchLowParam, searchMaxParam), 3)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user