Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add multi-query search
  • Loading branch information
GuillaumeGomez committed Apr 14, 2018
1 parent fb730d7 commit 47a9ffa
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 9 deletions.
77 changes: 70 additions & 7 deletions src/librustdoc/html/static/main.js
Expand Up @@ -1299,14 +1299,78 @@
printTab(currentTab);
}

function execSearch(query, searchWords) {
var queries = query.raw.split(",");
var results = {
'in_args': [],
'returned': [],
'others': [],
};

for (var i = 0; i < queries.length; ++i) {
var query = queries[i].trim();
if (query.length !== 0) {
var tmp = execQuery(getQuery(query), searchWords);

results['in_args'].push(tmp['in_args']);
results['returned'].push(tmp['returned']);
results['others'].push(tmp['others']);
}
}
if (queries.length > 1) {
function getSmallest(arrays, positions) {
var start = null;

for (var it = 0; it < positions.length; ++it) {
if (arrays[it].length > positions[it] &&
(start === null || start > arrays[it][positions[it]].lev)) {
start = arrays[it][positions[it]].lev;
}
}
return start;
}

function mergeArrays(arrays) {
var ret = [];
var positions = [];

for (var x = 0; x < arrays.length; ++x) {
positions.push(0);
}
while (ret.length < MAX_RESULTS) {
var smallest = getSmallest(arrays, positions);
if (smallest === null) {
break;
}
for (x = 0; x < arrays.length && ret.length < MAX_RESULTS; ++x) {
if (arrays[x].length > positions[x] &&
arrays[x][positions[x]].lev === smallest) {
ret.push(arrays[x][positions[x]]);
positions[x] += 1;
}
}
}
return ret;
}

return {
'in_args': mergeArrays(results['in_args']),
'returned': mergeArrays(results['returned']),
'others': mergeArrays(results['others']),
};
} else {
return {
'in_args': results['in_args'][0],
'returned': results['returned'][0],
'others': results['others'][0],
};
}
}

function search(e) {
var query,
obj, i, len,
results = {"in_args": [], "returned": [], "others": []},
resultIndex;
var params = getQueryStringParams();
var query = getQuery(document.getElementsByClassName('search-input')[0].value);

query = getQuery(document.getElementsByClassName('search-input')[0].value);
if (e) {
e.preventDefault();
}
Expand All @@ -1328,8 +1392,7 @@
}
}

results = execQuery(query, index);
showResults(results);
showResults(execSearch(query, index));
}

function buildIndex(rawSearchIndex) {
Expand Down
20 changes: 20 additions & 0 deletions src/test/rustdoc-js/multi-query.js
@@ -0,0 +1,20 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

const QUERY = 'str,u8';

const EXPECTED = {
'others': [
{ 'path': 'std', 'name': 'str' },
{ 'path': 'std', 'name': 'u8' },
{ 'path': 'std::ffi', 'name': 'CStr' },
{ 'path': 'std::simd', 'name': 'u8x2' },
],
};
5 changes: 3 additions & 2 deletions src/tools/rustdoc-js/tester.js
Expand Up @@ -157,7 +157,8 @@ function main(argv) {
// execQuery first parameter is built in getQuery (which takes in the search input).
// execQuery last parameter is built in buildIndex.
// buildIndex requires the hashmap from search-index.
var functionsToLoad = ["levenshtein", "validateResult", "getQuery", "buildIndex", "execQuery"];
var functionsToLoad = ["levenshtein", "validateResult", "getQuery", "buildIndex", "execQuery",
"execSearch"];

finalJS += 'window = { "currentCrate": "std" };\n';
finalJS += loadThings(arraysToLoad, 'array', extractArrayVariable, mainJs);
Expand All @@ -174,7 +175,7 @@ function main(argv) {
'exports.QUERY = QUERY;exports.EXPECTED = EXPECTED;');
const expected = loadedFile.EXPECTED;
const query = loadedFile.QUERY;
var results = loaded.execQuery(loaded.getQuery(query), index);
var results = loaded.execSearch(loaded.getQuery(query), index);
process.stdout.write('Checking "' + file + '" ... ');
var error_text = [];
for (var key in expected) {
Expand Down

0 comments on commit 47a9ffa

Please sign in to comment.