From bbe74b83bb66240f52ebf8852f7426a1ea599823 Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Wed, 24 Jun 2020 12:56:23 +0200 Subject: [PATCH] implemented search for tags feature backend --- backend/models/getRegions.js | 1 - backend/routes/search.js | 1 + backend/util/oldToNewQuerySyntax.js | 11 +++++++++ backend/util/scoreAndSearch.js | 36 ++++++++++++++++++++++++----- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/backend/models/getRegions.js b/backend/models/getRegions.js index d384158..70392c5 100644 --- a/backend/models/getRegions.js +++ b/backend/models/getRegions.js @@ -1,5 +1,4 @@ const arrayFormatting = require("../util/databaseArrayFormatting.js"); -const { takeRightWhile } = require("lodash"); const { allTagsWithValues } = require("./getTags.js"); module.exports = async (dbConn) => { diff --git a/backend/routes/search.js b/backend/routes/search.js index f0a77ad..1fa7bc6 100644 --- a/backend/routes/search.js +++ b/backend/routes/search.js @@ -152,6 +152,7 @@ function prepareQueries(queries) { // others if (queries.avg_price_relative) q.others.avg_price_relative = queries.avg_price_relative + if (queries.tags) q.others.tags = queries.tags return q } diff --git a/backend/util/oldToNewQuerySyntax.js b/backend/util/oldToNewQuerySyntax.js index 3b6c455..6b19c66 100644 --- a/backend/util/oldToNewQuerySyntax.js +++ b/backend/util/oldToNewQuerySyntax.js @@ -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.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.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'); // } catch (error) { // console.log('oldToNewQuerySyntax error'); diff --git a/backend/util/scoreAndSearch.js b/backend/util/scoreAndSearch.js index 978d2de..4b6aba8 100644 --- a/backend/util/scoreAndSearch.js +++ b/backend/util/scoreAndSearch.js @@ -24,6 +24,7 @@ const SETTINGS = { module.exports = async function (data, from, to, q) { console.log('search') + console.log(q) if ((_.isNil(to) || _.isNil(from)) && !(_.isEmpty(q.climate) || _.isEmpty(q.costs) || _.isEmpty(q.others))) { throw new Error('invalid query') } @@ -73,7 +74,7 @@ module.exports = async function (data, from, to, q) { // CALCULATE SCORES FOR PRICE PROPS 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) }); @@ -83,13 +84,18 @@ module.exports = async function (data, from, to, q) { let offSeasonScoreObj = calculateScoreForPeriod('avg_price_relative', travelPeriods, reg, q.others.avg_price_relative[0], q.others.avg_price_relative[1], boundaryStatic, 'easeOut', 2) 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 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_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)}€` // CALCULATE TOTAL PRICE WITH TRANSPORTATION @@ -100,11 +106,12 @@ module.exports = async function (data, from, to, q) { 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.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 // 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)) @@ -250,7 +257,24 @@ function calculateScoreForPeriod(type, travelPeriods, region, searchLowParam, se 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) const sc = _.round(scorer.calculateScoreRange(minMax.min[type], minMax.max[type], SETTINGS[type][0], region[type], searchLowParam, searchMaxParam), 3)