|
|
|
const query = require('pelias-query');
|
|
|
|
const vs = new query.Vars(require('../../../../query/search_defaults'));
|
|
|
|
const boost_sources_and_layers = require('../../../../query/view/boost_sources_and_layers');
|
|
|
|
|
|
|
|
module.exports.tests = {};
|
|
|
|
|
|
|
|
module.exports.tests.empty_config = function(test, common) {
|
|
|
|
test('empty configuration returns empty query', function(t) {
|
|
|
|
const view = boost_sources_and_layers({});
|
|
|
|
const rendered = view(vs);
|
|
|
|
t.equal(rendered, null, 'query is empty');
|
|
|
|
t.end();
|
|
|
|
});
|
|
|
|
|
|
|
|
test('undefined configuration returns empty query', function(t) {
|
|
|
|
const view = boost_sources_and_layers(undefined);
|
|
|
|
const rendered = view(vs);
|
|
|
|
t.equal(rendered, null, 'query is empty');
|
|
|
|
t.end();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.tests.single_item_config = function(test, common) {
|
|
|
|
test('config with single layer entry produces a single scoring function with weight', function(t) {
|
|
|
|
const config = {
|
|
|
|
layer: {
|
|
|
|
locality: 5
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const expected_query = {
|
|
|
|
'function_score': {
|
|
|
|
'query': {
|
|
|
|
'match_all': {}
|
|
|
|
},
|
|
|
|
'functions': [{
|
|
|
|
'filter': {
|
|
|
|
'match': {
|
|
|
|
'layer': 'locality'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'weight': 5
|
|
|
|
}],
|
|
|
|
'boost': vs.var('custom:boosting:boost'),
|
|
|
|
'max_boost': vs.var('custom:boosting:max_boost'),
|
|
|
|
'score_mode': vs.var('custom:boosting:score_mode'),
|
|
|
|
'boost_mode': vs.var('custom:boosting:boost_mode'),
|
|
|
|
'min_score': vs.var('custom:boosting:min_score')
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const view = boost_sources_and_layers(config);
|
|
|
|
|
|
|
|
t.deepEquals(view(vs), expected_query, 'query contains a single scoring function');
|
|
|
|
t.end();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.tests.mulitple_item_config = function(test, common) {
|
|
|
|
test('config with multiple items produces multiple scoring functions', function(t) {
|
|
|
|
const config = {
|
|
|
|
source: {
|
|
|
|
whosonfirst: 6
|
|
|
|
},
|
|
|
|
layer: {
|
|
|
|
country: 2,
|
|
|
|
borough: 0.5
|
|
|
|
},
|
|
|
|
};
|
|
|
|
const expected_query = {
|
|
|
|
'function_score': {
|
|
|
|
'query': {
|
|
|
|
'match_all': {}
|
|
|
|
},
|
|
|
|
'functions': [{
|
|
|
|
'filter': {
|
|
|
|
'match': {
|
|
|
|
'source': 'whosonfirst'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'weight': 6
|
|
|
|
},{
|
|
|
|
'filter': {
|
|
|
|
'match': {
|
|
|
|
'layer': 'country'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'weight': 2
|
|
|
|
},{
|
|
|
|
'filter': {
|
|
|
|
'match': {
|
|
|
|
'layer': 'borough'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'weight': 0.5
|
|
|
|
}],
|
|
|
|
'boost': vs.var('custom:boosting:boost'),
|
|
|
|
'max_boost': vs.var('custom:boosting:max_boost'),
|
|
|
|
'score_mode': vs.var('custom:boosting:score_mode'),
|
|
|
|
'boost_mode': vs.var('custom:boosting:boost_mode'),
|
|
|
|
'min_score': vs.var('custom:boosting:min_score')
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const view = boost_sources_and_layers(config);
|
|
|
|
|
|
|
|
t.deepEquals(view(vs), expected_query, 'query contains multiple scoring functions');
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.all = function (tape, common) {
|
|
|
|
function test(name, testFunction) {
|
|
|
|
return tape('boost sources and layers ' + name, testFunction);
|
|
|
|
}
|
|
|
|
|
|
|
|
for( var testCase in module.exports.tests ){
|
|
|
|
module.exports.tests[testCase](test, common);
|
|
|
|
}
|
|
|
|
};
|